From 97ba776d483a71f52ddc9deafd464f9d5686986c Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 00:35:06 -0400 Subject: [PATCH 001/251] Added constants.yaml --- firebase/firestore/constants.yaml | 11 +++++++++++ firebase/firestore/lib/constants.dart | 21 ++++++++++++++------- firebase/firestore/lib/src/helpers/dir.dart | 2 ++ firebase/firestore/pubspec.yaml | 1 + 4 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 firebase/firestore/constants.yaml diff --git a/firebase/firestore/constants.yaml b/firebase/firestore/constants.yaml new file mode 100644 index 000000000..1465dccd4 --- /dev/null +++ b/firebase/firestore/constants.yaml @@ -0,0 +1,11 @@ +dayNames: + - "Monday" + - "Tuesday" + - "Wednesday" + - "Thursday" + - "Friday" + +corruptStudents: + - "724703" + - "722601" + - "723397" \ No newline at end of file diff --git a/firebase/firestore/lib/constants.dart b/firebase/firestore/lib/constants.dart index a441e8d6b..cb5fa702f 100644 --- a/firebase/firestore/lib/constants.dart +++ b/firebase/firestore/lib/constants.dart @@ -1,7 +1,14 @@ -final Set dayNames = { - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday" -}; \ No newline at end of file +import "package:yaml/yaml.dart"; + +import "package:firestore/helpers.dart"; +import "package:node_io/node_io.dart"; + +final File file = File(DataFiles.constants); + +final YamlMap yamlContents = loadYaml(file.readAsStringSync()); + +final Set dayNames = Set.from(yamlContents ["dayNames"]); + +final Set corruptStudents = Set.from(yamlContents ["corruptStudents"]); + +final bool isSemester1 = DateTime.now().month > 7; \ No newline at end of file diff --git a/firebase/firestore/lib/src/helpers/dir.dart b/firebase/firestore/lib/src/helpers/dir.dart index 1ebac3c8c..b224c41dc 100644 --- a/firebase/firestore/lib/src/helpers/dir.dart +++ b/firebase/firestore/lib/src/helpers/dir.dart @@ -49,6 +49,8 @@ class DataFiles { /// Each row should be the name of the admin, followed by a list of scopes. static final String admins = "${dataDir.path}\\admins.csv"; + static final String constants = "${projectDir.path}\\constants.yaml"; + /// Returns the path for the calendar at a given month. /// /// The month should follow 1-based indexing. diff --git a/firebase/firestore/pubspec.yaml b/firebase/firestore/pubspec.yaml index dbbcb50a1..42e45dab3 100644 --- a/firebase/firestore/pubspec.yaml +++ b/firebase/firestore/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: build_runner: any build_node_compilers: any node_interop: any + yaml: any # dev_dependencies: # test: ^1.6.0 From 1a64a4e29815de41ace2c6381acfd8f033841268 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 00:36:15 -0400 Subject: [PATCH 002/251] Ignore students in constants.corruptStudents --- firebase/firestore/lib/src/students/reader.dart | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/firebase/firestore/lib/src/students/reader.dart b/firebase/firestore/lib/src/students/reader.dart index 42b721678..e00ec33d1 100644 --- a/firebase/firestore/lib/src/students/reader.dart +++ b/firebase/firestore/lib/src/students/reader.dart @@ -1,3 +1,4 @@ +import "package:firestore/constants.dart"; import "package:firestore/data.dart"; import "package:firestore/helpers.dart"; @@ -13,12 +14,13 @@ class StudentReader { /// Maps student IDs to their respective [User] objects. static Future> getStudents() async => { await for (final Map entry in csvReader(DataFiles.students)) - entry ["ID"]: User( - first: entry ["First Name"], - last: entry ["Last Name"], - email: entry ["Student E-mail"].toLowerCase(), - id: entry ["ID"], - ) + if (!corruptStudents.contains(entry ["ID"])) + entry ["ID"]: User( + first: entry ["First Name"], + last: entry ["Last Name"], + email: entry ["Student E-mail"].toLowerCase(), + id: entry ["ID"], + ) }; /// Maps homeroom section IDs to their respective rooms. @@ -63,6 +65,9 @@ class StudentReader { static Future>> getStudentClasses() async { final Map> result = DefaultMap((_) => []); await for (final Map entry in csvReader(DataFiles.schedule)) { + if (corruptStudents.contains(entry ["STUDENT_ID"])) { + continue; + } result [entry ["STUDENT_ID"]].add(entry ["SECTION_ID"]); } return result; From aee474378ee4a188601317dcc283c49207057ffe Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 00:37:16 -0400 Subject: [PATCH 003/251] Auto-detect semester based on current date --- firebase/firestore/lib/src/students/logic.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/firebase/firestore/lib/src/students/logic.dart b/firebase/firestore/lib/src/students/logic.dart index bb538d90b..ad7fd3156 100644 --- a/firebase/firestore/lib/src/students/logic.dart +++ b/firebase/firestore/lib/src/students/logic.dart @@ -63,7 +63,13 @@ class StudentLogic { continue; } - if (semesters != null && !semesters [sectionId].semester2) { + if ( + semesters != null && + !(isSemester1 + ? semesters [sectionId].semester1 + : semesters [sectionId].semester2 + ) + ) { continue; } else if (sectionId.startsWith("12")) { seniors.add(student); From cc24f39e96e690d061f66369e9d938f6c5c3a65d Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 00:37:38 -0400 Subject: [PATCH 004/251] Logged seniors --- firebase/firestore/node/students.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/firebase/firestore/node/students.dart b/firebase/firestore/node/students.dart index ad1198c1c..c4e4c4e37 100644 --- a/firebase/firestore/node/students.dart +++ b/firebase/firestore/node/students.dart @@ -41,6 +41,8 @@ Future main() async { final Map homerooms = StudentLogic.homerooms; Logger.debug("Homerooms", homerooms); + Logger.debug("Seniors", StudentLogic.seniors); + final List studentsWithSchedules = await Logger.logValue( "student schedules", () => StudentLogic.getStudentsWithSchedules( schedules: schedules, From 2723a6d6f678858907e542af2e4f98f0f075f052 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 00:39:25 -0400 Subject: [PATCH 005/251] Fixed SportsGame serialization bug --- lib/src/data/sports.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/data/sports.dart b/lib/src/data/sports.dart index 868c25962..6c54706e9 100644 --- a/lib/src/data/sports.dart +++ b/lib/src/data/sports.dart @@ -182,7 +182,7 @@ class SportsGame { /// - a "scores" field. See [Scores.fromJson] for format. SportsGame.fromJson(Map json) : sport = stringToSport [json ["sport"]], - date = DateTime.fromMicrosecondsSinceEpoch(json ["date"]), + date = DateTime.parse(json ["date"]), times = Range.fromJson(json ["times"]), team = json ["team"], home = json ["home"], @@ -211,7 +211,7 @@ class SportsGame { /// return an equivalent object. Map toJson() => { "sport": sportToString [sport], - "date": date, + "date": date.toString(), "times": times.toJson(), "team": team, "home": home, From 9b3be2541b5fa4f78762a38502fcfde1472acf65 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 01:26:32 -0400 Subject: [PATCH 006/251] Removed Letters from Data library --- lib/src/data/reminder.dart | 40 +++++----- lib/src/data/schedule.dart | 158 +++++++------------------------------ lib/src/data/student.dart | 38 +++------ 3 files changed, 59 insertions(+), 177 deletions(-) diff --git a/lib/src/data/reminder.dart b/lib/src/data/reminder.dart index fce635d1b..7ea3ac553 100644 --- a/lib/src/data/reminder.dart +++ b/lib/src/data/reminder.dart @@ -9,11 +9,9 @@ library reminder_dataclasses; import "dart:convert" show JsonUnsupportedObjectError; import "package:flutter/foundation.dart" show required, immutable; -import "schedule.dart"; - /// An enum to decide when the reminder should appear. /// -/// `period` means the reminder needs a [Letters] and a period (as [String]) +/// `period` means the reminder needs a Day name and a period (as [String]) /// `subject` means the reminder needs a name of a class. enum ReminderTimeType { /// Whether the reminder should be displayed on a specific period. @@ -86,7 +84,7 @@ abstract class ReminderTime { /// such as a UI reminder builder. factory ReminderTime.fromType({ @required ReminderTimeType type, - @required Letters letter, + @required String dayName, @required String period, @required String name, @required bool repeats, @@ -94,7 +92,7 @@ abstract class ReminderTime { switch (type) { case ReminderTimeType.period: return PeriodReminderTime( period: period, - letter: letter, + dayName: dayName, repeats: repeats, ); case ReminderTimeType.subject: return SubjectReminderTime( name: name, @@ -110,7 +108,7 @@ abstract class ReminderTime { /// /// All possible parameters are required. bool doesApply({ - @required Letters letter, + @required String dayName, @required String subject, @required String period, }); @@ -122,11 +120,11 @@ abstract class ReminderTime { String toString(); } -/// A [ReminderTime] that depends on a [Letters] and period. +/// A [ReminderTime] that depends on a name and period. @immutable class PeriodReminderTime extends ReminderTime { - /// The [Letters] for when this [Reminder] should be displayed. - final Letters letter; + /// The day for when this [Reminder] should be displayed. + final String dayName; /// The period when this [Reminder] should be displayed. final String period; @@ -135,41 +133,41 @@ class PeriodReminderTime extends ReminderTime { /// /// All parameters must be non-null. const PeriodReminderTime({ - @required this.letter, + @required this.dayName, @required this.period, @required bool repeats }) : super (repeats: repeats, type: ReminderTimeType.period); /// Creates a new [ReminderTime] from JSON. /// - /// `json ["letter"]` should be one of the [Letters]. + /// `json ["dayName"]` should be one of the valid names. /// - /// `json ["period"]` should be a valid period for that letter, + /// `json ["period"]` should be a valid period for that day, /// notwithstanding any schedule changes (like an "early dismissal"). PeriodReminderTime.fromJson(Map json) : - letter = stringToLetters [json ["letter"]], + dayName = json ["dayName"], period = json ["period"], super (repeats: json ["repeats"], type: ReminderTimeType.period); @override String toString() => - "${repeats ? 'Repeats every ' : ''}${lettersToString [letter]}-$period"; + "${repeats ? 'Repeats every ' : ''}$dayName-$period"; @override Map toJson() => { - "letter": lettersToString [letter], + "name": dayName, "period": period, "repeats": repeats, "type": reminderTimeToString [type], }; - /// Returns true if [letter] and [period] match this instance's fields. + /// Returns true if [dayName] and [period] match this instance's fields. @override bool doesApply({ - @required Letters letter, + @required String dayName, @required String subject, @required String period, - }) => letter == this.letter && period == this.period; + }) => dayName == this.dayName && period == this.period; } /// A [ReminderTime] that depends on a subject. @@ -205,7 +203,7 @@ class SubjectReminderTime extends ReminderTime { /// matches the `subject` parameter. @override bool doesApply({ - @required Letters letter, + @required String dayName, @required String subject, @required String period, }) => subject == name; @@ -220,13 +218,13 @@ class Reminder { /// This function delegates logic to [ReminderTime.doesApply] static List getReminders({ @required List reminders, - @required Letters letter, + @required String dayName, @required String period, @required String subject, }) => [ for (int index = 0; index < reminders.length; index++) if (reminders [index].time.doesApply( - letter: letter, + dayName: dayName, period: period, subject: subject )) index diff --git a/lib/src/data/schedule.dart b/lib/src/data/schedule.dart index a33ca81aa..118e2eb4c 100644 --- a/lib/src/data/schedule.dart +++ b/lib/src/data/schedule.dart @@ -9,67 +9,6 @@ import "package:flutter/foundation.dart"; import "times.dart"; -/// An enum describing the different letter days. -enum Letters { - /// An M day at Ramaz - /// - /// Happens every Monday - M, - - /// An R day at Ramaz. - /// - /// Happens every Thursday. - R, - - /// A day at Ramaz. - /// - /// Tuesdays and Wednesdays rotate between A, B, and C days. - A, - - /// B day at Ramaz. - /// - /// Tuesdays and Wednesdays rotate between A, B, and C days. - B, - - /// C day at Ramaz. - /// - /// Tuesdays and Wednesdays rotate between A, B, and C days. - C, - - /// E day at Ramaz. - /// - /// Fridays rotate between E and F days. - E, - - /// F day at Ramaz. - /// - /// Fridays rotate between E and F days. - F -} - -/// Maps a [Letters] to a [String] without a function. -const Map lettersToString = { - Letters.A: "A", - Letters.B: "B", - Letters.C: "C", - Letters.M: "M", - Letters.R: "R", - Letters.E: "E", - Letters.F: "F", -}; - -/// Maps a [String] to a [Letters] without a function. -const Map stringToLetters = { - "A": Letters.A, - "B": Letters.B, - "C": Letters.C, - "M": Letters.M, - "R": Letters.R, - "E": Letters.E, - "F": Letters.F, - null: null, -}; - /// A subject, or class, that a student can take. /// /// Since one's schedule contains multiple instances of the same subject, @@ -310,24 +249,11 @@ class Period { /// A day at Ramaz. /// -/// Each day has a [letter] and [special] property. -/// The [letter] property decides which schedule to show, +/// Each day has a [name] and [special] property. +/// The [name] property decides which schedule to show, /// while the [special] property decides what time slots to give the periods. @immutable class Day { - /// The default [Special] for a given [Letters]. - /// - /// See [Special.getWinterFriday] for how to determine the Friday schedule. - static final Map specials = { - Letters.A: Special.rotate, - Letters.B: Special.rotate, - Letters.C: Special.rotate, - Letters.M: Special.regular, - Letters.R: Special.regular, - Letters.E: Special.getWinterFriday(), - Letters.F: Special.getWinterFriday(), - }; - /// Gets the calendar for the whole year. /// /// Each element of [data]'s months should be a JSON representation of a [Day]. @@ -357,53 +283,41 @@ class Day { static Day getDate(List> calendar, DateTime date) => calendar [date.month - 1] [date.day - 1]; - /// The letter of this day. + /// The name of this day. /// /// This decides which schedule of the student is shown. - final Letters letter; + final String name; /// The time allotment for this day. /// /// See the [Special] class for more details. final Special special; - /// Returns a new Day from a [Letters] and [Special]. - /// - /// [special] can be null, in which case [specials] will be used. - Day ({ - @required this.letter, - special - }) : special = special ?? specials [letter]; + /// Returns a new Day from a [name] and [Special]. + const Day({ + @required this.name, + @required this.special + }); /// Returns a Day from a JSON object. /// - /// `json ["letter"]` must be one of the specials in [Special.stringToSpecial]. - /// `json ["letter"]` must not be null. + /// `json ["name"]` and `json ["special"]` must not be null. /// /// `json ["special"]` may be: /// - /// 1. One of the specials from [specials]. + /// 1. One of the specials from [Special.specials]. /// 2. JSON of a special. See [Special.fromJson]. - /// 3. null, in which case [specials] will be used. /// /// This factory is not a constructor so it can dynamically check - /// for a valid [letter] while keeping the field final. + /// for a valid [name] while keeping the field final. factory Day.fromJson(Map json) { - if (!json.containsKey("letter")) { + if (!json.containsKey("name")) { throw JsonUnsupportedObjectError(json); } - final String jsonLetter = json ["letter"]; + final String name = json ["name"]; final jsonSpecial = json ["special"]; - if (!stringToLetters.containsKey (jsonLetter)) { - throw ArgumentError.value( - jsonLetter, // invalid value - "letter", // arg name - "$jsonLetter is not a valid letter", // message - ); - } - final Letters letter = stringToLetters [jsonLetter]; final Special special = Special.fromJson(jsonSpecial); - return Day (letter: letter, special: special); + return Day(name: name, special: special); } @override @@ -414,8 +328,7 @@ class Day { @override bool operator == (dynamic other) => other is Day && - other.letter == letter && - // other.lunch == lunch && + other.name == name && other.special == special; /// Returns a JSON representation of this Day. @@ -423,46 +336,33 @@ class Day { /// Will convert [special] to its name if it is a built-in special. /// Otherwise it will convert it to JSON form. Map toJson() => { - "letter": lettersToString [letter], - "special": special == null ? null : - Special.stringToSpecial.containsKey(special.name) - ? special.name - : special.toJson() + "name": name, + "special": Special.stringToSpecial.containsKey(special.name) + ? special.name + : special.toJson() }; /// A human-readable string representation of this day. /// - /// If the letter is null, returns null. - /// Otherwise, returns [letter] and [special]. - /// If [special] was left as the default, will only return the [letter]. - String get name => letter == null + /// If [name] is null, returns null. + /// Otherwise, returns [name] and [special]. + /// If [special] was left as the default, will only return the [name]. + String get displayName => name == null ? "No School" - : "${lettersToString [letter]} day${ + : "$name day${ special == Special.regular || special == Special.rotate ? '' : ' ${special.name}' }"; /// Whether to say "a" or "an". /// - /// This method is needed since [letter] is a letter and not a word. + /// This method is needed since [name] can be a letter and not a word. /// So a letter like "R" might need "an" while "B" would need "a". - String get n { - switch (letter) { - case Letters.A: - case Letters.E: - case Letters.M: - case Letters.R: - case Letters.F: - return "n"; - case Letters.B: - case Letters.C: - default: - return ""; - } - } + String get n => {"A", "E", "I", "O", "U"}.contains(name [0]) + || {"A", "M", "R", "E", "F"}.contains(name) ? "n" : ""; /// Whether there is school on this day. - bool get school => letter != null; + bool get school => name != null; /// Whether the times for this day are known. bool get isModified => special == Special.modified; diff --git a/lib/src/data/student.dart b/lib/src/data/student.dart index 8f27b761e..164a70256 100644 --- a/lib/src/data/student.dart +++ b/lib/src/data/student.dart @@ -16,8 +16,8 @@ class Student { /// This student's schedule. /// /// Each key is a different day, and the value is a list of periods. - /// See [Letters] and [PeriodData] for more information. - final Map > schedule; + /// See [PeriodData] for more information. + final Map> schedule; /// The section ID for this student's homeroom; final String homeroomId; @@ -64,29 +64,11 @@ class Student { } final String homeroomId = json [homeroomKey]; - // Check for null schedules - const List letters = ["A", "B", "C", "E", "F", "M", "R"]; - for (final String letter in letters) { - if (!json.containsKey (letter)) { - throw JsonUnsupportedObjectError( - json, cause: "Cannot find letter $letter" - ); - } - if (json [letter] == null) { - throw ArgumentError.notNull ("$letter has no schedule"); - } - } - // Real code starts here return Student ( schedule: { - Letters.A: PeriodData.getList (json ["A"]), - Letters.B: PeriodData.getList (json ["B"]), - Letters.C: PeriodData.getList (json ["C"]), - Letters.E: PeriodData.getList (json ["E"]), - Letters.F: PeriodData.getList (json ["F"]), - Letters.M: PeriodData.getList (json ["M"]), - Letters.R: PeriodData.getList (json ["R"]), + for (final String dayName in json ["dayNames"]) + dayName: PeriodData.getList(json [dayName]) }, homeroomId: homeroomId, homeroomLocation: homeroomLocation, @@ -105,13 +87,15 @@ class Student { return []; } - // Get indices for `schedule [day.letter]`, keeping skipped periods in mind + // Get indices for `schedule [day.name]`, keeping skipped periods in mind int periodIndex = 0; final List periodIndices = []; final Map activities = day.special.activities ?? {}; - final Special special = day.isModified - ? Day.specials [day.letter] - : day.special; + // TODO: Remove this line. + // final Special special = day.isModified + // ? Day.specials [day.letter] + // : day.special; + final Special special = day.special; for (int index = 0; index < special.periods.length; index++) { while (special?.skip?.contains(periodIndex + 1) ?? false) { @@ -140,7 +124,7 @@ class Student { activity: activities ["Mincha"], ) else Period( - schedule [day.letter] [periodIndices [index]] ?? PeriodData.free, + schedule [day.name] [periodIndices [index]] ?? PeriodData.free, time: day.isModified ? null : special.periods [index], period: (periodIndices [index] + 1).toString(), activity: activities [(periodIndices [index] + 1).toString()] From c3d7fd57c9ddf85d748a76bc73fdd147edb781f2 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 01:51:58 -0400 Subject: [PATCH 007/251] Remove Letters from models library --- lib/src/models/data/reminders.dart | 4 +- lib/src/models/data/schedule.dart | 6 +- lib/src/models/view/builders/day_builder.dart | 22 +++--- .../view/builders/reminder_builder.dart | 33 ++++---- lib/src/models/view/schedule.dart | 78 ++++--------------- 5 files changed, 49 insertions(+), 94 deletions(-) diff --git a/lib/src/models/data/reminders.dart b/lib/src/models/data/reminders.dart index 3cf85a784..2d20a7071 100644 --- a/lib/src/models/data/reminders.dart +++ b/lib/src/models/data/reminders.dart @@ -62,11 +62,11 @@ class Reminders with ChangeNotifier { List getReminders({ @required String subject, @required String period, - @required Letters letter, + @required String dayName, }) => Reminder.getReminders( reminders: reminders, subject: subject, - letter: letter, + dayName: dayName, period: period, ).toList(); diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index 7bfb77cab..d545497ad 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -168,12 +168,12 @@ class Schedule with ChangeNotifier { ..currentReminders = Models.reminders.getReminders( period: period?.period, subject: subjects [period?.id]?.name, - letter: today.letter, + dayName: today.name, ) ..nextReminders = Models.reminders.getReminders( period: nextPeriod?.period, subject: subjects [nextPeriod?.id]?.name, - letter: today.letter, + dayName: today.name, ); (Models.reminders.currentReminders ?? []).forEach(Models.reminders.markShown); @@ -203,7 +203,7 @@ class Schedule with ChangeNotifier { for (final int reminderIndex in Models.reminders.getReminders( period: period?.period, subject: subjects [period?.id]?.name, - letter: today.letter, + dayName: today.name, )) { Notifications.scheduleNotification( date: DateTime( diff --git a/lib/src/models/view/builders/day_builder.dart b/lib/src/models/view/builders/day_builder.dart index 8194a4c3e..078c68df5 100644 --- a/lib/src/models/view/builders/day_builder.dart +++ b/lib/src/models/view/builders/day_builder.dart @@ -11,14 +11,14 @@ class DayBuilderModel with ChangeNotifier { /// This is used to create [userSpecials]. final AdminUserModel admin; - Letters _letter; + String _name; Special _special; bool _hasSchool; /// Creates a view model for modifying a [Day]. DayBuilderModel(Day day) : admin = Models.admin.user { admin.addListener(notifyListeners); - _letter = day?.letter; + _name = day?.name; _special = day?.special; _hasSchool = day?.school; } @@ -29,10 +29,10 @@ class DayBuilderModel with ChangeNotifier { super.dispose(); } - /// The letter for this day. - Letters get letter => _letter; - set letter (Letters value) { - _letter = value; + /// The name for this day. + String get name => _name; + set name (String value) { + _name = value; notifyListeners(); } @@ -59,7 +59,7 @@ class DayBuilderModel with ChangeNotifier { /// If this day has school. /// /// This is different than [Day.school] because it doesn't belong to [day], - /// it dictates whether [letter] and [special] is used in [day]. + /// it dictates whether [name] and [special] is used in [day]. bool get hasSchool => _hasSchool; set hasSchool(bool value) { _hasSchool = value; @@ -68,10 +68,10 @@ class DayBuilderModel with ChangeNotifier { /// The day being created (in present state). /// - /// The model uses [letter] and [special]. + /// The model uses [name] and [special]. Day get day => hasSchool - ? Day(letter: letter, special: special) - : Day(letter: null, special: null); + ? Day(name: name, special: special) + : const Day(name: null, special: null); /// The built-in specials. List get presetSpecials => Special.specials; @@ -80,5 +80,5 @@ class DayBuilderModel with ChangeNotifier { List get userSpecials => admin.admin.specials; /// Whether this day is ready to be created. - bool get ready => letter != null && special != null; + bool get ready => name != null && special != null; } diff --git a/lib/src/models/view/builders/reminder_builder.dart b/lib/src/models/view/builders/reminder_builder.dart index 875e1a47a..6cb5325f8 100644 --- a/lib/src/models/view/builders/reminder_builder.dart +++ b/lib/src/models/view/builders/reminder_builder.dart @@ -23,10 +23,7 @@ class RemindersBuilderModel with ChangeNotifier { /// being displayed once. bool shouldRepeat = false; - /// The day this reminder should be displayed. - /// - /// Only relevant for [PeriodReminderTime]. - Day day; + String dayName; /// The period this reminder should be displayed. /// @@ -65,7 +62,7 @@ class RemindersBuilderModel with ChangeNotifier { case ReminderTimeType.period: final PeriodReminderTime reminderTime = time; period = reminderTime.period; - day = Day (letter: reminderTime.letter); + dayName = reminderTime.dayName; break; case ReminderTimeType.subject: final SubjectReminderTime reminderTime = time; @@ -81,7 +78,7 @@ class RemindersBuilderModel with ChangeNotifier { message: message, time: ReminderTime.fromType( type: type, - letter: letter, + dayName: dayName, period: period, name: course, repeats: shouldRepeat, @@ -94,28 +91,30 @@ class RemindersBuilderModel with ChangeNotifier { /// /// - [message] is null or empty, /// - [type] is null, - /// - [type] is [ReminderTimeType.period] and [letter] or [period] is null, or + /// - [type] is [ReminderTimeType.period] and [dayName] or [period] is null, or /// - [type] is [ReminderTimeType.subject] and [course] is null. /// bool get ready => (message?.isNotEmpty ?? false) && type != null && (type != ReminderTimeType.period || - (day?.letter != null && period != null) + (dayName != null && period != null) ) && ( type != ReminderTimeType.subject || course != null ); - /// A list of all the periods in [day]. + /// A list of all the periods in [dayName]. /// - /// Make sure this field is only accessed *after* setting [day]. - List get periods => day == null ? null : [ - for (final Period period in _schedule.student.getPeriods(day)) + /// Make sure this field is only accessed *after* setting [dayName]. + List get periods => dayName == null ? null : [ + for ( + final Period period in + _schedule.student.getPeriods( + Day(name: dayName, special: Special.regular) + ) + ) period.period ]; - /// The selected letter. - Letters get letter => day?.letter; - /// Sets the message to the given string. /// /// Use this to properly update [ready]. @@ -140,8 +139,8 @@ class RemindersBuilderModel with ChangeNotifier { /// Changes the [period] of this reminder. /// /// Only relevant when [type] is [ReminderTimeType.period]. - void changeLetter(Letters value) { - day = Day (letter: value); + void changeLetter(String value) { + dayName = value; period = null; notifyListeners(); } diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index 23ec16c97..b2f0e9680 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -6,23 +6,11 @@ import "package:ramaz/models.dart"; /// A view model for the schedule page. // ignore: prefer_mixin class ScheduleModel with ChangeNotifier { - /// The default [Letters] for the UI. - static const Letters defaultLetter = Letters.M; - /// The default [Special] for the UI. static const Special defaultSpecial = Special.regular; /// The default [Day] for the UI. - static final Day defaultDay = - Day (letter: defaultLetter, special: defaultSpecial); - - /// A list of valid Friday schedules. - static const List fridays = [ - Special.friday, - Special.winterFriday, - Special.fridayRoshChodesh, - Special.winterFridayRoshChodesh - ]; + Day defaultDay; /// The schedule data model. /// @@ -42,13 +30,15 @@ class ScheduleModel with ChangeNotifier { /// /// Also initializes the default day shown to the user. /// If today is a school day, then use that. Otherwise, use the - /// defaults (see [defaultLetter] and [defaultSpecial]). - ScheduleModel () : - schedule = Models.schedule - { + /// defaults (see [defaultSpecial]). + ScheduleModel () : schedule = Models.schedule { day = schedule.hasSchool ? schedule.today : defaultDay; + defaultDay = Day( + name: schedule.student.schedule.keys.first, + special: defaultSpecial + ); } /// Attempts to set the UI to the schedule of the given day. @@ -67,59 +57,25 @@ class ScheduleModel with ChangeNotifier { } day = selected; _selectedDay = justDate; - update (newLetter: selected.letter, newSpecial: selected.special); + update (newName: selected.name, newSpecial: selected.special); } /// Gets the date whose schedule the user is looking at DateTime get date => _selectedDay; - /// Updates the UI to a new day given a new letter or special. - /// - /// If the letter is non-null, then the special is automatically determined. - /// See [Day()] for details. + /// Updates the UI to a new day given a new dayName or special. /// - /// If the special is non-null, then the letter is automatically determined - /// to avoid setting a Friday schedule to a day that isn't Friday, and vice - /// versa. See [fridays] for Friday schedules. - void update({Letters newLetter, Special newSpecial}) { - Letters letter = day.letter; - Special special = day.special; - if (newLetter != null) { - letter = newLetter; - day = Day(letter: letter, special: null); + /// If the dayName is non-null, the special defaults to [defaultSpecial]. + void update({String newName, Special newSpecial}) { + String name = day.name; + final Special special = day.special; + if (newName != null) { + name = newName; + day = Day(name: name, special: null); notifyListeners(); } if (newSpecial != null) { - switch (letter) { - // Cannot set a Friday schedule to a non-Friday - case Letters.A: - case Letters.B: - case Letters.C: - if (newSpecial != Special.regular) { - continue regular; - } - break; - regular: - case Letters.M: - case Letters.R: - if ( - ( - letter != Letters.M && letter != Letters.R || // if it's M or R - newSpecial != Special.rotate // and newSpecial isn't a rotate - ) && - !fridays.contains(newSpecial) // AND newSpecial is not a Friday - ) { - special = newSpecial; - } - break; - // Cannot set a non-Friday schedule to a Friday - case Letters.E: - case Letters.F: - if (fridays.contains (newSpecial)) { - special = newSpecial; - } - } - day = Day (letter: letter, special: special); + day = Day (name: name, special: special); notifyListeners(); } } From 8c00f906151bd9dfe5ab0d2ac62d444780f838ab Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 01:54:04 -0400 Subject: [PATCH 008/251] Removed Letters from widgets library --- lib/src/widgets/atomic/admin/calendar_tile.dart | 6 +++--- lib/src/widgets/generic/class_list.dart | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/widgets/atomic/admin/calendar_tile.dart b/lib/src/widgets/atomic/admin/calendar_tile.dart index b2edfee0b..604a92ab6 100644 --- a/lib/src/widgets/atomic/admin/calendar_tile.dart +++ b/lib/src/widgets/atomic/admin/calendar_tile.dart @@ -34,15 +34,15 @@ class CalendarTile extends StatelessWidget{ alignment: Alignment.topLeft, child: Text ((date + 1).toString()), ), - if (day?.letter != null) + if (day?.name != null) Center ( child: Text ( - lettersToString [day.letter], + day.name, textScaleFactor: 1.5 ), ), if ( - day?.letter != null && + day?.name != null && ![Special.rotate.name, Special.regular.name] .contains(day.special?.name) ) const Align( diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index 23de75cd6..dd87f7370 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -139,7 +139,7 @@ class ClassList extends StatelessWidget { : "${period.period}: ${period.getName(subject)}", reminders: Models.reminders.getReminders( period: period.period, - letter: day.letter, + dayName: day.name, subject: subject?.name, ), activity: period?.activity, From 1cf2ac1ed001d5335c63aadab95bf07c7600ce09 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 01:59:18 -0400 Subject: [PATCH 009/251] Removed Letters from pages library --- lib/src/pages/builders/day_builder.dart | 20 ++++++++++---------- lib/src/pages/builders/reminder_builder.dart | 10 +++++----- lib/src/pages/builders/sports_builder.dart | 3 ++- lib/src/pages/schedule.dart | 12 ++++++------ 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/lib/src/pages/builders/day_builder.dart b/lib/src/pages/builders/day_builder.dart index efc659c57..e4e34d2cc 100644 --- a/lib/src/pages/builders/day_builder.dart +++ b/lib/src/pages/builders/day_builder.dart @@ -8,12 +8,12 @@ import "special_builder.dart"; /// A widget to guide the admin in modifying a day in the calendar. /// -/// Creates a pop-up that allows the admin to set the [Letters] and [Special] +/// Creates a pop-up that allows the admin to set the dayName and [Special] /// for a given day in the calendar, even providing an option to create a custom /// [Special]. /// -/// If [day] is provided, then the fields [DayBuilderModel.letter], -/// [DayBuilderModel.special], are set to `day.letter` ([Day.letter]) and +/// If [day] is provided, then the fields [DayBuilderModel.name], +/// [DayBuilderModel.special], are set to `day.name` ([Day.name]) and /// `day.special` ([Day.special]), respectively. class DayBuilder extends StatelessWidget { /// Returns the [Day] created by this widget. @@ -65,16 +65,16 @@ class DayBuilder extends StatelessWidget { crossAxisAlignment: WrapCrossAlignment.center, children: [ const Text("Letter", textAlign: TextAlign.center), - DropdownButton( - value: model.letter, + DropdownButton( + value: model.name, hint: const Text("Letter"), onChanged: !model.hasSchool ? null : - (Letters letter) => model.letter = letter, + (String value) => model.name = value, items: [ - for (final Letters letter in Letters.values) - DropdownMenuItem( - value: letter, - child: Text (lettersToString [letter]), + for (final String dayName in Models.schedule.student.schedule.keys) + DropdownMenuItem( + value: dayName, + child: Text(dayName), ) ], ) diff --git a/lib/src/pages/builders/reminder_builder.dart b/lib/src/pages/builders/reminder_builder.dart index e33b73b59..74a1c6f07 100644 --- a/lib/src/pages/builders/reminder_builder.dart +++ b/lib/src/pages/builders/reminder_builder.dart @@ -157,16 +157,16 @@ class ReminderBuilderState extends State { if (model.type == ReminderTimeType.period) ...[ ListTile ( title: const Text ("Letter day"), - trailing: DropdownButton( + trailing: DropdownButton( items: [ - for (final Letters letter in Letters.values) + for (final String dayName in Models.schedule.student.schedule.keys) DropdownMenuItem( - value: letter, - child: Text (lettersToString [letter]), + value: dayName, + child: Text(dayName), ), ], onChanged: model.changeLetter, - value: model.letter, + value: model.dayName, hint: const Text ("Letter"), ), ), diff --git a/lib/src/pages/builders/sports_builder.dart b/lib/src/pages/builders/sports_builder.dart index c225be0c7..ac10143c2 100644 --- a/lib/src/pages/builders/sports_builder.dart +++ b/lib/src/pages/builders/sports_builder.dart @@ -226,7 +226,8 @@ class SportBuilderState extends State { SportsTile( model.game, onTap: () async => model.scores = - await SportsScoreUpdater.updateScores(context, model.game) ?? model.scores + await SportsScoreUpdater.updateScores(context, model.game) + ?? model.scores ), ButtonBar( children: [ diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index 8cb778921..805fd709c 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -41,14 +41,14 @@ class SchedulePage extends StatelessWidget { children: [ ListTile ( title: const Text ("Choose a letter"), - trailing: DropdownButton ( - value: model.day.letter, - onChanged: (Letters letter) => model.update(newLetter: letter), + trailing: DropdownButton ( + value: model.day.name, + onChanged: (String value) => model.update(newName: value), items: [ - for (final Letters letter in Letters.values) + for (final String dayName in Models.schedule.student.schedule.keys) DropdownMenuItem( - value: letter, - child: Text(lettersToString [letter]), + value: dayName, + child: Text(dayName), ) ] ) From 013d6c27f796a4e38e65f591e64b18efe97343bf Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 03:15:59 -0400 Subject: [PATCH 010/251] Cleanup --- lib/src/data/admin.dart | 9 ++++++-- lib/src/data/schedule.dart | 4 ++-- lib/src/data/student.dart | 22 ++++++++++++++----- lib/src/data/times.dart | 19 ++++++++++++++++ .../view/builders/reminder_builder.dart | 2 +- lib/src/models/view/schedule.dart | 5 ++--- lib/src/pages/home.dart | 2 +- lib/src/widgets/generic/class_list.dart | 21 ++++++++++++++---- 8 files changed, 65 insertions(+), 19 deletions(-) diff --git a/lib/src/data/admin.dart b/lib/src/data/admin.dart index 9c327f696..ea830568b 100644 --- a/lib/src/data/admin.dart +++ b/lib/src/data/admin.dart @@ -40,10 +40,13 @@ class Admin { /// These can be saved so the admin does not have to recreate them. final List specials; + final String email; + /// Creates a user with administrative privileges. const Admin ({ this.scopes, - this.specials + this.specials, + this.email, }); /// Creates an admin from a JSON entry. @@ -52,6 +55,7 @@ class Admin { for (String scope in _scopes) stringToScope [scope] ], + email = json ["email"], specials = [ for (dynamic special in json ["specials"] ?? []) Special.fromJson (Map.from(special)) @@ -62,6 +66,7 @@ class Admin { "specials": [ for (final Special special in specials) special.toJson(), - ] + ], + "email": email, }; } diff --git a/lib/src/data/schedule.dart b/lib/src/data/schedule.dart index 118e2eb4c..2304b7efe 100644 --- a/lib/src/data/schedule.dart +++ b/lib/src/data/schedule.dart @@ -321,7 +321,7 @@ class Day { } @override - String toString() => name; + String toString() => displayName; @override int get hashCode => name.hashCode; @@ -349,7 +349,7 @@ class Day { /// If [special] was left as the default, will only return the [name]. String get displayName => name == null ? "No School" - : "$name day${ + : "$name${ special == Special.regular || special == Special.rotate ? '' : ' ${special.name}' }"; diff --git a/lib/src/data/student.dart b/lib/src/data/student.dart index 164a70256..38b25b78d 100644 --- a/lib/src/data/student.dart +++ b/lib/src/data/student.dart @@ -98,19 +98,22 @@ class Student { final Special special = day.special; for (int index = 0; index < special.periods.length; index++) { - while (special?.skip?.contains(periodIndex + 1) ?? false) { - periodIndex++; - } + // if (special.skip?.contains(index) ?? false) + // periodIndex++; + // while (special?.skip?.contains(periodIndex + 1) ?? false) { + // periodIndex++; + // } periodIndices.add( - special.homeroom == index || special.mincha == index + special.homeroom == index + || special.mincha == index + || (special.skip?.contains(index) ?? false) ? null : periodIndex++ ); } - // Loop over all the periods and assign each one a Period. return [ - for (int index = 0; index < special.periods.length; index++) + for (int index = 0; index < special.periods.length; index++) if (special.homeroom == index) Period( PeriodData.free, @@ -123,6 +126,13 @@ class Student { day.isModified ? null : special.periods [index], activity: activities ["Mincha"], ) + else if (periodIndices [index] == null) + Period( + PeriodData.free, + time: day.isModified ? null : special.periods [index], + period: "Free", + activity: null, + ) else Period( schedule [day.name] [periodIndices [index]] ?? PeriodData.free, time: day.isModified ? null : special.periods [index], diff --git a/lib/src/data/times.dart b/lib/src/data/times.dart index 309df67ac..1b33d8f5e 100644 --- a/lib/src/data/times.dart +++ b/lib/src/data/times.dart @@ -412,6 +412,24 @@ class Special { "homeroom": homeroom, }; + static const Special covid = Special( + "COVID-19", + [ + Range(Time(8, 30), Time(9, 15)), + Range(Time(9, 20), Time(9, 55)), + Range(Time(10, 00), Time(10, 45)), + Range(Time(10, 55), Time(11, 40)), + Range(Time(11, 50), Time(12, 35)), + Range(Time(12, 35), Time(13, 05)), + Range(Time(13, 15), Time(14, 00)), + Range(Time(14, 00), Time(14, 10)), + Range(Time(14, 20), Time(15, 05)), + Range(Time(15, 15), Time(16, 00)), + ], + mincha: 7, + skip: [1, 5], + ); + /// The [Special] for Rosh Chodesh. static const Special roshChodesh = Special ( "Rosh Chodesh", @@ -647,6 +665,7 @@ class Special { rotate, early, modified, + covid, ]; /// Maps the default special names to their [Special] objects diff --git a/lib/src/models/view/builders/reminder_builder.dart b/lib/src/models/view/builders/reminder_builder.dart index 6cb5325f8..41d4f6dbd 100644 --- a/lib/src/models/view/builders/reminder_builder.dart +++ b/lib/src/models/view/builders/reminder_builder.dart @@ -109,7 +109,7 @@ class RemindersBuilderModel with ChangeNotifier { for ( final Period period in _schedule.student.getPeriods( - Day(name: dayName, special: Special.regular) + Day(name: dayName, special: Models.schedule.today.special), ) ) period.period diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index b2f0e9680..6be572835 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -68,14 +68,13 @@ class ScheduleModel with ChangeNotifier { /// If the dayName is non-null, the special defaults to [defaultSpecial]. void update({String newName, Special newSpecial}) { String name = day.name; - final Special special = day.special; if (newName != null) { name = newName; - day = Day(name: name, special: null); + day = Day(name: name, special: defaultSpecial); notifyListeners(); } if (newSpecial != null) { - day = Day (name: name, special: special); + day = Day (name: name, special: newSpecial); notifyListeners(); } } diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index 212740961..10cb9e72d 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -91,7 +91,7 @@ class HomePageState extends State { Text ( model.schedule.hasSchool ? "Today is a${model.schedule.today.n} " - "${model.schedule.today.name}" + "${model.schedule.today.displayName}" : "There is no school today", textScaleFactor: 2, textAlign: TextAlign.center diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index dd87f7370..2610aa0f4 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -96,6 +96,21 @@ class ClassList extends StatelessWidget { this.periods, }); + List _getPeriods(BuildContext context) { + try { + return periods ?? Models.schedule.student.getPeriods(day); + } on RangeError { // ignore: avoid_catching_errors + Future( + () => Scaffold.of(context).showSnackBar( + const SnackBar(content: Text("Invalid schedule")) + ) + ); + return Models.schedule.student.getPeriods( + Models.schedule.today + ); + } + } + @override Widget build(BuildContext context) => ModelListener( model: () => Models.reminders, dispose: false, @@ -114,10 +129,8 @@ class ClassList extends StatelessWidget { children: [ if (headerText != null) header, ...[ - for ( - final Period period in - periods ?? Models.schedule.student.getPeriods(day) - ) getPanel(period) + for (final Period period in _getPeriods(context)) + getPanel(period) ], ] ) From 27ec58d89b47bc0ffd60d27be9cd08727ca0f57c Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 09:47:23 -0400 Subject: [PATCH 011/251] Fixed some text labels --- lib/src/models/view/builders/reminder_builder.dart | 2 +- lib/src/pages/builders/reminder_builder.dart | 6 +++--- lib/src/pages/schedule.dart | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/src/models/view/builders/reminder_builder.dart b/lib/src/models/view/builders/reminder_builder.dart index 41d4f6dbd..ec7096985 100644 --- a/lib/src/models/view/builders/reminder_builder.dart +++ b/lib/src/models/view/builders/reminder_builder.dart @@ -139,7 +139,7 @@ class RemindersBuilderModel with ChangeNotifier { /// Changes the [period] of this reminder. /// /// Only relevant when [type] is [ReminderTimeType.period]. - void changeLetter(String value) { + void changeDay(String value) { dayName = value; period = null; notifyListeners(); diff --git a/lib/src/pages/builders/reminder_builder.dart b/lib/src/pages/builders/reminder_builder.dart index 74a1c6f07..e8b9fcb3d 100644 --- a/lib/src/pages/builders/reminder_builder.dart +++ b/lib/src/pages/builders/reminder_builder.dart @@ -156,7 +156,7 @@ class ReminderBuilderState extends State { const SizedBox (height: 20), if (model.type == ReminderTimeType.period) ...[ ListTile ( - title: const Text ("Letter day"), + title: const Text ("Day"), trailing: DropdownButton( items: [ for (final String dayName in Models.schedule.student.schedule.keys) @@ -165,9 +165,9 @@ class ReminderBuilderState extends State { child: Text(dayName), ), ], - onChanged: model.changeLetter, + onChanged: model.changeDay, value: model.dayName, - hint: const Text ("Letter"), + hint: const Text("Day"), ), ), ListTile ( diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index 805fd709c..5fcb168c1 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -40,7 +40,7 @@ class SchedulePage extends StatelessWidget { body: Column ( children: [ ListTile ( - title: const Text ("Choose a letter"), + title: const Text ("Day"), trailing: DropdownButton ( value: model.day.name, onChanged: (String value) => model.update(newName: value), @@ -54,7 +54,7 @@ class SchedulePage extends StatelessWidget { ) ), ListTile ( - title: const Text ("Choose a schedule"), + title: const Text ("Schedule"), trailing: DropdownButton ( value: model.day.special, onChanged: (Special special) => model.update(newSpecial: special), From c8bce1c7e95abb4c6199d8adbf0f44adad09992e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 09:52:06 -0400 Subject: [PATCH 012/251] Removed references to Letters from the code --- lib/src/data/reminder.dart | 2 +- lib/src/data/schedule.dart | 2 +- lib/src/pages/builders/day_builder.dart | 4 ++-- lib/src/widgets/atomic/sports_tile.dart | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/src/data/reminder.dart b/lib/src/data/reminder.dart index 7ea3ac553..1806b4dbe 100644 --- a/lib/src/data/reminder.dart +++ b/lib/src/data/reminder.dart @@ -64,7 +64,7 @@ abstract class ReminderTime { /// "type": "period", /// "repeats": false, /// "period": "9", - /// "letter": "M", + /// "name": "Monday", /// } /// ``` factory ReminderTime.fromJson(Map json) { diff --git a/lib/src/data/schedule.dart b/lib/src/data/schedule.dart index 2304b7efe..3b1da86b6 100644 --- a/lib/src/data/schedule.dart +++ b/lib/src/data/schedule.dart @@ -356,7 +356,7 @@ class Day { /// Whether to say "a" or "an". /// - /// This method is needed since [name] can be a letter and not a word. + /// Remember, [name] can be a letter and not a word. /// So a letter like "R" might need "an" while "B" would need "a". String get n => {"A", "E", "I", "O", "U"}.contains(name [0]) || {"A", "M", "R", "E", "F"}.contains(name) ? "n" : ""; diff --git a/lib/src/pages/builders/day_builder.dart b/lib/src/pages/builders/day_builder.dart index e4e34d2cc..8839abe99 100644 --- a/lib/src/pages/builders/day_builder.dart +++ b/lib/src/pages/builders/day_builder.dart @@ -64,10 +64,10 @@ class DayBuilder extends StatelessWidget { alignment: WrapAlignment.spaceBetween, crossAxisAlignment: WrapCrossAlignment.center, children: [ - const Text("Letter", textAlign: TextAlign.center), + const Text("Day", textAlign: TextAlign.center), DropdownButton( value: model.name, - hint: const Text("Letter"), + hint: const Text("Day"), onChanged: !model.hasSchool ? null : (String value) => model.name = value, items: [ diff --git a/lib/src/widgets/atomic/sports_tile.dart b/lib/src/widgets/atomic/sports_tile.dart index 2a44935a8..39fdc9c1e 100644 --- a/lib/src/widgets/atomic/sports_tile.dart +++ b/lib/src/widgets/atomic/sports_tile.dart @@ -172,7 +172,6 @@ class SportsTile extends StatelessWidget { noNull && date == null ? null : "${date?.month ?? ' '}-${date?.day ?? ' '}-${date?.year ?? ' '}"; - // TODO(All): Decide on widget or letter, #1 (see note) /// The game for this widget to represent. final SportsGame game; From 2ecfcfa4f611b7381b79a0a3d7f102b277d2b41f Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 10:25:00 -0400 Subject: [PATCH 013/251] Fixed ClassList bug --- lib/src/widgets/generic/class_list.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index 2610aa0f4..0882ca1bd 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -96,7 +96,7 @@ class ClassList extends StatelessWidget { this.periods, }); - List _getPeriods(BuildContext context) { + Iterable _getPeriods(BuildContext context) { try { return periods ?? Models.schedule.student.getPeriods(day); } on RangeError { // ignore: avoid_catching_errors From ae0ce00ffb1b68e1d2e43bee7aa6935e271cafbc Mon Sep 17 00:00:00 2001 From: "Levi Lesches (on Mac)" Date: Thu, 8 Oct 2020 17:32:08 -0700 Subject: [PATCH 014/251] Released version 2.0.1+3 --- ios/Runner.xcodeproj/project.pbxproj | 10 +++++----- .../xcshareddata/xcschemes/Runner.xcscheme | 10 ++-------- ios/Runner/Info.plist | 4 ++-- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 0cc48f51c..f496234f8 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -256,7 +256,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh $SRCROOT/auto_increment_version.sh"; + shellScript = "/bin/sh $SRCROOT/auto_increment_version.sh\n"; }; 3864E4252347CC4B00516597 /* Crashlytics (needs to be last) */ = { isa = PBXShellScriptBuildPhase; @@ -290,7 +290,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; }; 84A3871B02ECAE1C37386DD1 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -460,7 +460,7 @@ }; 249021D4217E4FDB00AE95B9 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2E5A27593813E785D5B7CCF3 /* Pods-Runner.profile.xcconfig */; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -623,7 +623,7 @@ }; 97C147061CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 85DD3FE87B920992509E31A0 /* Pods-Runner.debug.xcconfig */; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -655,7 +655,7 @@ }; 97C147071CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3B8D73913ECD49AB72E4B626 /* Pods-Runner.release.xcconfig */; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 786d6aad5..444bcdbdb 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -26,10 +26,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - + + - - CFBundlePackageType APPL CFBundleShortVersionString - 1.0.1 + 2.0.1 CFBundleSignature ???? CFBundleURLTypes @@ -30,7 +30,7 @@ CFBundleVersion - 29 + 3 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS From 6aefa5483e4e6ebe0a3eb8eea3acf8afd7c338b0 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 8 Oct 2020 23:45:00 -0400 Subject: [PATCH 015/251] Testing new Podfile to speed up iOS build time --- ios/Podfile | 1 + 1 file changed, 1 insertion(+) diff --git a/ios/Podfile b/ios/Podfile index a4af0a922..2416f33d0 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -28,6 +28,7 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe flutter_ios_podfile_setup target 'Runner' do + pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '6.26.0' flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end From e54b84cef48be1615d30f4d45c404f3dedcc8970 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 9 Oct 2020 17:06:08 -0400 Subject: [PATCH 016/251] Added dayNames to user profiles --- firebase/firestore/lib/src/data/student.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/firebase/firestore/lib/src/data/student.dart b/firebase/firestore/lib/src/data/student.dart index 2d8c39070..3c0ad5c64 100644 --- a/firebase/firestore/lib/src/data/student.dart +++ b/firebase/firestore/lib/src/data/student.dart @@ -31,6 +31,8 @@ class User extends Serializable { period?.json ]; + static final dayNamesList = List.from(dayNames); + /// This user's email. final String email; @@ -139,6 +141,7 @@ class User extends Serializable { "homeroom": homeroom, "homeroom meeting room": homeroomLocation, "email": email, + "dayNames": dayNamesList, }; @override From afb1eb9a3955a2b7a13b732e73d6dbff4166e527 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 10:42:02 -0400 Subject: [PATCH 017/251] Hid Sports page from master app --- lib/src/pages/drawer.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index 8a17e92fe..4352aa1cb 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -41,11 +41,11 @@ class NavigationDrawer extends StatelessWidget { leading: Icon (Icons.note), onTap: pushRoute(context, Routes.reminders), ), - ListTile ( - title: Text ("Sports"), - leading: Icon (Icons.directions_run), - onTap: pushRoute(context, Routes.sports), - ), + // ListTile ( + // title: Text ("Sports"), + // leading: Icon (Icons.directions_run), + // onTap: pushRoute(context, Routes.sports), + // ), if (Models.admin != null) ListTile( title: const Text("Admin console"), From f2fc0d38e097af8871bb120936d43960f2e6d629 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 10:42:20 -0400 Subject: [PATCH 018/251] Fixed reload logic --- lib/src/pages/home.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index 10cb9e72d..fa02ab27c 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -30,6 +30,7 @@ class HomePageState extends State { try { await Services.instance.updateCalendar(); await Services.instance.updateSports(); + await Models.schedule.initCalendar(); } on PlatformException catch(error) { if (error.code == "Error performing get") { scaffoldKey.currentState.showSnackBar( @@ -91,7 +92,8 @@ class HomePageState extends State { Text ( model.schedule.hasSchool ? "Today is a${model.schedule.today.n} " - "${model.schedule.today.displayName}" + "${model.schedule.today.name}" + "\nSchedule: ${model.schedule.today.special.name}" : "There is no school today", textScaleFactor: 2, textAlign: TextAlign.center From 3ff53e16df5ca687e3441e6a46611a8908ebc776 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 10:42:43 -0400 Subject: [PATCH 019/251] Set default Special to covid --- lib/src/models/view/schedule.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index 6be572835..ad83e3962 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -7,7 +7,7 @@ import "package:ramaz/models.dart"; // ignore: prefer_mixin class ScheduleModel with ChangeNotifier { /// The default [Special] for the UI. - static const Special defaultSpecial = Special.regular; + static const Special defaultSpecial = Special.covid; /// The default [Day] for the UI. Day defaultDay; From 8e0143de3cbfed98837ae76e0195063d33e10fe3 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 10:45:28 -0400 Subject: [PATCH 020/251] Automatically remove outdated reminders --- lib/src/models/data/schedule.dart | 20 +++++++++++++++++++- lib/src/widgets/atomic/reminder_tile.dart | 17 +++++++++++++---- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index d545497ad..d41ad8525 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -61,7 +61,11 @@ class Schedule with ChangeNotifier { final Services services = Services.instance; student = Student.fromJson(await services.user); subjects = Subject.getSubjects(await services.getSections(student.getIds())); - calendar = Day.getCalendar(await services.calendar); + await initCalendar(); + } + + Future initCalendar() async { + calendar = Day.getCalendar(await Services.instance.calendar); setToday(); notifyListeners(); } @@ -221,4 +225,18 @@ class Schedule with ChangeNotifier { } } } + + bool isValidReminder(Reminder reminder) { + switch(reminder.time.type) { + case ReminderTimeType.period: + final PeriodReminderTime time = reminder.time; + final Iterable dayNames = student.schedule.keys; + return dayNames.contains(time.dayName) + && int.parse(time.period) <= student.schedule [time.dayName].length; + case ReminderTimeType.subject: + final SubjectReminderTime time = reminder.time; + return subjects.keys.contains(time.name); + default: throw StateError("Reminder <$reminder> has invalid ReminderTime"); + } + } } diff --git a/lib/src/widgets/atomic/reminder_tile.dart b/lib/src/widgets/atomic/reminder_tile.dart index 4606479e4..9d817ef07 100644 --- a/lib/src/widgets/atomic/reminder_tile.dart +++ b/lib/src/widgets/atomic/reminder_tile.dart @@ -31,10 +31,19 @@ class ReminderTile extends StatelessWidget { child: ListTile( title: Text (reminder.message), subtitle: Text (reminder.time.toString() ?? ""), - onTap: () async => reminders.replaceReminder( - index, - await ReminderBuilder.buildReminder(context, reminder), - ), + onTap: () async { + if (!Models.schedule.isValidReminder(reminder)) { + reminders.deleteReminder(index); + Scaffold.of(context).showSnackBar( + const SnackBar(content: Text("Deleted outdated reminder")) + ); + return; + } + reminders.replaceReminder( + index, + await ReminderBuilder.buildReminder(context, reminder), + ); + }, trailing: IconButton ( icon: Icon ( Icons.remove_circle, From cc3dc507bc56d2c15711cc1ebf0d7f6340696c9e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 10:45:50 -0400 Subject: [PATCH 021/251] Switched PeriodReminderTime to number period, not based on Special --- .../view/builders/reminder_builder.dart | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/src/models/view/builders/reminder_builder.dart b/lib/src/models/view/builders/reminder_builder.dart index ec7096985..30e7c8655 100644 --- a/lib/src/models/view/builders/reminder_builder.dart +++ b/lib/src/models/view/builders/reminder_builder.dart @@ -105,15 +105,16 @@ class RemindersBuilderModel with ChangeNotifier { /// A list of all the periods in [dayName]. /// /// Make sure this field is only accessed *after* setting [dayName]. - List get periods => dayName == null ? null : [ - for ( - final Period period in - _schedule.student.getPeriods( - Day(name: dayName, special: Models.schedule.today.special), - ) - ) - period.period - ]; + List get periods { + if (dayName == null) { + return null; + } + final List schedule = _schedule.student.schedule [dayName]; + return [ + for (int index = 0; index < schedule.length; index++) + (index + 1).toString() + ]; + } /// Sets the message to the given string. /// From 3d88b20796c925bfc2624fe1c5397232f0dde825 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 12:21:10 -0400 Subject: [PATCH 022/251] Cleanup --- lib/src/models/data/reminders.dart | 1 + lib/src/models/view/builders/day_builder.dart | 2 +- lib/src/widgets/generic/class_list.dart | 2 +- pubspec.lock | 38 +++++++++---------- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/lib/src/models/data/reminders.dart b/lib/src/models/data/reminders.dart index 2d20a7071..a23145306 100644 --- a/lib/src/models/data/reminders.dart +++ b/lib/src/models/data/reminders.dart @@ -34,6 +34,7 @@ class Reminders with ChangeNotifier { for (final Map json in await Services.instance.reminders) Reminder.fromJson(json) ]; + readReminders = []; } /// Whether any reminder applies to the current period. diff --git a/lib/src/models/view/builders/day_builder.dart b/lib/src/models/view/builders/day_builder.dart index 078c68df5..02cefb3f9 100644 --- a/lib/src/models/view/builders/day_builder.dart +++ b/lib/src/models/view/builders/day_builder.dart @@ -71,7 +71,7 @@ class DayBuilderModel with ChangeNotifier { /// The model uses [name] and [special]. Day get day => hasSchool ? Day(name: name, special: special) - : const Day(name: null, special: null); + : Day(name: null, special: presetSpecials [0]); /// The built-in specials. List get presetSpecials => Special.specials; diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index 0882ca1bd..e8b582918 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -100,7 +100,7 @@ class ClassList extends StatelessWidget { try { return periods ?? Models.schedule.student.getPeriods(day); } on RangeError { // ignore: avoid_catching_errors - Future( + Future( // cannot show snackbar on build, so wait for next frame () => Scaffold.of(context).showSnackBar( const SnackBar(content: Text("Invalid schedule")) ) diff --git a/pubspec.lock b/pubspec.lock index b25dbe3da..e02f58ca4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,35 +21,35 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.5.0-nullsafety" + version: "2.5.0-nullsafety.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety" + version: "2.1.0-nullsafety.1" characters: dependency: transitive description: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.2" + version: "1.1.0-nullsafety.3" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety" + version: "1.2.0-nullsafety.1" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety" + version: "1.1.0-nullsafety.1" cloud_firestore: dependency: "direct main" description: @@ -77,7 +77,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0-nullsafety.2" + version: "1.15.0-nullsafety.3" convert: dependency: transitive description: @@ -98,7 +98,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety" + version: "1.2.0-nullsafety.1" file: dependency: transitive description: @@ -267,21 +267,21 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10-nullsafety" + version: "0.12.10-nullsafety.1" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.2" + version: "1.3.0-nullsafety.3" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety" + version: "1.8.0-nullsafety.1" path_provider: dependency: "direct main" description: @@ -419,28 +419,28 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety" + version: "1.8.0-nullsafety.2" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.10.0-nullsafety" + version: "1.10.0-nullsafety.1" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety" + version: "2.1.0-nullsafety.1" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety" + version: "1.1.0-nullsafety.1" synchronized: dependency: transitive description: @@ -454,21 +454,21 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety" + version: "1.2.0-nullsafety.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.19-nullsafety" + version: "0.2.19-nullsafety.2" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.2" + version: "1.3.0-nullsafety.3" url_launcher: dependency: "direct main" description: @@ -510,7 +510,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.2" + version: "2.1.0-nullsafety.3" xdg_directories: dependency: transitive description: @@ -533,5 +533,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.10.0-0.0.dev <2.10.0" + dart: ">=2.10.0-110 <2.11.0" flutter: ">=1.12.13+hotfix.5 <2.0.0" From 9d719da4dddbfc141cef3015aa30d9f7167afc3b Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 17:55:12 -0400 Subject: [PATCH 023/251] Fixed faculty Firestore bug --- firebase/firestore/lib/src/faculty/logic.dart | 2 +- firebase/firestore/lib/src/faculty/reader.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/firebase/firestore/lib/src/faculty/logic.dart b/firebase/firestore/lib/src/faculty/logic.dart index 753e024b5..20501ac06 100644 --- a/firebase/firestore/lib/src/faculty/logic.dart +++ b/firebase/firestore/lib/src/faculty/logic.dart @@ -119,7 +119,7 @@ class FacultyLogic { final User newFaculty = replaceHomerooms.containsKey(faculty) ? replaceHomerooms[faculty] : faculty.addHomeroom( // will be overriden - homeroom: "TEST_HOMEROOM", + homeroom: "SENIOR_HOMEROOM", homeroomLocation: "Unavailable", ); schedules [newFaculty] = schedule; diff --git a/firebase/firestore/lib/src/faculty/reader.dart b/firebase/firestore/lib/src/faculty/reader.dart index 81ebce282..de3b5e423 100644 --- a/firebase/firestore/lib/src/faculty/reader.dart +++ b/firebase/firestore/lib/src/faculty/reader.dart @@ -12,7 +12,7 @@ class FacultyReader { await for(final Map row in csvReader(DataFiles.faculty)) row ["ID"]: User( id: row ["ID"], - email: row ["E-mail"], + email: row ["E-mail"].toLowerCase(), first: row ["First Name"], last: row ["Last Name"], ) From d5d371c09fee8ffd0aece0c4785c91c4c190dc43 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 20:00:18 -0400 Subject: [PATCH 024/251] Created constants.testers --- firebase/firestore/constants.yaml | 7 ++++++- firebase/firestore/lib/constants.dart | 7 ++++++- firebase/firestore/lib/src/data/student.dart | 14 ++++++++++++++ firebase/firestore/node/students.dart | 12 ++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/firebase/firestore/constants.yaml b/firebase/firestore/constants.yaml index 1465dccd4..05a025b11 100644 --- a/firebase/firestore/constants.yaml +++ b/firebase/firestore/constants.yaml @@ -8,4 +8,9 @@ dayNames: corruptStudents: - "724703" - "722601" - - "723397" \ No newline at end of file + - "723397" + +testers: + testt@ramaz.org: + first: "Test" + last: "Account" \ No newline at end of file diff --git a/firebase/firestore/lib/constants.dart b/firebase/firestore/lib/constants.dart index cb5fa702f..f7ebdca61 100644 --- a/firebase/firestore/lib/constants.dart +++ b/firebase/firestore/lib/constants.dart @@ -11,4 +11,9 @@ final Set dayNames = Set.from(yamlContents ["dayNames"]); final Set corruptStudents = Set.from(yamlContents ["corruptStudents"]); -final bool isSemester1 = DateTime.now().month > 7; \ No newline at end of file +final bool isSemester1 = DateTime.now().month > 7; + +final List> testers = [ + for (final MapEntry entry in yamlContents ["testers"].entries) + {"email": entry.key}..addAll(Map.from(entry.value)) +]; diff --git a/firebase/firestore/lib/src/data/student.dart b/firebase/firestore/lib/src/data/student.dart index 3c0ad5c64..02307c728 100644 --- a/firebase/firestore/lib/src/data/student.dart +++ b/firebase/firestore/lib/src/data/student.dart @@ -31,6 +31,10 @@ class User extends Serializable { period?.json ]; + static DefaultMap> get emptySchedule => DefaultMap( + (String letter) => List.filled(Period.periodsInDay[letter], null) + )..setDefaultForAll(dayNames); + static final dayNamesList = List.from(dayNames); /// This user's email. @@ -94,6 +98,16 @@ class User extends Serializable { } } + User.empty({ + @required this.email, + @required this.first, + @required this.last, + }) : + homeroom = "SENIOR_HOMEROOM", + homeroomLocation = "Unavailable", + id = null, + schedule = emptySchedule; + /// If this user has no classes. bool get hasNoClasses => schedule.values.every( (List daySchedule) => daySchedule.every( diff --git a/firebase/firestore/node/students.dart b/firebase/firestore/node/students.dart index c4e4c4e37..49af3e3ef 100644 --- a/firebase/firestore/node/students.dart +++ b/firebase/firestore/node/students.dart @@ -1,3 +1,4 @@ +import "package:firestore/constants.dart"; import "package:firestore/data.dart"; import "package:firestore/helpers.dart"; import "package:firestore/services.dart"; @@ -53,6 +54,17 @@ Future main() async { User.verifySchedules(studentsWithSchedules); + final List testUsers = [ + for (final Map tester in testers) + User.empty( + email: tester ["email"], + first: tester ["first"], + last: tester ["last"], + ) + ]; + Logger.info("Found ${testUsers.length} testers"); + studentsWithSchedules.addAll(testUsers); + Logger.info("Finished data indexing."); if (Args.upload) { From 0da5a6b253cf32b95606d10839bbc898b1434bfd Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 21:48:21 -0400 Subject: [PATCH 025/251] Added redundancy error checking --- lib/src/services/cloud_db.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index 1a1bb7301..5d42d26cf 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -134,8 +134,14 @@ class CloudDatabase implements Service { } @override - Future> get user async => - (await userDocument.get()).data(); + Future> get user async { + final DocumentSnapshot snapshot = await userDocument.get(); + if (!snapshot.exists) { + throw StateError("User ${Auth.email} does not exist in the database"); + } else { + return snapshot.data(); + } + } /// No-op -- The user cannot edit their own profile. /// From d470a2dfb78e26969d7251402d5cdfdd5e4a87eb Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 22:06:13 -0400 Subject: [PATCH 026/251] Migrated to new Crashlytics SDK (Android) --- android/app/build.gradle | 3 +-- android/build.gradle | 5 +---- lib/src/services/crashlytics/mobile.dart | 11 ++++++----- lib/src/services/crashlytics/stub.dart | 2 ++ pubspec.lock | 23 +++++++++++++++-------- pubspec.yaml | 18 ++++++++++-------- 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 3ccae6a38..ed9e85338 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -28,7 +28,7 @@ if (keystorePropertiesFile.exists()) { } apply plugin: 'com.android.application' -apply plugin: 'io.fabric' +apply plugin: 'com.google.firebase.crashlytics' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { @@ -83,7 +83,6 @@ flutter { } dependencies { - implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' implementation 'com.google.firebase:firebase-analytics:17.2.0' implementation 'com.google.firebase:firebase-auth:18.1.0' implementation 'com.google.firebase:firebase-core:17.0.1' diff --git a/android/build.gradle b/android/build.gradle index 04abeaf4c..dccc5cd67 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,15 +2,12 @@ buildscript { repositories { google() jcenter() - maven { - url 'https://maven.fabric.io/public' - } } dependencies { + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0' classpath 'com.android.tools.build:gradle:3.5.1' classpath 'com.google.gms:google-services:4.3.0' - classpath 'io.fabric.tools:gradle:1.31.1' } } diff --git a/lib/src/services/crashlytics/mobile.dart b/lib/src/services/crashlytics/mobile.dart index 5576e5746..6ca6fed7e 100644 --- a/lib/src/services/crashlytics/mobile.dart +++ b/lib/src/services/crashlytics/mobile.dart @@ -1,20 +1,21 @@ -import "package:firebase_crashlytics/firebase_crashlytics.dart" as fb; +import "package:firebase_crashlytics/firebase_crashlytics.dart"; import "package:flutter/foundation.dart"; class Crashlytics { + static FirebaseCrashlytics firebase = FirebaseCrashlytics.instance; static Future recordError ( dynamic exception, StackTrace stack, {dynamic context} - ) => fb.Crashlytics.instance.recordError(exception, stack, context: context); + ) => firebase.recordError(exception, stack); static Future recordFlutterError ( FlutterErrorDetails details - ) => fb.Crashlytics.instance.recordFlutterError(details); + ) => firebase.recordFlutterError(details); static Future setUserEmail(String email) => - fb.Crashlytics.instance.setUserEmail(email); + firebase.setUserIdentifier(email); static void log(String message) => - fb.Crashlytics.instance.log(message); + firebase.log(message); } diff --git a/lib/src/services/crashlytics/stub.dart b/lib/src/services/crashlytics/stub.dart index 855c5ff99..602e89225 100644 --- a/lib/src/services/crashlytics/stub.dart +++ b/lib/src/services/crashlytics/stub.dart @@ -1,6 +1,8 @@ import "package:flutter/foundation.dart"; class Crashlytics { + static dynamic firebase; + static Future recordError ( dynamic exception, StackTrace stack, diff --git a/pubspec.lock b/pubspec.lock index e02f58ca4..8e6e52954 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -56,21 +56,21 @@ packages: name: cloud_firestore url: "https://pub.dartlang.org" source: hosted - version: "0.14.0+2" + version: "0.14.1+3" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.2" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "0.2.0+1" + version: "0.2.0+4" collection: dependency: transitive description: @@ -119,28 +119,28 @@ packages: name: firebase_auth url: "https://pub.dartlang.org" source: hosted - version: "0.18.0+1" + version: "0.18.1+2" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.1" firebase_auth_web: dependency: transitive description: name: firebase_auth_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.3.1+1" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "0.5.0" + version: "0.5.0+1" firebase_core_platform_interface: dependency: transitive description: @@ -161,7 +161,14 @@ packages: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "0.1.4+1" + version: "0.2.1+1" + firebase_crashlytics_platform_interface: + dependency: transitive + description: + name: firebase_crashlytics_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" firebase_messaging: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 41f99df29..7ce059d61 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,17 +15,19 @@ environment: dependencies: flutter: sdk: flutter - url_launcher: ^5.2.5 - path_provider: ^1.4.4 - shared_preferences: ^0.5.4 - cloud_firestore: ^0.14.0 - firebase_auth: ^0.18.0+1 - google_sign_in: ^4.5.1 + # Firebase/Google + cloud_firestore: ^0.14.1+3 + firebase_auth: ^0.18.1+2 + firebase_crashlytics: ^0.2.1+1 firebase_messaging: ^6.0.1 + google_sign_in: ^4.5.1 + # Misc flutter_local_notifications: ^0.8.4+3 - firebase_crashlytics: ^0.1.1+2 idb_shim: ^1.12.0 - + path_provider: ^1.4.4 + shared_preferences: ^0.5.4 + url_launcher: ^5.2.5 + # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. #cupertino_icons: ^0.1.2 From daedce7400a41da02bc7d617ca9265a113b0baf3 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 22:09:05 -0400 Subject: [PATCH 027/251] Changed name to RamLife (iOS, Android) --- android/app/src/main/AndroidManifest.xml | 2 +- ios/Runner/Info.plist | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 21e9d7cf0..fac8a3c6f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ FlutterApplication and put your custom class here. --> diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index f21b783f5..40cdeaf37 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -11,7 +11,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - Ram Life + RamLife CFBundlePackageType APPL CFBundleShortVersionString From 42e4ec334520a8b2cf853781e23ed1629ee61487 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 22:28:48 -0400 Subject: [PATCH 028/251] Migrated to new Android Embedding (v2) --- android/app/src/main/AndroidManifest.xml | 20 ++++++++++++------- .../com/ramaz/student_life/MainActivity.java | 10 ++-------- android/app/src/main/res/values/styles.xml | 7 +++++++ 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index fac8a3c6f..f564d854f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -12,11 +12,14 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> + + @@ -40,13 +43,16 @@ android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> - + + + + + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme"/> + diff --git a/android/app/src/main/java/com/ramaz/student_life/MainActivity.java b/android/app/src/main/java/com/ramaz/student_life/MainActivity.java index 8f617bcbb..e232ca63b 100644 --- a/android/app/src/main/java/com/ramaz/student_life/MainActivity.java +++ b/android/app/src/main/java/com/ramaz/student_life/MainActivity.java @@ -1,13 +1,7 @@ package com.ramaz.student_life; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.embedding.android.FlutterActivity; public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } + } diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 59e7b3310..8e50bf17b 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -12,4 +12,11 @@ + + From 7e7830c2d40be4f69fa24d75c66a761781ebbf50 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Oct 2020 23:46:17 -0400 Subject: [PATCH 029/251] Made HomePage stateless --- lib/models.dart | 4 +- lib/src/models/view/home.dart | 34 -------------- lib/src/pages/home.dart | 88 +++++++++++++---------------------- 3 files changed, 36 insertions(+), 90 deletions(-) delete mode 100644 lib/src/models/view/home.dart diff --git a/lib/models.dart b/lib/models.dart index dbc71ff52..46c275d82 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -42,7 +42,6 @@ export "src/models/view/builders/reminder_builder.dart"; export "src/models/view/builders/special_builder.dart"; export "src/models/view/builders/sports_builder.dart"; export "src/models/view/feedback.dart"; -export "src/models/view/home.dart"; export "src/models/view/schedule.dart"; export "src/models/view/sports.dart"; @@ -69,6 +68,9 @@ class Models { } static void reset() { + schedule?.dispose(); + reminders?.dispose(); + sports?.dispose(); reminders = null; schedule = null; sports = null; diff --git a/lib/src/models/view/home.dart b/lib/src/models/view/home.dart deleted file mode 100644 index 5ca9fa25e..000000000 --- a/lib/src/models/view/home.dart +++ /dev/null @@ -1,34 +0,0 @@ -import "package:flutter/foundation.dart"; - -import "package:ramaz/models.dart"; - -/// A ViewModel for the home page. -/// -/// The home page does not actually need it's own ViewModel -- it pulls data -/// from other DataModels. But (currently), there is no efficient way for a -/// widget to listen to more than one DataModel, this ViewModel was made to -/// consolidate them into a single listener. -// ignore: prefer_mixin -class HomeModel with ChangeNotifier { - /// The schedule data model. - final Schedule schedule; - - /// The sports data model. - final Sports sports; - - /// Creates a ViewModel for the home screen. - HomeModel() : - schedule = Models.schedule, - sports = Models.sports - { - schedule.addListener(notifyListeners); - sports.addListener(notifyListeners); - } - - @override - void dispose() { - schedule.removeListener(notifyListeners); - sports.removeListener(notifyListeners); - super.dispose(); - } -} diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index fa02ab27c..0f2fc47e8 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -8,41 +8,21 @@ import "package:ramaz/services.dart"; import "package:ramaz/widgets.dart"; /// The homepage of the app. -/// -/// It's stateful because when refreshing the schedule a loading bar is shown, -/// and needs to be dismissed. However, it can be rewritten to use a -/// [ValueNotifier] instead. -class HomePage extends StatefulWidget { - @override - HomePageState createState() => HomePageState(); -} - -/// A state for the home page, to keep track of when the page loads. -class HomePageState extends State { - /// A key to access the [Scaffold]s state. - final GlobalKey scaffoldKey = GlobalKey(); - - /// Whether the page is loading. - bool loading = false; - +class HomePage extends StatelessWidget { /// Downloads the calendar again and calls [Schedule.onNewPeriod]. - Future refresh() async { + Future refresh(BuildContext context) async { try { await Services.instance.updateCalendar(); await Services.instance.updateSports(); await Models.schedule.initCalendar(); } on PlatformException catch(error) { if (error.code == "Error performing get") { - scaffoldKey.currentState.showSnackBar( + Scaffold.of(context).showSnackBar( SnackBar( content: const Text("No Internet"), action: SnackBarAction( label: "RETRY", - onPressed: () async { - setState(() => loading = true); - await refresh(); - setState(() => loading = false); - } + onPressed: () => refresh(context), ), ) ); @@ -51,14 +31,13 @@ class HomePageState extends State { } @override - Widget build (BuildContext context) => ModelListener( - model: () => HomeModel(), - builder: (BuildContext context, HomeModel model, _) => Scaffold ( - key: scaffoldKey, + Widget build (BuildContext context) => AnimatedBuilder( + animation: Listenable.merge([Models.schedule, Models.sports]), + builder: (BuildContext context, _) => Scaffold ( appBar: AppBar ( title: const Text ("Home"), actions: [ - if (model.schedule.hasSchool) Builder ( + if (Models.schedule.hasSchool) Builder ( builder: (BuildContext context) => FlatButton( textColor: Colors.white, onPressed: () => Scaffold.of(context).openEndDrawer(), @@ -68,55 +47,54 @@ class HomePageState extends State { ], ), drawer: NavigationDrawer(), - endDrawer: !model.schedule.hasSchool ? null : Drawer ( + endDrawer: !Models.schedule.hasSchool ? null : Drawer ( child: ClassList( - day: model.schedule.today, - periods: model.schedule.nextPeriod == null - ? model.schedule.periods - : model.schedule.periods.getRange ( - (model.schedule.periodIndex ?? -1) + 1, - model.schedule.periods.length + day: Models.schedule.today, + periods: Models.schedule.nextPeriod == null + ? Models.schedule.periods + : Models.schedule.periods.getRange ( + (Models.schedule.periodIndex ?? -1) + 1, + Models.schedule.periods.length ), - headerText: model.schedule.period == null + headerText: Models.schedule.period == null ? "Today's Schedule" : "Upcoming Classes" ) ), body: RefreshIndicator ( // so you can refresh the period - onRefresh: refresh, + onRefresh: () => refresh(context), child: ListView ( children: [ - if (loading) const LinearProgressIndicator(), RamazLogos.ramRectangle, const Divider(), Text ( - model.schedule.hasSchool - ? "Today is a${model.schedule.today.n} " - "${model.schedule.today.name}" - "\nSchedule: ${model.schedule.today.special.name}" + Models.schedule.hasSchool + ? "Today is a${Models.schedule.today.n} " + "${Models.schedule.today.name}" + "\nSchedule: ${Models.schedule.today.special.name}" : "There is no school today", textScaleFactor: 2, textAlign: TextAlign.center ), const SizedBox (height: 20), - if (model.schedule.hasSchool) NextClass( + if (Models.schedule.hasSchool) NextClass( reminders: Models.reminders.currentReminders, - period: model.schedule.period, - subject: model.schedule.subjects [model.schedule.period?.id], - modified: model.schedule.today.isModified, + period: Models.schedule.period, + subject: Models.schedule.subjects [Models.schedule.period?.id], + modified: Models.schedule.today.isModified, ), // if school won't be over, show the next class if ( - model.schedule.nextPeriod != null && - !model.schedule.today.isModified + Models.schedule.nextPeriod != null && + !Models.schedule.today.isModified ) NextClass ( next: true, reminders: Models.reminders.nextReminders, - period: model.schedule.nextPeriod, - subject: model.schedule.subjects [model.schedule.nextPeriod?.id], - modified: model.schedule.today.isModified, + period: Models.schedule.nextPeriod, + subject: Models.schedule.subjects [Models.schedule.nextPeriod?.id], + modified: Models.schedule.today.isModified, ), - if (model.sports.todayGames.isNotEmpty) ...[ + if (Models.sports.todayGames.isNotEmpty) ...[ const SizedBox(height: 10), const Center( child: Text( @@ -126,8 +104,8 @@ class HomePageState extends State { ) ), const SizedBox(height: 10), - for (final int index in model.sports.todayGames) - SportsTile(model.sports.games [index]) + for (final int index in Models.sports.todayGames) + SportsTile(Models.sports.games [index]) ] ] ) From 9918f253481041b4e0187d02b4486a666e890c2a Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 00:37:59 -0400 Subject: [PATCH 030/251] Cleaned Student.getPeriods --- lib/src/data/student.dart | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/lib/src/data/student.dart b/lib/src/data/student.dart index 38b25b78d..fb79d0d7b 100644 --- a/lib/src/data/student.dart +++ b/lib/src/data/student.dart @@ -87,30 +87,10 @@ class Student { return []; } - // Get indices for `schedule [day.name]`, keeping skipped periods in mind int periodIndex = 0; - final List periodIndices = []; final Map activities = day.special.activities ?? {}; - // TODO: Remove this line. - // final Special special = day.isModified - // ? Day.specials [day.letter] - // : day.special; final Special special = day.special; - for (int index = 0; index < special.periods.length; index++) { - // if (special.skip?.contains(index) ?? false) - // periodIndex++; - // while (special?.skip?.contains(periodIndex + 1) ?? false) { - // periodIndex++; - // } - periodIndices.add( - special.homeroom == index - || special.mincha == index - || (special.skip?.contains(index) ?? false) - ? null - : periodIndex++ - ); - } // Loop over all the periods and assign each one a Period. return [ for (int index = 0; index < special.periods.length; index++) @@ -126,7 +106,7 @@ class Student { day.isModified ? null : special.periods [index], activity: activities ["Mincha"], ) - else if (periodIndices [index] == null) + else if (special.skip.contains(index)) Period( PeriodData.free, time: day.isModified ? null : special.periods [index], @@ -134,10 +114,10 @@ class Student { activity: null, ) else Period( - schedule [day.name] [periodIndices [index]] ?? PeriodData.free, + schedule [day.name] [periodIndex] ?? PeriodData.free, time: day.isModified ? null : special.periods [index], - period: (periodIndices [index] + 1).toString(), - activity: activities [(periodIndices [index] + 1).toString()] + period: (++periodIndex).toString(), + activity: activities [(periodIndex).toString()] ) ]; } From b9b8de8a6cce87fa74b39db6bb19442c6031d896 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 00:38:27 -0400 Subject: [PATCH 031/251] Documented data library --- lib/src/data/admin.dart | 3 +++ lib/src/data/times.dart | 1 + 2 files changed, 4 insertions(+) diff --git a/lib/src/data/admin.dart b/lib/src/data/admin.dart index ea830568b..42eb4d8aa 100644 --- a/lib/src/data/admin.dart +++ b/lib/src/data/admin.dart @@ -40,6 +40,9 @@ class Admin { /// These can be saved so the admin does not have to recreate them. final List specials; + /// This user's email. + /// + /// This is needed here so it can be indexed in a database. final String email; /// Creates a user with administrative privileges. diff --git a/lib/src/data/times.dart b/lib/src/data/times.dart index 1b33d8f5e..f44dd3d0c 100644 --- a/lib/src/data/times.dart +++ b/lib/src/data/times.dart @@ -412,6 +412,7 @@ class Special { "homeroom": homeroom, }; + /// The shorter schedule for the Covid-19 pandemic. static const Special covid = Special( "COVID-19", [ From 6aba893479ab6afa36864516820d175ae589136b Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 01:43:51 -0400 Subject: [PATCH 032/251] Organized Services into Services and Databases --- lib/main.dart | 18 ++-- lib/services.dart | 151 +++------------------------- lib/src/services/cloud_db.dart | 38 +++---- lib/src/services/databases.dart | 118 ++++++++++++++++++++++ lib/src/services/fcm/mobile.dart | 18 ++++ lib/src/services/firebase_core.dart | 12 +++ lib/src/services/local_db.dart | 92 +++++++---------- lib/src/services/preferences.dart | 15 ++- lib/src/services/reader.dart | 149 --------------------------- lib/src/services/service.dart | 50 ++++----- 10 files changed, 255 insertions(+), 406 deletions(-) create mode 100644 lib/src/services/databases.dart create mode 100644 lib/src/services/firebase_core.dart delete mode 100644 lib/src/services/reader.dart diff --git a/lib/main.dart b/lib/main.dart index 18ab08e09..0d0929567 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -25,12 +25,10 @@ Future main({bool restart = false}) async { await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); // This initializes services -- it is always safe. - await Services.init(); - bool isReady; + await Services.instance.init(); + final bool isSignedIn = await Services.instance.database.isSignedIn; try { - isReady = await Services.instance.isReady; - // Checks whther services are ready -- REALLY shouldn't error, but might - if (isReady) { + if (isSignedIn) { // This initializes data models -- it may error. await Models.init(); } @@ -40,7 +38,7 @@ Future main({bool restart = false}) async { debugPrint("Error on main."); if (!restart) { debugPrint("Trying again..."); - await Services.instance.reset(); + await Services.instance.database.signOut(); return main(restart: true); } else { rethrow; @@ -60,7 +58,7 @@ Future main({bool restart = false}) async { runZoned( () => runApp ( RamazApp ( - isReady: isReady, + isSignedIn: isSignedIn, brightness: brightness, ) ), @@ -70,7 +68,7 @@ Future main({bool restart = false}) async { /// The main app widget. class RamazApp extends StatelessWidget { - final bool isReady; + final bool isSignedIn; /// The brightness to default to. final Brightness brightness; @@ -78,7 +76,7 @@ class RamazApp extends StatelessWidget { /// Creates the main app widget. const RamazApp ({ @required this.brightness, - @required this.isReady, + @required this.isSignedIn, }); @override @@ -130,7 +128,7 @@ class RamazApp extends StatelessWidget { ), ), builder: (BuildContext context, ThemeData theme) => MaterialApp ( - home: isReady ? HomePage() : Login(), + home: isSignedIn ? HomePage() : Login(), title: "Ram Life", color: RamazColors.blue, theme: theme, diff --git a/lib/services.dart b/lib/services.dart index fc4275137..7ab9e111b 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -15,163 +15,44 @@ /// library ramaz_services; -import "package:firebase_core/firebase_core.dart"; -import "package:shared_preferences/shared_preferences.dart"; - -import "src/services/auth.dart"; -import "src/services/cloud_db.dart"; -import "src/services/fcm.dart"; -import "src/services/local_db.dart"; +import "src/services/databases.dart"; import "src/services/preferences.dart"; import "src/services/service.dart"; export "src/services/auth.dart"; export "src/services/cloud_db.dart"; export "src/services/crashlytics.dart"; +export "src/services/databases.dart"; export "src/services/notifications.dart"; export "src/services/preferences.dart"; class Services implements Service { /// The singleton instance of this class. - static Services instance; - - static Future init() async { - await Firebase.initializeApp(); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - Services.instance = Services(prefs); - } + static Services instance = Services(); - final Preferences prefs; + final Preferences prefs = Preferences(); + final Databases database = Databases(); - /// Provides a connection to the online database. - final CloudDatabase cloudDatabase = CloudDatabase(); + List services; - /// The local device storage. + /// Bundles services together. /// - /// Used to minimize the number of requests to the database and keep the app - /// offline-first. - final LocalDatabase localDatabase; - - /// Creates a wrapper around the services. - Services(SharedPreferences prefs) : - prefs = Preferences(prefs), - localDatabase = LocalDatabase(); - - @override - Future get isReady async { - // This can be shortened but DON'T - // - // The && operator short-circuits -- meaning if cloudDatabase is not ready - // then this getter won't even check localdatabase. But the [isReady] getter - // also doubles as a setup method, so it NEEDS to be called. - // - // Doing it this way ensures that all services will be setup even if a [reset] - // is needed - final bool cloudIsReady = await cloudDatabase.isReady; - final bool localIsReady = await localDatabase.isReady; - return cloudIsReady && localIsReady; + /// Also initializes [services]. + Services() { + services = [prefs, database]; } @override - Future reset() async { - await localDatabase.reset(); - await cloudDatabase.reset(); - } - - @override - Future initialize() async { - await cloudDatabase.initialize(); - - await localDatabase.setUser(await cloudDatabase.user); - await localDatabase.setReminders(await cloudDatabase.reminders); - - await updateSports(); - await updateCalendar(); - - if (await Auth.isAdmin) { - await localDatabase.setAdmin(await cloudDatabase.admin); + Future init() async { + for (final Service service in services) { + await service.init(); } - - // Register for FCM notifications. - // We don't care when this happens - // ignore: unawaited_futures - Future( - () async { - await FCM.registerNotifications( - { - "refresh": initialize, - "updateCalendar": updateCalendar, - "updateSports": updateSports, - } - ); - await FCM.subscribeToTopics(); - } - ); - } - - @override - Future> get user => localDatabase.user; - - @override - Future setUser(_) async {} // user cannot modify data - - @override - Future>> getSections(Set ids) async { - Map> result = - await localDatabase.getSections(ids); - if (result.values.every((value) => value == null)) { - result = await cloudDatabase.getSections(ids); - await localDatabase.setSections(result); - } - return result; - } - - @override - Future setSections(_) async {} // user cannot modify sections - - @override - Future>>> get calendar => - localDatabase.calendar; - - @override - Future setCalendar(int month, Map json) async { - await cloudDatabase.setCalendar(month, json); - await localDatabase.setCalendar(month, json); - } - - @override - Future>> get reminders => localDatabase.reminders; - - @override - Future setReminders(List> json) async { - await cloudDatabase.setReminders(json); - await localDatabase.setReminders(json); } @override - Future> get admin => localDatabase.admin; - - @override - Future setAdmin(Map json) async { - await cloudDatabase.setAdmin(json); - await localDatabase.setAdmin(json); - } - - @override - Future>> get sports => localDatabase.sports; - - @override - Future setSports(List> json) async { - await cloudDatabase.setSports(json); - await localDatabase.setSports(json); - } - - Future updateCalendar() async { - for (int month = 1; month <= 12; month++) { - await localDatabase.setCalendar(month, await cloudDatabase.getMonth(month)); + Future signIn() async { + for (final Service service in services) { + await service.signIn(); } } - - Future updateSports() async => - localDatabase.setSports(await cloudDatabase.sports); } diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index 5d42d26cf..44d5b3c8d 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -1,10 +1,11 @@ import "package:cloud_firestore/cloud_firestore.dart"; import "auth.dart"; +import "firebase_core.dart"; import "service.dart"; /// A wrapper around Cloud Firestore. -class CloudDatabase implements Service { +class CloudDatabase extends Database { static final DateTime _now = DateTime.now(); /// The [FirebaseFirestore service]. @@ -55,7 +56,7 @@ class CloudDatabase implements Service { /// Each document has its month's data in the [calendarKey] field. /// /// Do not access documents in this collection directly. - /// Instead, use [calendar] or [getMonth]. + /// Instead, use [calendar] or [getCalendarMonth]. static final CollectionReference calendarCollection = firestore.collection("calendar"); @@ -114,15 +115,16 @@ class CloudDatabase implements Service { : "${_now.year - 1}-${_now.year}" ); - @override - Future get isReady async => Auth.isReady; + // Service methods @override - Future reset() => Auth.signOut(); + Future init() => FirebaseCore.init(); - /// Signs the user in, and initializes their reminders. + /// Signs the user in. + /// + /// If the user does not have a reminders document, this function creates it. @override - Future initialize() async { + Future signIn() async { if (Auth.isReady) { return; } @@ -133,6 +135,14 @@ class CloudDatabase implements Service { } } + // Database methods. + + @override + Future get isSignedIn async => Auth.isReady; + + @override + Future signOut() => Auth.signOut(); + @override Future> get user async { final DocumentSnapshot snapshot = await userDocument.get(); @@ -169,24 +179,14 @@ class CloudDatabase implements Service { @override Future setSections(Map> json) async {} - /// Gets a month of the calendar. - /// - /// Do not use directly. Use [calendar]. - Future> getMonth(int month) async { + @override + Future> getCalendarMonth(int month) async { final DocumentReference document = calendarCollection.doc(month.toString()); final DocumentSnapshot snapshot = await document.get(); final Map data = snapshot.data(); return data; } - @override - Future>>> get calendar async => [ - for (int month = 1; month <= 12; month++) - for (final dynamic json in (await getMonth(month)) [calendarKey]) [ - Map.from(json) - ] - ]; - @override Future setCalendar(int month, Map json) => calendarCollection.doc(month.toString()).set(json); diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart new file mode 100644 index 000000000..c5f5cc892 --- /dev/null +++ b/lib/src/services/databases.dart @@ -0,0 +1,118 @@ +import "auth.dart"; +import "cloud_db.dart"; +import "local_db.dart"; +import "service.dart"; + +class Databases extends Database { + /// Provides a connection to the online database. + final CloudDatabase cloudDatabase = CloudDatabase(); + + /// The local device storage. + /// + /// Used to minimize the number of requests to the database and keep the app + /// offline-first. + final LocalDatabase localDatabase = LocalDatabase(); + + @override + Future init() async { + await cloudDatabase.init(); + await localDatabase.init(); + } + + @override + Future signIn() async { + await cloudDatabase.signIn(); + await localDatabase.signIn(); + + await localDatabase.setUser(await cloudDatabase.user); + await localDatabase.setReminders(await cloudDatabase.reminders); + await updateCalendar(); + + if (await Auth.isAdmin) { + await localDatabase.setAdmin(await cloudDatabase.admin); + } + } + + Future updateCalendar() async { + for (int month = 1; month <= 12; month++) { + await localDatabase.setCalendar( + month, + await cloudDatabase.getCalendarMonth(month) + ); + } + } + + Future updateSports() async { + await localDatabase.setSports(await cloudDatabase.sports); + } + + @override + Future get isSignedIn async => + (await cloudDatabase.isSignedIn) && (await localDatabase.isSignedIn); + + @override + Future signOut() async { + await cloudDatabase.signOut(); + await localDatabase.signOut(); + } + + @override + Future> get user => localDatabase.user; + + @override + Future setUser(Map json) async {} + + @override + Future>> getSections(Set ids) async { + Map> result = + await localDatabase.getSections(ids); + if (result.values.every((value) => value == null)) { + result = await cloudDatabase.getSections(ids); + await localDatabase.setSections(result); + } + return result; + } + + @override + Future setSections( + Map> json + ) async {} // user cannot modify sections + + @override + Future> getCalendarMonth(int month) => + localDatabase.getCalendarMonth(month); + + @override + Future setCalendar(int month, Map json) async { + await cloudDatabase.setCalendar(month, json); + await localDatabase.setCalendar(month, json); + } + + @override + Future>> get reminders => localDatabase.reminders; + + @override + Future setReminders(List> json) async { + await cloudDatabase.setReminders(json); + await localDatabase.setReminders(json); + } + + @override + Future> get admin => localDatabase.admin; + + @override + Future setAdmin(Map json) async { + await cloudDatabase.setAdmin(json); + await localDatabase.setAdmin(json); + } + + + @override + Future>> get sports => localDatabase.sports; + + @override + Future setSports(List> json) async { + await cloudDatabase.setSports(json); + await localDatabase.setSports(json); + } +} \ No newline at end of file diff --git a/lib/src/services/fcm/mobile.dart b/lib/src/services/fcm/mobile.dart index 2516a5381..c6aa9a034 100644 --- a/lib/src/services/fcm/mobile.dart +++ b/lib/src/services/fcm/mobile.dart @@ -95,4 +95,22 @@ class FCM { await _firebase.subscribeToTopic(topic); } } + + Future init() async { + // Register for FCM notifications. + // We don't care when this happens + // ignore: unawaited_futures + Future( + () async { + await FCM.registerNotifications( + { + // "refresh": initialize, + // "updateCalendar": updateCalendar, + // "updateSports": updateSports, + } + ); + await FCM.subscribeToTopics(); + } + ); + } } diff --git a/lib/src/services/firebase_core.dart b/lib/src/services/firebase_core.dart new file mode 100644 index 000000000..2bedc9ff4 --- /dev/null +++ b/lib/src/services/firebase_core.dart @@ -0,0 +1,12 @@ +import "package:firebase_core/firebase_core.dart"; + +class FirebaseCore { + static bool initialized = false; + + static Future init() async { + if (!initialized) { + await Firebase.initializeApp(); + initialized = true; + } + } +} \ No newline at end of file diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index 06130ff58..c6a40e7b4 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -1,41 +1,41 @@ -import "package:idb_shim/idb_shim.dart"; +import "package:idb_shim/idb_shim.dart" as idb; import "auth.dart"; // for user email import "local_db/idb_factory.dart"; // for platform-specific database import "service.dart"; -/// Provides convenience methods around an [ObjectStore]. -extension ObjectExtension on ObjectStore { +/// Provides convenience methods around an [idb.ObjectStore]. +extension ObjectExtension on idb.ObjectStore { Future get(dynamic key) async => await getObject(key) as T; } /// Provides convenience methods on a [Database]. -extension DatabaseExtension on Database { +extension DatabaseExtension on idb.Database { Future get(String storeName, dynamic key) => - transaction(storeName, idbModeReadOnly) + transaction(storeName, idb.idbModeReadOnly) .objectStore(storeName) .get(key); Future add(String storeName, T value) => - transaction(storeName, idbModeReadWrite) + transaction(storeName, idb.idbModeReadWrite) .objectStore(storeName) .add(value); Future update(String storeName, T value) => - transaction(storeName, idbModeReadWrite) + transaction(storeName, idb.idbModeReadWrite) .objectStore(storeName) .put(value); Future>> getAll(String storeName) async => [ for ( final dynamic entry in - await transaction(storeName, idbModeReadOnly) + await transaction(storeName, idb.idbModeReadOnly) .objectStore(storeName).getAll() ) Map.from(entry) ]; } -class LocalDatabase implements Service { +class LocalDatabase extends Database { static const String userStoreName = "users"; static const String sectionStoreName = "sections"; static const String calendarStoreName = "calendar"; @@ -48,39 +48,9 @@ class LocalDatabase implements Service { adminStoreName, sportsStoreName, ]; - Database database; + idb.Database database; - @override - Future get isReady async { - database = await (await idbFactory).open( - "ramaz.db", - version: 1, - onUpgradeNeeded: (VersionChangeEvent event) { - database = event.database; // for access within [initialize]. - switch (event.oldVersion) { - case 0: // fresh install - initialize(); - break; - } - } - ); - return true; // if it weren't ready there would be an error - } - - /// Initializes the database. - /// - /// Simply opening the database is async, so that is done in [isReady], since - /// it is needed to initialize the service. However, modifying the database - /// is only allowed within [IdbFactory.open], so it cannot be held off until - /// login. Hence, this function should be omitted from the global service - /// manager's [initialize] function, and should instead be called from - /// within [isReady] (which is allowed, since it is async). - /// - /// Additionally, since the data itself is only provided in the service - /// manager's [initialize] function, this function doesn't have to worry about - /// retrieving data so much as structuring it. - @override - Future initialize() async => database + Future initialize(idb.Database database) async => database ..createObjectStore(userStoreName, keyPath: "email") ..createObjectStore(sectionStoreName, keyPath: "id") ..createObjectStore(calendarStoreName, keyPath: "month") @@ -88,10 +58,29 @@ class LocalDatabase implements Service { ..createObjectStore(adminStoreName, keyPath: "email") ..createObjectStore(sportsStoreName, autoIncrement: true); + @override + Future init() async => database = await (await idbFactory).open( + "ramaz.db", + version: 1, + onUpgradeNeeded: (idb.VersionChangeEvent event) { + switch (event.oldVersion) { + case 0: // fresh install + initialize(event.database); + break; + } + } + ); + + @override + Future signIn() async {} + + @override + Future get isSignedIn async => true; + @override - Future reset() async { - final Transaction transaction = - database.transactionList(storeNames, idbModeReadWrite); + Future signOut() async { + final idb.Transaction transaction = + database.transactionList(storeNames, idb.idbModeReadWrite); for (final String storeName in storeNames) { await transaction.objectStore(storeName).clear(); } @@ -123,20 +112,9 @@ class LocalDatabase implements Service { } } - Future>> getMonth(int month) async { - final Map json = - Map.from(await database.get(calendarStoreName, month)); - return [ - for (final dynamic entry in json ["calendar"]) - Map.from(entry) - ]; - } - @override - Future>>> get calendar async => [ - for (int month = 1; month <= 12; month++) - await getMonth(month) - ]; + Future> getCalendarMonth(int month) => + database.get(calendarStoreName, month); @override Future setCalendar(int month, Map json) async { diff --git a/lib/src/services/preferences.dart b/lib/src/services/preferences.dart index d6fe69165..9d4dbf7fb 100644 --- a/lib/src/services/preferences.dart +++ b/lib/src/services/preferences.dart @@ -1,14 +1,21 @@ import "package:shared_preferences/shared_preferences.dart"; +import "service.dart"; + /// An abstraction wrapper around the SharedPreferences plugin. /// /// The SharedPreferences plugin allows for quick and small key-value based /// storage, which can be very useful. -class Preferences { - final SharedPreferences _prefs; +class Preferences extends Service { + SharedPreferences _prefs; + + @override + Future init() async { + _prefs = await SharedPreferences.getInstance(); + } - /// Const constructor for this class. - const Preferences(this._prefs); + @override + Future signIn() async {} /// The key for if this is the first time or not. static const String firstTimeKey = "firstTime"; diff --git a/lib/src/services/reader.dart b/lib/src/services/reader.dart deleted file mode 100644 index fbfa155c6..000000000 --- a/lib/src/services/reader.dart +++ /dev/null @@ -1,149 +0,0 @@ -import "dart:convert"; -import "dart:io"; - -import "service.dart"; - -/// An abstraction around the file system. -/// -/// This class handles reading and writing JSON to and from files. -/// Note that only raw data should be used with this class. Using -/// dataclasses will create a dependency on the data library. -class LocalDatabase implements Service { - /// The path for this app's file directory. - /// - /// Every app is provided a unique path in the file system by the OS. - /// Performing operations on files in this directory does not require - /// extra permissions. In other words, data belonging exclusively to - /// an app should reside in its given directory. - final String dir; - - /// The file containing the user's schedule. - final File userFile; - - /// The file containing data for all the classes in the user's schedule. - final File subjectFile; - - /// The file containing the calendar. - final Directory calendarDir; - - /// The file containing the user's reminders. - final File remindersFile; - - /// The file containing the admin profile. - final File adminFile; - - /// The file containing the sports games. - final File sportsFile; - - /// Initializes the files based on the path ([dir]) provided to it. - LocalDatabase(this.dir) : - userFile = File("$dir/student.json"), - subjectFile = File("$dir/subjects.json"), - calendarDir = Directory("$dir/calendar"), - adminFile = File("$dir/admin.json"), - sportsFile = File("$dir/sports.json"), - remindersFile = File("$dir/reminders.json"); - - @override - Future get isReady async => userFile.existsSync() - && subjectFile.existsSync() - && calendarDir.existsSync() - && remindersFile.existsSync() - && adminFile.existsSync() - && sportsFile.existsSync(); - - @override - Future reset() async { - if (userFile.existsSync()) { - userFile.deleteSync(); - } - if (subjectFile.existsSync()) { - subjectFile.deleteSync(); - } - if (calendarDir.existsSync()) { - calendarDir.deleteSync(recursive: true); - } - if (remindersFile.existsSync()) { - remindersFile.deleteSync(); - } - if (adminFile.existsSync()) { - adminFile.deleteSync(); - } - if (sportsFile.existsSync()) { - sportsFile.deleteSync(); - } - } - - @override - Future initialize() async { - if (!calendarDir.existsSync()) { - calendarDir.createSync(); - } - } - - @override - Future> get user async => jsonDecode( - await userFile.readAsString() - ); - - @override - Future setUser(Map json) => - userFile.writeAsString(jsonEncode(json)); - - @override - Future>> getSections(_) async => - jsonDecode(await subjectFile.readAsString()) - .map>( - (String id, dynamic json) => - MapEntry(id, Map.from(jsonDecode(json))) - ); - - @override - Future setSections(Map> json) => - subjectFile.writeAsString(jsonEncode(json)); - - @override - Future>>> get calendar async => [ - for (int month = 1; month <= 12; month++) [ - for (final dynamic json in - jsonDecode( - await File("${calendarDir.path}/${month.toString()}.json").readAsString() - ) - ) Map.from(json) - ] - ]; - - @override - Future setCalendar(int month, Map json) async { - final File file = File("${calendarDir.path}/${month.toString()}.json"); - await file.writeAsString(jsonEncode(json)); - } - - @override - Future>> get reminders async => [ - for (final dynamic json in jsonDecode(await remindersFile.readAsString())) - Map.from(json) - ]; - - @override - Future setReminders(List> json) => - remindersFile.writeAsString(jsonEncode(json)); - - @override - Future> get admin async => - jsonDecode(await adminFile.readAsString()); - - @override - Future setAdmin(Map json) => - adminFile.writeAsString(jsonEncode(json)); - - @override - Future>> get sports async => [ - for (final dynamic json in jsonDecode(await sportsFile.readAsString())) - Map.from(json) - ]; - - @override - Future setSports(List> json) => - sportsFile.writeAsString(jsonEncode(json)); -} diff --git a/lib/src/services/service.dart b/lib/src/services/service.dart index 4492e00f4..6dc7eca44 100644 --- a/lib/src/services/service.dart +++ b/lib/src/services/service.dart @@ -1,36 +1,15 @@ -/// A data model for services. -/// -/// All services must implement this class. It serves two main functions: -/// -/// - Basic setup: the [isReady], [reset], and [initialize] methods. -/// - Data model: specifies which data is expected from the service. abstract class Service { - /// Whether this service is ready. - /// - /// If it's not ready, it was either never set up or misbehaving. - /// Call [reset] just in case. - Future get isReady; + Future init(); - /// Resets the service as if the app were just installed. - /// - /// While this may delete data from local storage, it should not wipe data - /// from off-device sources, such as the database. It's sole purpose is to - /// help the service respond again. - /// - /// [reset] may be called when [isReady] is false, so it should have built-in - /// error handling. - Future reset(); + Future signIn(); +} - /// Initializes the service. - /// - /// After calling this method, [isReady] should return true. - /// - /// Additionally, there may be other setup needed, that while may not be needed - /// for the service as a whole, may be done here as well. - /// - /// Note that this method will be called even when [isReady] is true, so make - /// make sure this function does not delete user data. - Future initialize(); +abstract class Database extends Service { + static const String calendarKey = "calendar"; + + Future get isSignedIn; + + Future signOut(); /// The user object as JSON Future> get user; @@ -47,7 +26,14 @@ abstract class Service { /// The calendar in JSON form. /// /// Admins can change this with [setCalendar]. - Future>>> get calendar; + Future>>> get calendar async => [ + for (int month = 1; month <= 12; month++) [ + for (final dynamic day in (await getCalendarMonth(month)) [calendarKey]) + Map.from(day) + ] + ]; + + Future> getCalendarMonth(int month); /// Changes the calendar in the database. /// @@ -80,4 +66,4 @@ abstract class Service { /// /// Only admins can change this. Future setSports(List> json); -} +} \ No newline at end of file From a8df7ee58d6386ee80dc6c37cbc4697f470cf5fd Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 01:44:09 -0400 Subject: [PATCH 033/251] Fixed models to handle new Service and Database --- lib/src/models/data/admin.dart | 2 +- lib/src/models/data/admin/calendar.dart | 2 +- lib/src/models/data/admin/user.dart | 2 +- lib/src/models/data/reminders.dart | 7 +++++-- lib/src/models/data/schedule.dart | 8 ++++---- lib/src/models/data/sports.dart | 4 ++-- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/src/models/data/admin.dart b/lib/src/models/data/admin.dart index 6035bd44c..d91ff08f8 100644 --- a/lib/src/models/data/admin.dart +++ b/lib/src/models/data/admin.dart @@ -17,7 +17,7 @@ class AdminModel { Future init() async { user = AdminUserModel( - json: await Services.instance.admin, + json: await Services.instance.database.admin, scopes: await Auth.adminScopes ); } diff --git a/lib/src/models/data/admin/calendar.dart b/lib/src/models/data/admin/calendar.dart index f00fc27a0..22fec15ce 100644 --- a/lib/src/models/data/admin/calendar.dart +++ b/lib/src/models/data/admin/calendar.dart @@ -99,7 +99,7 @@ class CalendarModel with ChangeNotifier { return; } calendar [date.month - 1] [date.day - 1] = day; - await Services.instance.setCalendar( + await Services.instance.database.setCalendar( date.month, { "calendar": Day.monthToJson(calendar [date.month - 1]), diff --git a/lib/src/models/data/admin/user.dart b/lib/src/models/data/admin/user.dart index 7ec96144c..11422bd4a 100644 --- a/lib/src/models/data/admin/user.dart +++ b/lib/src/models/data/admin/user.dart @@ -23,7 +23,7 @@ class AdminUserModel with ChangeNotifier { /// Saves the admin's data both to the device and the cloud. Future save() async { - await Services.instance.setAdmin(admin.toJson()); + await Services.instance.database.setAdmin(admin.toJson()); notifyListeners(); } diff --git a/lib/src/models/data/reminders.dart b/lib/src/models/data/reminders.dart index a23145306..aaaae0dd8 100644 --- a/lib/src/models/data/reminders.dart +++ b/lib/src/models/data/reminders.dart @@ -31,7 +31,10 @@ class Reminders with ChangeNotifier { /// Initializes the data model. Future init() async { reminders = [ - for (final Map json in await Services.instance.reminders) + for ( + final Map json in + await Services.instance.database.reminders + ) Reminder.fromJson(json) ]; readReminders = []; @@ -77,7 +80,7 @@ class Reminders with ChangeNotifier { for (final Reminder reminder in reminders) reminder.toJson() ]; - await Services.instance.setReminders(json); + await Services.instance.database.setReminders(json); } /// Checks if any reminders have been modified and removes them. diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index d41ad8525..c37a8f632 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -58,14 +58,14 @@ class Schedule with ChangeNotifier { /// /// Should be called whenever there is new data for this model to work with. Future init() async { - final Services services = Services.instance; - student = Student.fromJson(await services.user); - subjects = Subject.getSubjects(await services.getSections(student.getIds())); + final Databases database = Services.instance.database; + student = Student.fromJson(await database.user); + subjects = Subject.getSubjects(await database.getSections(student.getIds())); await initCalendar(); } Future initCalendar() async { - calendar = Day.getCalendar(await Services.instance.calendar); + calendar = Day.getCalendar(await Services.instance.database.calendar); setToday(); notifyListeners(); } diff --git a/lib/src/models/data/sports.dart b/lib/src/models/data/sports.dart index 8c8b644f9..f1d266fb7 100644 --- a/lib/src/models/data/sports.dart +++ b/lib/src/models/data/sports.dart @@ -33,7 +33,7 @@ class Sports with ChangeNotifier { /// Loads data from the device and Future init({bool refresh = false}) async { if (refresh) { - games = SportsGame.fromList(await Services.instance.sports); + games = SportsGame.fromList(await Services.instance.database.sports); todayGames = getTodayGames(); now = DateTime.now(); } else { @@ -86,5 +86,5 @@ class Sports with ChangeNotifier { /// /// Used in any database CRUD methods. Future saveGames() => - Services.instance.setSports(SportsGame.getJsonList(games)); + Services.instance.database.setSports(SportsGame.getJsonList(games)); } \ No newline at end of file From 99d5bc60b05047ab2e72fcb499c0d504a12c33b8 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 01:44:18 -0400 Subject: [PATCH 034/251] Fixed pages to handle new Service and Database --- lib/src/pages/home.dart | 4 ++-- lib/src/pages/login.dart | 6 +++--- lib/src/pages/sports.dart | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index 0f2fc47e8..cff33e1da 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -12,8 +12,8 @@ class HomePage extends StatelessWidget { /// Downloads the calendar again and calls [Schedule.onNewPeriod]. Future refresh(BuildContext context) async { try { - await Services.instance.updateCalendar(); - await Services.instance.updateSports(); + await Services.instance.database.updateCalendar(); + await Services.instance.database.updateSports(); await Models.schedule.initCalendar(); } on PlatformException catch(error) { if (error.code == "Error performing get") { diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index 707a41b92..24199afda 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -36,7 +36,7 @@ class LoginState extends State { super.initState(); // "To log in, one must first log out" // -- Levi Lesches, class of '21, creator of this app, 2019 - Services.instance.reset(); + Services.instance.database.signOut(); Models.reset(); } @@ -91,7 +91,7 @@ class LoginState extends State { /// the user from logging in. Future onError(dynamic error, StackTrace stack) async { setState(() => isLoading = false); - await Services.instance.reset(); + await Services.instance.database.signOut(); Models.reset(); // ignore: unawaited_futures showDialog ( @@ -157,7 +157,7 @@ class LoginState extends State { BuildContext scaffoldContext ) => safely( function: () async { - await Services.instance.initialize(); + await Services.instance.signIn(); await Models.init(); }, onSuccess: () => Navigator.of(context).pushReplacementNamed("home"), diff --git a/lib/src/pages/sports.dart b/lib/src/pages/sports.dart index 0ea4932ff..93936e86d 100644 --- a/lib/src/pages/sports.dart +++ b/lib/src/pages/sports.dart @@ -124,7 +124,7 @@ class SportsPage extends StatelessWidget { case SortOption.chronological: return GenericSportsView( loading: model.loading, - onRefresh: model.adminFunc(Services.instance.updateSports), + onRefresh: model.adminFunc(Services.instance.database.updateSports), recents: model.recents, upcoming: model.upcoming, builder: (int index) => SportsTile( @@ -139,7 +139,7 @@ class SportsPage extends StatelessWidget { case SortOption.sport: return GenericSportsView>>( loading: model.loading, - onRefresh: model.adminFunc(Services.instance.updateSports), + onRefresh: model.adminFunc(Services.instance.database.updateSports), recents: model.recentBySport.entries.toList(), upcoming: model.upcomingBySport.entries.toList(), builder: (MapEntry> entry) => Column( From dfc2f97968b9902546624187c7b3d0179b2ac19c Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 09:00:56 -0400 Subject: [PATCH 035/251] Disable Crashlytics during debug mode --- lib/main.dart | 6 ++++++ lib/src/services/crashlytics/mobile.dart | 4 ++++ lib/src/services/crashlytics/stub.dart | 3 +++ 3 files changed, 13 insertions(+) diff --git a/lib/main.dart b/lib/main.dart index 0d0929567..a34565c9b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,7 @@ import "dart:async" show runZoned; import "package:flutter/material.dart"; import "package:flutter/services.dart"; +import "package:flutter/foundation.dart"; import "package:ramaz/constants.dart"; // for route keys import "package:ramaz/models.dart"; @@ -53,6 +54,11 @@ Future main({bool restart = false}) async { : Brightness.dark; } + if (kDebugMode) { + // Turns Crashlyitcs off in debug mode. + await Crashlytics.toggle(false); + } + // Now we are ready to run the app (with error catching) FlutterError.onError = Crashlytics.recordFlutterError; runZoned( diff --git a/lib/src/services/crashlytics/mobile.dart b/lib/src/services/crashlytics/mobile.dart index 6ca6fed7e..305aefb55 100644 --- a/lib/src/services/crashlytics/mobile.dart +++ b/lib/src/services/crashlytics/mobile.dart @@ -18,4 +18,8 @@ class Crashlytics { static void log(String message) => firebase.log(message); + + // ignore: avoid_positional_boolean_parameters + static Future toggle(bool value) => + firebase.setCrashlyticsCollectionEnabled(value); } diff --git a/lib/src/services/crashlytics/stub.dart b/lib/src/services/crashlytics/stub.dart index 602e89225..8ebbd5444 100644 --- a/lib/src/services/crashlytics/stub.dart +++ b/lib/src/services/crashlytics/stub.dart @@ -16,4 +16,7 @@ class Crashlytics { static Future setUserEmail(String email) async {} static void log(String message) {} + + // ignore: avoid_positional_boolean_parameters + static Future toggle(bool value) async {} } From 939a9c7cd9cda656996e8e56d057563d6e0a6048 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 09:59:02 -0400 Subject: [PATCH 036/251] Reinstated HomeModel, properly this time --- lib/models.dart | 1 + lib/src/models/view/home.dart | 19 +++++++++++++++++++ lib/src/pages/home.dart | 6 +++--- 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 lib/src/models/view/home.dart diff --git a/lib/models.dart b/lib/models.dart index 46c275d82..45c693e1a 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -42,6 +42,7 @@ export "src/models/view/builders/reminder_builder.dart"; export "src/models/view/builders/special_builder.dart"; export "src/models/view/builders/sports_builder.dart"; export "src/models/view/feedback.dart"; +export "src/models/view/home.dart"; export "src/models/view/schedule.dart"; export "src/models/view/sports.dart"; diff --git a/lib/src/models/view/home.dart b/lib/src/models/view/home.dart new file mode 100644 index 000000000..726afe86f --- /dev/null +++ b/lib/src/models/view/home.dart @@ -0,0 +1,19 @@ +import "package:flutter/foundation.dart"; + +import "package:ramaz/models.dart"; + +// ignore: prefer_mixin +class HomeModel with ChangeNotifier { + // Do NOT use a list here. See null checks in [dispose]. + HomeModel() { + Models.schedule.addListener(notifyListeners); + Models.sports.addListener(notifyListeners); + } + + @override + void dispose() { + Models?.schedule?.dispose(); + Models?.sports?.dispose(); + super.dispose(); + } +} diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index cff33e1da..f16c87e62 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -31,9 +31,9 @@ class HomePage extends StatelessWidget { } @override - Widget build (BuildContext context) => AnimatedBuilder( - animation: Listenable.merge([Models.schedule, Models.sports]), - builder: (BuildContext context, _) => Scaffold ( + Widget build (BuildContext context) => ModelListener( + model: () => HomeModel(), + builder: (BuildContext context, _, __) => Scaffold ( appBar: AppBar ( title: const Text ("Home"), actions: [ From ca261cd5806d57fbed80f04020fe64fedf5a3a71 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 09:59:13 -0400 Subject: [PATCH 037/251] Refactored login page logic --- lib/src/pages/login.dart | 59 +++++++++++--------------------------- lib/src/services/auth.dart | 4 ++- 2 files changed, 19 insertions(+), 44 deletions(-) diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index 24199afda..72c648090 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -4,6 +4,7 @@ import "package:flutter/services.dart" show PlatformException; import "package:url_launcher/url_launcher.dart"; +import "package:ramaz/constants.dart"; import "package:ramaz/models.dart"; import "package:ramaz/services.dart"; import "package:ramaz/widgets.dart"; @@ -71,7 +72,7 @@ class LoginState extends State { builder: (BuildContext context) => ListTile ( leading: Logos.google, title: const Text ("Sign in with Google"), - onTap: () => googleLogin(context) // see func + onTap: () => signIn(context), ) ) ) @@ -91,6 +92,8 @@ class LoginState extends State { /// the user from logging in. Future onError(dynamic error, StackTrace stack) async { setState(() => isLoading = false); + Crashlytics.log("Attempted to log in"); + await Crashlytics.setUserEmail(Auth.email); await Services.instance.database.signOut(); Models.reset(); // ignore: unawaited_futures @@ -116,8 +119,6 @@ class LoginState extends State { ] ) ); - await Crashlytics.setUserEmail(Auth.email); - Crashlytics.log("Attempted to log in"); await Crashlytics.recordError(error, stack); } @@ -137,56 +138,28 @@ class LoginState extends State { Scaffold.of(scaffoldContext).showSnackBar ( const SnackBar (content: Text ("No Internet")), ); - setState(() => isLoading = false); - return; + return setState(() => isLoading = false); } else { - await onError(error, stack); - return; + return onError(error, stack); } - // ignore: avoid_catches_without_on_clauses - } catch (error, stack) { - await onError(error, stack); - return; + } on NoAccountException { + return setState(() => isLoading = false); + } catch (error, stack) { // ignore: avoid_catches_without_on_clauses + return onError(error, stack); } onSuccess(); } - /// Downloads the user data and initializes the app. - Future downloadData( - String username, - BuildContext scaffoldContext - ) => safely( + Future signIn(BuildContext scaffoldContext) => safely( + scaffoldContext: scaffoldContext, function: () async { + setState(() => isLoading = true); await Services.instance.signIn(); await Models.init(); }, - onSuccess: () => Navigator.of(context).pushReplacementNamed("home"), - scaffoldContext: scaffoldContext, - ); - - /// Signs the user into their Google account. - /// - /// If the user cancels the operation, cancel the loading animation. - /// Otherwise, download the user's data and start the main app. - /// See [downloadData]. - /// - /// This function needs two contexts. The first one can locate the - /// [Scaffold]. But since that will rebuild (because of the loading bar), - /// we need another context that is higher up the tree than that. - /// The tighter context is passed in as [scaffoldContext], and the higher - /// context is [State.context]. - Future googleLogin(BuildContext scaffoldContext) async => safely( - function: Auth.signIn, - onSuccess: () async { - setState(() => isLoading = true); - final String email = Auth.email; - if (email == null) { - setState(() => isLoading = false); - return; - } - await downloadData(email.toLowerCase(), scaffoldContext); + onSuccess: () { + setState(() => isLoading = false); + Navigator.of(context).pushReplacementNamed(Routes.home); }, - scaffoldContext: scaffoldContext, ); - } diff --git a/lib/src/services/auth.dart b/lib/src/services/auth.dart index e9373d82b..72ba38225 100644 --- a/lib/src/services/auth.dart +++ b/lib/src/services/auth.dart @@ -1,6 +1,8 @@ import "package:firebase_auth/firebase_auth.dart"; import "package:google_sign_in/google_sign_in.dart"; +class NoAccountException implements Exception {} + // ignore: avoid_classes_with_only_static_members /// An abstraction around FirebaseAuth. /// @@ -82,7 +84,7 @@ class Auth { static Future signIn() async { final GoogleSignInAccount googleAccount = await google.signIn(); if (googleAccount == null) { - return; + throw NoAccountException(); } final GoogleSignInAuthentication googleAuth = await googleAccount.authentication; From c396007e3a00a54f624be75865efe4679af89772 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 10:52:51 -0400 Subject: [PATCH 038/251] Fixed models dispose issues --- lib/src/models/view/home.dart | 4 ++-- lib/src/widgets/generic/model_listener.dart | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/src/models/view/home.dart b/lib/src/models/view/home.dart index 726afe86f..c32512192 100644 --- a/lib/src/models/view/home.dart +++ b/lib/src/models/view/home.dart @@ -12,8 +12,8 @@ class HomeModel with ChangeNotifier { @override void dispose() { - Models?.schedule?.dispose(); - Models?.sports?.dispose(); + Models?.schedule?.removeListener(notifyListeners); + Models?.sports?.removeListener(notifyListeners); super.dispose(); } } diff --git a/lib/src/widgets/generic/model_listener.dart b/lib/src/widgets/generic/model_listener.dart index 860d92200..34f869f82 100644 --- a/lib/src/widgets/generic/model_listener.dart +++ b/lib/src/widgets/generic/model_listener.dart @@ -60,7 +60,11 @@ class ModelListenerState } @override void dispose() { - model.removeListener(listener); + try { + model.removeListener(listener); + } catch(_) { // ignore: avoid_catches_without_on_clauses + // The model may have already been disposed. If so, we're good. + } if (widget.dispose) { model.dispose(); } From b144f9d960c79ce771c0cd214d0b7f262ae8365f Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 10:53:07 -0400 Subject: [PATCH 039/251] Fixed upper-case email bug --- lib/src/services/auth.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/services/auth.dart b/lib/src/services/auth.dart index 72ba38225..b78427c99 100644 --- a/lib/src/services/auth.dart +++ b/lib/src/services/auth.dart @@ -33,7 +33,7 @@ class Auth { static User get currentUser => auth.currentUser; /// The user's email. - static String get email => currentUser?.email; + static String get email => currentUser?.email?.toLowerCase(); /// The user's full name. static String get name => currentUser?.displayName; From b17f0f9db9969673b89197283802ae36a704e656 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 11:45:01 -0400 Subject: [PATCH 040/251] Turned Crashlytics into a Service --- lib/main.dart | 20 ++++++------- lib/services.dart | 2 ++ lib/src/pages/login.dart | 7 +++-- lib/src/services/crashlytics.dart | 27 ++++++++++++++++- lib/src/services/crashlytics/mobile.dart | 37 +++++++++++++++++++----- lib/src/services/crashlytics/stub.dart | 31 +++++++++++++------- 6 files changed, 92 insertions(+), 32 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index a34565c9b..08c076da2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,19 +14,17 @@ Future main({bool restart = false}) async { // This shows a splash screen but secretly // determines the desired `platformBrightness` Brightness brightness; - runZoned( - () => runApp ( - SplashScreen( - setBrightness: - (Brightness platform) => brightness = platform - ) - ), - onError: Crashlytics.recordError, + runApp( + SplashScreen( + setBrightness: + (Brightness platform) => brightness = platform + ) ); await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); // This initializes services -- it is always safe. await Services.instance.init(); + final Crashlytics crashlytics = Services.instance.crashlytics; final bool isSignedIn = await Services.instance.database.isSignedIn; try { if (isSignedIn) { @@ -56,11 +54,11 @@ Future main({bool restart = false}) async { if (kDebugMode) { // Turns Crashlyitcs off in debug mode. - await Crashlytics.toggle(false); + await crashlytics.toggle(false); } // Now we are ready to run the app (with error catching) - FlutterError.onError = Crashlytics.recordFlutterError; + FlutterError.onError = crashlytics.recordFlutterError; runZoned( () => runApp ( RamazApp ( @@ -68,7 +66,7 @@ Future main({bool restart = false}) async { brightness: brightness, ) ), - onError: Crashlytics.recordError, + onError: crashlytics.recordError, ); } diff --git a/lib/services.dart b/lib/services.dart index 7ab9e111b..a04f063bd 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -15,6 +15,7 @@ /// library ramaz_services; +import "src/services/crashlytics.dart"; import "src/services/databases.dart"; import "src/services/preferences.dart"; import "src/services/service.dart"; @@ -32,6 +33,7 @@ class Services implements Service { final Preferences prefs = Preferences(); final Databases database = Databases(); + final Crashlytics crashlytics = Crashlytics.instance; List services; diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index 72c648090..f54c4bd70 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -92,8 +92,9 @@ class LoginState extends State { /// the user from logging in. Future onError(dynamic error, StackTrace stack) async { setState(() => isLoading = false); - Crashlytics.log("Attempted to log in"); - await Crashlytics.setUserEmail(Auth.email); + final Crashlytics crashlytics = Services.instance.crashlytics; + await crashlytics.log("Attempted to log in"); + await crashlytics.setEmail(Auth.email); await Services.instance.database.signOut(); Models.reset(); // ignore: unawaited_futures @@ -119,7 +120,7 @@ class LoginState extends State { ] ) ); - await Crashlytics.recordError(error, stack); + await crashlytics.recordError(error, stack); } /// Safely execute a function. diff --git a/lib/src/services/crashlytics.dart b/lib/src/services/crashlytics.dart index 7488cc201..665e00b19 100644 --- a/lib/src/services/crashlytics.dart +++ b/lib/src/services/crashlytics.dart @@ -1,2 +1,27 @@ -export "crashlytics/stub.dart" +import "package:flutter/foundation.dart"; + +import "crashlytics/stub.dart" if (dart.library.io) "crashlytics/mobile.dart"; + +import "service.dart"; + +abstract class Crashlytics extends Service { + static Crashlytics instance = getCrashlytics(); + + bool didCrashLastTime = false; + + Future recordError( + dynamic exception, + StackTrace stack, + {dynamic context} + ); + + Future recordFlutterError(FlutterErrorDetails details); + + Future setEmail(String email); + + Future log(String message); + + // ignore: avoid_positional_boolean_parameters + Future toggle(bool value); +} \ No newline at end of file diff --git a/lib/src/services/crashlytics/mobile.dart b/lib/src/services/crashlytics/mobile.dart index 305aefb55..3c86ff870 100644 --- a/lib/src/services/crashlytics/mobile.dart +++ b/lib/src/services/crashlytics/mobile.dart @@ -1,25 +1,48 @@ -import "package:firebase_crashlytics/firebase_crashlytics.dart"; +import "package:firebase_crashlytics/firebase_crashlytics.dart" show FirebaseCrashlytics; import "package:flutter/foundation.dart"; -class Crashlytics { +import "../crashlytics.dart"; +import "../firebase_core.dart"; + +Crashlytics getCrashlytics() => CrashlyticsImplementation(); + +class CrashlyticsImplementation extends Crashlytics { static FirebaseCrashlytics firebase = FirebaseCrashlytics.instance; - static Future recordError ( + + @override + Future init() async { + await FirebaseCore.init(); + didCrashLastTime = await firebase.didCrashOnPreviousExecution(); + if (didCrashLastTime) { + await log("App crashed on last run"); + } + } + + @override + Future signIn() async {} + + @override + Future recordError ( dynamic exception, StackTrace stack, {dynamic context} ) => firebase.recordError(exception, stack); - static Future recordFlutterError ( + @override + Future recordFlutterError ( FlutterErrorDetails details ) => firebase.recordFlutterError(details); - static Future setUserEmail(String email) => + @override + Future setEmail(String email) => firebase.setUserIdentifier(email); - static void log(String message) => + @override + Future log(String message) => firebase.log(message); // ignore: avoid_positional_boolean_parameters - static Future toggle(bool value) => + @override + Future toggle(bool value) => firebase.setCrashlyticsCollectionEnabled(value); } diff --git a/lib/src/services/crashlytics/stub.dart b/lib/src/services/crashlytics/stub.dart index 8ebbd5444..758081873 100644 --- a/lib/src/services/crashlytics/stub.dart +++ b/lib/src/services/crashlytics/stub.dart @@ -1,22 +1,33 @@ import "package:flutter/foundation.dart"; +import "../crashlytics.dart"; -class Crashlytics { - static dynamic firebase; +Crashlytics getCrashlytics() => CrashlyticsStub(); - static Future recordError ( +class CrashlyticsStub extends Crashlytics { + @override + Future init() async {} + + @override + Future signIn() async {} + + @override + Future recordError ( dynamic exception, StackTrace stack, {dynamic context} - ) => throw exception; + ) async => throw exception; - static Future recordFlutterError ( + @override + Future recordFlutterError ( FlutterErrorDetails details - ) => throw details.exception; + ) async => throw details.exception; - static Future setUserEmail(String email) async {} + @override + Future setEmail(String email) async {} - static void log(String message) {} + @override + Future log(String message) async {} - // ignore: avoid_positional_boolean_parameters - static Future toggle(bool value) async {} + @override + Future toggle(bool value) async {} } From dc7d66c0c2d543e538150dd4fe34e27de94871ee Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 12:18:18 -0400 Subject: [PATCH 041/251] refactored Notifications to a Service --- lib/services.dart | 8 +- lib/src/models/data/schedule.dart | 6 +- lib/src/services/notifications.dart | 279 ++++++---------------------- pubspec.lock | 16 +- pubspec.yaml | 2 +- 5 files changed, 76 insertions(+), 235 deletions(-) diff --git a/lib/services.dart b/lib/services.dart index a04f063bd..9fa33baa9 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -17,6 +17,7 @@ library ramaz_services; import "src/services/crashlytics.dart"; import "src/services/databases.dart"; +import "src/services/notifications.dart"; import "src/services/preferences.dart"; import "src/services/service.dart"; @@ -31,9 +32,10 @@ class Services implements Service { /// The singleton instance of this class. static Services instance = Services(); - final Preferences prefs = Preferences(); - final Databases database = Databases(); final Crashlytics crashlytics = Crashlytics.instance; + final Databases database = Databases(); + final Notifications notifications = Notifications(); + final Preferences prefs = Preferences(); List services; @@ -41,7 +43,7 @@ class Services implements Service { /// /// Also initializes [services]. Services() { - services = [prefs, database]; + services = [prefs, database, crashlytics, notifications]; } @override diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index c37a8f632..da5089b74 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -191,9 +191,9 @@ class Schedule with ChangeNotifier { /// Schedules notifications for today's reminders. /// /// Starting from the current period, schedules a notification for the period - /// using [Notifications.scheduleNotification]. + /// using [Notifications.scheduleNotification] Future scheduleReminders() async { - Notifications.cancelAll(); + Services.instance.notifications.cancelAll(); final DateTime now = DateTime.now(); // No school today/right now @@ -209,7 +209,7 @@ class Schedule with ChangeNotifier { subject: subjects [period?.id]?.name, dayName: today.name, )) { - Notifications.scheduleNotification( + Services.instance.notifications.scheduleNotification( date: DateTime( now.year, now.month, diff --git a/lib/src/services/notifications.dart b/lib/src/services/notifications.dart index 9eed17103..045c28abc 100644 --- a/lib/src/services/notifications.dart +++ b/lib/src/services/notifications.dart @@ -1,214 +1,42 @@ import "package:flutter_local_notifications/flutter_local_notifications.dart"; -import "package:flutter/material.dart" show Color, required, immutable; +import "package:flutter/material.dart" show required, immutable; import "package:ramaz/constants.dart"; -/// The style of the notification. -/// -/// Only applies to Android. -enum AndroidNotificationType { - /// A message notification from another person. - /// - /// This can be used for lost and found notifications. - message, - - /// A notification that contains an image. - /// - /// This can be used for the first post of lost and found notifications - /// that contain an image of the lost object. - image, - - /// A default notification with just text. - normal, -} - -/// Maps the abstract [AndroidNotificationType] to [AndroidNotificationStyle]s. -/// -/// This is done so other libraries that import this module do not need to -/// import `flutter_local_notifications`. -const Map< - AndroidNotificationType, - AndroidNotificationStyle -> androidNotificationTypes = { - AndroidNotificationType.message: AndroidNotificationStyle.Messaging, - AndroidNotificationType.image: AndroidNotificationStyle.BigPicture, - AndroidNotificationType.normal: AndroidNotificationStyle.Default, -}; - -/// A notification configuration for Android. -/// -/// This should be used instead of [AndroidNotificationDetails] so that other -/// other libraries can import this module without importing the plugin. -@immutable -class AndroidNotification { - /// The importance of this notification. - /// - /// An importance level for Android 8+ - final Importance importance; - - /// The priority of this notification. - /// - /// An importance level for Android 7.1 and lower. - final Priority priority; - - /// The type of this notification. - final AndroidNotificationType style; - - /// The style of this notification. - /// - /// This can be used to customize notifications about messages - /// and notifications that contain images. - final StyleInformation styleInfo; - - /// The color of this notification. - /// - /// Should relate to the app's branding colors. - final Color color; - - /// The ID of this notification's channel. - final String channelId; - - /// The name of this notification's channel. - final String channelName; - - /// The description of this notification's channel. - final String channelDescription; - - /// The icon for this notification. - /// - /// Defaults to the default app icon, but can be customized. - final String icon; - - /// The group ID for this notification. - /// - /// All notifications with the same group ID are bundled together. - final String groupId; - - /// Whether this notification should play sound. - final bool playSound; - - /// Whether this notification should vibrate the device. - final bool shouldVibrate; - - /// Whether this is the header of a group. - final bool isGroupSummary; - - /// Whether this notification's channel should cause the home screen - /// to show a badge on the app's icon. - final bool showChannelBadge; - - /// Whether this notification should cause the device's LED to blink. - final bool showLight; - - /// A const constructor for this class. - const AndroidNotification({ - @required this.importance, - @required this.priority, - @required this.style, - @required this.color, - @required this.channelId, - @required this.channelName, - @required this.channelDescription, - @required this.groupId, - @required this.playSound, - @required this.shouldVibrate, - @required this.isGroupSummary, - @required this.showChannelBadge, - @required this.showLight, - this.icon, - this.styleInfo, - }); - - /// An optimal Android notification configuration for reminders. - /// - /// If [root] is true, the notification is considered the group - /// "summary", which is like a header for notifications. - const AndroidNotification.reminder({bool root = false}) : - importance = Importance.High, - priority = Priority.High, - style = AndroidNotificationType.normal, - color = RamazColors.blue, - channelId = "reminders", - channelName = "Reminders", - channelDescription = "When reminders are due.", - groupId = "reminders", - playSound = true, - shouldVibrate = true, - isGroupSummary = root, - showChannelBadge = true, - icon = null, - styleInfo = null, - showLight = true; - - /// Exposes the AndroidNotificationDetails for this notification. - AndroidNotificationDetails get details => AndroidNotificationDetails( - channelId, - channelName, - channelDescription, - icon: icon, - importance: importance, - priority: priority, - style: androidNotificationTypes [style], - styleInformation: styleInfo, - playSound: playSound, - enableVibration: shouldVibrate, - groupKey: groupId, - setAsGroupSummary: isGroupSummary, - groupAlertBehavior: GroupAlertBehavior.All, - autoCancel: true, - ongoing: false, - color: color, - onlyAlertOnce: true, - channelShowBadge: showChannelBadge, - enableLights: showLight, - ledColor: color, - ledOnMs: 1000, - ledOffMs: 5000, - ); -} - -/// A notification configuration for iOS. -/// -/// This should be used instead of [IOSNotificationDetails] so that other -/// other libraries can import this module without importing the plugin. -@immutable -class IOSNotification { - /// An optimal [IOSNotification] for reminders. - static const IOSNotification reminder = IOSNotification( - showBadge: true, - playSound: true - ); - - /// Whether this notification should cause the device's home screen - /// to show a badge on this notification's icon. - final bool showBadge; - - /// Whether this notification should cause the device to play a sound. - final bool playSound; - - /// A const constructor for this class. - const IOSNotification({ - @required this.showBadge, - @required this.playSound - }); - - /// The [IOSNotificationDetails] for this notification. - IOSNotificationDetails get details => IOSNotificationDetails( - presentAlert: true, - presentSound: playSound, - presentBadge: showBadge, - ); -} +import "service.dart"; + +NotificationDetails reminderDetails = const NotificationDetails( + android: AndroidNotificationDetails( + "reminders", + "Reminders", + "When reminders are due.", + importance: Importance.high, + priority: Priority.high, + color: RamazColors.blue, + groupKey: "reminders", + playSound: true, + enableVibration: true, + setAsGroupSummary: false, + channelShowBadge: true, + icon: null, + styleInformation: null, + enableLights: true, + ), + iOS: IOSNotificationDetails( + presentBadge: true, + presentSound: true + ) +); /// A platform-agnostic notification. /// -/// An [AndroidNotification] and an [IOSNotification] needs to be provided. +/// Helps creating [NotificationDetails]. @immutable class Notification { /// The ID of this notification. /// /// The ID is used for cancelling the notifications. - final int id = 0; + int get id => 0; /// The title of this notification. final String title; @@ -220,27 +48,17 @@ class Notification { final NotificationDetails details; /// Returns a new [Notification]. - /// - /// [android] and [ios] are used to make [details]. - Notification({ + const Notification({ @required this.title, @required this.message, - @required AndroidNotification android, - @required IOSNotification ios, - }) : details = NotificationDetails( - android.details, ios.details, - ); + @required this.details, + }); /// The optimal configuration for a reminder notification. Notification.reminder({ @required this.title, @required this.message, - bool root = false - }) : - details = NotificationDetails( - AndroidNotification.reminder(root: root).details, - IOSNotification.reminder.details, - ); + }) : details = reminderDetails; } // ignore: avoid_classes_with_only_static_members @@ -248,19 +66,24 @@ class Notification { /// /// This class uses static methods to send and schedule /// notifications. -class Notifications { - static final _plugin = FlutterLocalNotificationsPlugin() - ..initialize( - const InitializationSettings( - AndroidInitializationSettings( - "@mipmap/bright_yellow" // default icon of app - ), - IOSInitializationSettings(), // defaults are good - ) - ); +class Notifications extends Service { + final _plugin = FlutterLocalNotificationsPlugin(); + + @override + Future init() => _plugin.initialize( + const InitializationSettings( + android: AndroidInitializationSettings( + "@mipmap/bright_yellow" // default icon of app + ), + iOS: IOSInitializationSettings(), // defaults are good + ) + ); + + @override + Future signIn() async {} /// Sends a notification immediately. - static void sendNotification(Notification notification) => _plugin.show( + void sendNotification(Notification notification) => _plugin.show( notification.id, notification.title, notification.message, @@ -270,19 +93,21 @@ class Notifications { /// Schedules a notification for [date]. /// /// If [date] is in the past, the notification will go off immediately. - static void scheduleNotification({ + void scheduleNotification({ @required Notification notification, @required DateTime date, - }) => _plugin.schedule( + }) => _plugin.zonedSchedule( notification.id, notification.title, notification.message, date, notification.details, androidAllowWhileIdle: true, + uiLocalNotificationDateInterpretation: + UILocalNotificationDateInterpretation.wallClockTime, ); /// Cancels all scheduled notifications, as well as /// dismissing all present notifications. - static void cancelAll() => _plugin.cancelAll(); + void cancelAll() => _plugin.cancelAll(); } diff --git a/pubspec.lock b/pubspec.lock index 8e6e52954..b7668a65d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -194,7 +194,14 @@ packages: name: flutter_local_notifications url: "https://pub.dartlang.org" source: hosted - version: "0.8.4+3" + version: "2.0.0+1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -469,6 +476,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.19-nullsafety.2" + timezone: + dependency: transitive + description: + name: timezone + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.7" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 7ce059d61..c898e7d86 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: firebase_messaging: ^6.0.1 google_sign_in: ^4.5.1 # Misc - flutter_local_notifications: ^0.8.4+3 + flutter_local_notifications: ^2.0.0 idb_shim: ^1.12.0 path_provider: ^1.4.4 shared_preferences: ^0.5.4 From df979fd96d7e50d21effcc944676372adebc31e2 Mon Sep 17 00:00:00 2001 From: todesj Date: Wed, 14 Oct 2020 13:05:07 -0400 Subject: [PATCH 042/251] built version 2.0.2 --- ios/Flutter/AppFrameworkInfo.plist | 40 ++-- ios/Podfile.lock | 282 ++------------------------- ios/Runner.xcodeproj/project.pbxproj | 36 +++- ios/Runner/Info.plist | 4 +- pubspec.lock | 38 ++-- 5 files changed, 83 insertions(+), 317 deletions(-) diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 9367d483e..f828bd220 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -2,25 +2,25 @@ - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 9.0 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 4f2d9d3b7..87f2d8434 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,228 +1,9 @@ PODS: - - abseil/algorithm (0.20200225.0): - - abseil/algorithm/algorithm (= 0.20200225.0) - - abseil/algorithm/container (= 0.20200225.0) - - abseil/algorithm/algorithm (0.20200225.0): - - abseil/base/config - - abseil/algorithm/container (0.20200225.0): - - abseil/algorithm/algorithm - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/base (0.20200225.0): - - abseil/base/atomic_hook (= 0.20200225.0) - - abseil/base/base (= 0.20200225.0) - - abseil/base/base_internal (= 0.20200225.0) - - abseil/base/bits (= 0.20200225.0) - - abseil/base/config (= 0.20200225.0) - - abseil/base/core_headers (= 0.20200225.0) - - abseil/base/dynamic_annotations (= 0.20200225.0) - - abseil/base/endian (= 0.20200225.0) - - abseil/base/errno_saver (= 0.20200225.0) - - abseil/base/exponential_biased (= 0.20200225.0) - - abseil/base/log_severity (= 0.20200225.0) - - abseil/base/malloc_internal (= 0.20200225.0) - - abseil/base/periodic_sampler (= 0.20200225.0) - - abseil/base/pretty_function (= 0.20200225.0) - - abseil/base/raw_logging_internal (= 0.20200225.0) - - abseil/base/spinlock_wait (= 0.20200225.0) - - abseil/base/throw_delegate (= 0.20200225.0) - - abseil/base/atomic_hook (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/base (0.20200225.0): - - abseil/base/atomic_hook - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/log_severity - - abseil/base/raw_logging_internal - - abseil/base/spinlock_wait - - abseil/meta/type_traits - - abseil/base/base_internal (0.20200225.0): - - abseil/base/config - - abseil/meta/type_traits - - abseil/base/bits (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/config (0.20200225.0) - - abseil/base/core_headers (0.20200225.0): - - abseil/base/config - - abseil/base/dynamic_annotations (0.20200225.0) - - abseil/base/endian (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/errno_saver (0.20200225.0): - - abseil/base/config - - abseil/base/exponential_biased (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/log_severity (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/malloc_internal (0.20200225.0): - - abseil/base/base - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/raw_logging_internal - - abseil/base/periodic_sampler (0.20200225.0): - - abseil/base/core_headers - - abseil/base/exponential_biased - - abseil/base/pretty_function (0.20200225.0) - - abseil/base/raw_logging_internal (0.20200225.0): - - abseil/base/atomic_hook - - abseil/base/config - - abseil/base/core_headers - - abseil/base/log_severity - - abseil/base/spinlock_wait (0.20200225.0): - - abseil/base/base_internal - - abseil/base/core_headers - - abseil/base/errno_saver - - abseil/base/throw_delegate (0.20200225.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/container/compressed_tuple (0.20200225.0): - - abseil/utility/utility - - abseil/container/inlined_vector (0.20200225.0): - - abseil/algorithm/algorithm - - abseil/base/core_headers - - abseil/base/throw_delegate - - abseil/container/inlined_vector_internal - - abseil/memory/memory - - abseil/container/inlined_vector_internal (0.20200225.0): - - abseil/base/core_headers - - abseil/container/compressed_tuple - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/types/span - - abseil/memory (0.20200225.0): - - abseil/memory/memory (= 0.20200225.0) - - abseil/memory/memory (0.20200225.0): - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/meta (0.20200225.0): - - abseil/meta/type_traits (= 0.20200225.0) - - abseil/meta/type_traits (0.20200225.0): - - abseil/base/config - - abseil/numeric/int128 (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/strings/internal (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/base/raw_logging_internal - - abseil/meta/type_traits - - abseil/strings/str_format (0.20200225.0): - - abseil/strings/str_format_internal - - abseil/strings/str_format_internal (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/numeric/int128 - - abseil/strings/strings - - abseil/types/span - - abseil/strings/strings (0.20200225.0): - - abseil/base/base - - abseil/base/bits - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/base/raw_logging_internal - - abseil/base/throw_delegate - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/numeric/int128 - - abseil/strings/internal - - abseil/time (0.20200225.0): - - abseil/time/internal (= 0.20200225.0) - - abseil/time/time (= 0.20200225.0) - - abseil/time/internal (0.20200225.0): - - abseil/time/internal/cctz (= 0.20200225.0) - - abseil/time/internal/cctz (0.20200225.0): - - abseil/time/internal/cctz/civil_time (= 0.20200225.0) - - abseil/time/internal/cctz/time_zone (= 0.20200225.0) - - abseil/time/internal/cctz/civil_time (0.20200225.0): - - abseil/base/config - - abseil/time/internal/cctz/time_zone (0.20200225.0): - - abseil/base/config - - abseil/time/internal/cctz/civil_time - - abseil/time/time (0.20200225.0): - - abseil/base/base - - abseil/base/core_headers - - abseil/base/raw_logging_internal - - abseil/numeric/int128 - - abseil/strings/strings - - abseil/time/internal/cctz/civil_time - - abseil/time/internal/cctz/time_zone - - abseil/types (0.20200225.0): - - abseil/types/any (= 0.20200225.0) - - abseil/types/bad_any_cast (= 0.20200225.0) - - abseil/types/bad_any_cast_impl (= 0.20200225.0) - - abseil/types/bad_optional_access (= 0.20200225.0) - - abseil/types/bad_variant_access (= 0.20200225.0) - - abseil/types/compare (= 0.20200225.0) - - abseil/types/optional (= 0.20200225.0) - - abseil/types/span (= 0.20200225.0) - - abseil/types/variant (= 0.20200225.0) - - abseil/types/any (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/types/bad_any_cast - - abseil/utility/utility - - abseil/types/bad_any_cast (0.20200225.0): - - abseil/base/config - - abseil/types/bad_any_cast_impl - - abseil/types/bad_any_cast_impl (0.20200225.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/types/bad_optional_access (0.20200225.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/types/bad_variant_access (0.20200225.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/types/compare (0.20200225.0): - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/types/optional (0.20200225.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/types/bad_optional_access - - abseil/utility/utility - - abseil/types/span (0.20200225.0): - - abseil/algorithm/algorithm - - abseil/base/core_headers - - abseil/base/throw_delegate - - abseil/meta/type_traits - - abseil/types/variant (0.20200225.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/types/bad_variant_access - - abseil/utility/utility - - abseil/utility/utility (0.20200225.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/meta/type_traits - AppAuth (1.4.0): - AppAuth/Core (= 1.4.0) - AppAuth/ExternalUserAgent (= 1.4.0) - AppAuth/Core (1.4.0) - AppAuth/ExternalUserAgent (1.4.0) - - BoringSSL-GRPC (0.0.7): - - BoringSSL-GRPC/Implementation (= 0.0.7) - - BoringSSL-GRPC/Interface (= 0.0.7) - - BoringSSL-GRPC/Implementation (0.0.7): - - BoringSSL-GRPC/Interface (= 0.0.7) - - BoringSSL-GRPC/Interface (0.0.7) - cloud_firestore (0.14.0-2): - Firebase/CoreOnly (~> 6.26.0) - Firebase/Firestore (~> 6.26.0) @@ -290,19 +71,7 @@ PODS: - GoogleUtilities/Logger (~> 6.7) - nanopb (~> 1.30905.0) - FirebaseCoreDiagnosticsInterop (1.2.0) - - FirebaseFirestore (1.15.0): - - abseil/algorithm (= 0.20200225.0) - - abseil/base (= 0.20200225.0) - - abseil/memory (= 0.20200225.0) - - abseil/meta (= 0.20200225.0) - - abseil/strings/strings (= 0.20200225.0) - - abseil/time (= 0.20200225.0) - - abseil/types (= 0.20200225.0) - - FirebaseAuthInterop (~> 1.0) - - FirebaseCore (~> 6.2) - - "gRPC-C++ (~> 1.28.0)" - - leveldb-library (~> 1.22) - - nanopb (~> 1.30905.0) + - FirebaseFirestore (1.15.0) - FirebaseInstallations (1.3.0): - FirebaseCore (~> 6.6) - GoogleUtilities/Environment (~> 6.6) @@ -359,30 +128,6 @@ PODS: - GoogleUtilities/Logger - GoogleUtilities/UserDefaults (6.7.2): - GoogleUtilities/Logger - - "gRPC-C++ (1.28.2)": - - "gRPC-C++/Implementation (= 1.28.2)" - - "gRPC-C++/Interface (= 1.28.2)" - - "gRPC-C++/Implementation (1.28.2)": - - abseil/container/inlined_vector (= 0.20200225.0) - - abseil/memory/memory (= 0.20200225.0) - - abseil/strings/str_format (= 0.20200225.0) - - abseil/strings/strings (= 0.20200225.0) - - abseil/types/optional (= 0.20200225.0) - - "gRPC-C++/Interface (= 1.28.2)" - - gRPC-Core (= 1.28.2) - - "gRPC-C++/Interface (1.28.2)" - - gRPC-Core (1.28.2): - - gRPC-Core/Implementation (= 1.28.2) - - gRPC-Core/Interface (= 1.28.2) - - gRPC-Core/Implementation (1.28.2): - - abseil/container/inlined_vector (= 0.20200225.0) - - abseil/memory/memory (= 0.20200225.0) - - abseil/strings/str_format (= 0.20200225.0) - - abseil/strings/strings (= 0.20200225.0) - - abseil/types/optional (= 0.20200225.0) - - BoringSSL-GRPC (= 0.0.7) - - gRPC-Core/Interface (= 1.28.2) - - gRPC-Core/Interface (1.28.2) - GTMAppAuth (1.0.0): - AppAuth/Core (~> 1.0) - GTMSessionFetcher (~> 1.1) @@ -391,7 +136,6 @@ PODS: - GTMSessionFetcher/Core (1.4.0) - GTMSessionFetcher/Full (1.4.0): - GTMSessionFetcher/Core (= 1.4.0) - - leveldb-library (1.22) - nanopb (1.30905.0): - nanopb/decode (= 1.30905.0) - nanopb/encode (= 1.30905.0) @@ -412,6 +156,7 @@ DEPENDENCIES: - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) + - FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `6.26.0`) - Flutter (from `Flutter`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - google_sign_in (from `.symlinks/plugins/google_sign_in/ios`) @@ -421,9 +166,7 @@ DEPENDENCIES: SPEC REPOS: trunk: - - abseil - AppAuth - - BoringSSL-GRPC - Crashlytics - Fabric - Firebase @@ -434,7 +177,6 @@ SPEC REPOS: - FirebaseCore - FirebaseCoreDiagnostics - FirebaseCoreDiagnosticsInterop - - FirebaseFirestore - FirebaseInstallations - FirebaseInstanceID - FirebaseMessaging @@ -442,11 +184,8 @@ SPEC REPOS: - GoogleDataTransport - GoogleSignIn - GoogleUtilities - - "gRPC-C++" - - gRPC-Core - GTMAppAuth - GTMSessionFetcher - - leveldb-library - nanopb - PromisesObjC - Protobuf @@ -462,6 +201,9 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/firebase_crashlytics/ios" firebase_messaging: :path: ".symlinks/plugins/firebase_messaging/ios" + FirebaseFirestore: + :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git + :tag: 6.26.0 Flutter: :path: Flutter flutter_local_notifications: @@ -475,10 +217,13 @@ EXTERNAL SOURCES: url_launcher: :path: ".symlinks/plugins/url_launcher/ios" +CHECKOUT OPTIONS: + FirebaseFirestore: + :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git + :tag: 6.26.0 + SPEC CHECKSUMS: - abseil: 6c8eb7892aefa08d929b39f9bb108e5367e3228f AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 - BoringSSL-GRPC: 8edf627ee524575e2f8d19d56f068b448eea3879 cloud_firestore: b054ccc068b5907645c32b669d38e82db2a11fc7 Crashlytics: 540b7e5f5da5a042647227a5e3ac51d85eed06df Fabric: 706c8b8098fff96c33c0db69cbf81f9c551d0d74 @@ -494,7 +239,7 @@ SPEC CHECKSUMS: FirebaseCore: f42e5e5f382cdcf6b617ed737bf6c871a6947b17 FirebaseCoreDiagnostics: 7535fe695737f8c5b350584292a70b7f8ff0357b FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850 - FirebaseFirestore: 8c158bdde010fa397386333a74570eaef033e62d + FirebaseFirestore: 2cf6944bc538e57c94d8332bae501178edb70727 FirebaseInstallations: 6f5f680e65dc374397a483c32d1799ba822a395b FirebaseInstanceID: cef67c4967c7cecb56ea65d8acbb4834825c587b FirebaseMessaging: 29543feb343b09546ab3aa04d008ee8595b43c44 @@ -505,11 +250,8 @@ SPEC CHECKSUMS: GoogleDataTransport: 672fb0ce96fe7f7f31d43672fca62ad2c9c86f7b GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 - "gRPC-C++": 13d8ccef97d5c3c441b7e3c529ef28ebee86fad2 - gRPC-Core: 4afa11bfbedf7cdecd04de535a9e046893404ed5 GTMAppAuth: 4deac854479704f348309e7b66189e604cf5e01e GTMSessionFetcher: 6f5c8abbab8a9bce4bb3f057e317728ec6182b10 - leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7 nanopb: c43f40fadfe79e8b8db116583945847910cbabc9 path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c PromisesObjC: b14b1c6b68e306650688599de8a45e49fae81151 @@ -517,6 +259,6 @@ SPEC CHECKSUMS: shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef -PODFILE CHECKSUM: b1f7a399522c118a74b177b13c01eca692aa7e6d +PODFILE CHECKSUM: 0cceffd53e919b13a6eae7e7c3ebfcbec8b672e0 COCOAPODS: 1.9.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index f496234f8..1665991a2 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -151,6 +151,7 @@ buildPhases = ( 84A3871B02ECAE1C37386DD1 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, + D9429A6B347AE78FF52D5DB5 /* [CP] Prepare Artifacts */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, @@ -345,6 +346,23 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; + D9429A6B347AE78FF52D5DB5 /* [CP] Prepare Artifacts */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-artifacts-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Prepare Artifacts"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-artifacts-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-artifacts.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -419,7 +437,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"${PODS_CONFIGURATION_BUILD_DIR}/BoringSSL-GRPC\"/**", @@ -465,7 +483,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = SE9C56DQWJ; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -474,6 +492,7 @@ "$(PROJECT_DIR)/Pods", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -483,6 +502,7 @@ "$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Pods", ); + MARKETING_VERSION = 2.0.2; PRODUCT_BUNDLE_IDENTIFIER = "com.ramaz.ramaz.student-life"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -535,7 +555,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -582,7 +602,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"${PODS_CONFIGURATION_BUILD_DIR}/BoringSSL-GRPC\"/**", @@ -628,7 +648,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = SE9C56DQWJ; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -637,6 +657,7 @@ "$(PROJECT_DIR)/Pods", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -646,6 +667,7 @@ "$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Pods", ); + MARKETING_VERSION = 2.0.2; PRODUCT_BUNDLE_IDENTIFIER = "com.ramaz.ramaz.student-life"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -660,7 +682,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = SE9C56DQWJ; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -669,6 +691,7 @@ "$(PROJECT_DIR)/Pods", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -678,6 +701,7 @@ "$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Pods", ); + MARKETING_VERSION = 2.0.2; PRODUCT_BUNDLE_IDENTIFIER = "com.ramaz.ramaz.student-life"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index f21b783f5..b37db5d4a 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleSignature ???? CFBundleURLTypes @@ -30,7 +30,7 @@ CFBundleVersion - 3 + 7 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/pubspec.lock b/pubspec.lock index b25dbe3da..e02f58ca4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,35 +21,35 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.5.0-nullsafety" + version: "2.5.0-nullsafety.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety" + version: "2.1.0-nullsafety.1" characters: dependency: transitive description: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.2" + version: "1.1.0-nullsafety.3" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety" + version: "1.2.0-nullsafety.1" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety" + version: "1.1.0-nullsafety.1" cloud_firestore: dependency: "direct main" description: @@ -77,7 +77,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0-nullsafety.2" + version: "1.15.0-nullsafety.3" convert: dependency: transitive description: @@ -98,7 +98,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety" + version: "1.2.0-nullsafety.1" file: dependency: transitive description: @@ -267,21 +267,21 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10-nullsafety" + version: "0.12.10-nullsafety.1" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.2" + version: "1.3.0-nullsafety.3" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety" + version: "1.8.0-nullsafety.1" path_provider: dependency: "direct main" description: @@ -419,28 +419,28 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety" + version: "1.8.0-nullsafety.2" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.10.0-nullsafety" + version: "1.10.0-nullsafety.1" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety" + version: "2.1.0-nullsafety.1" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety" + version: "1.1.0-nullsafety.1" synchronized: dependency: transitive description: @@ -454,21 +454,21 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety" + version: "1.2.0-nullsafety.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.19-nullsafety" + version: "0.2.19-nullsafety.2" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.2" + version: "1.3.0-nullsafety.3" url_launcher: dependency: "direct main" description: @@ -510,7 +510,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.2" + version: "2.1.0-nullsafety.3" xdg_directories: dependency: transitive description: @@ -533,5 +533,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.10.0-0.0.dev <2.10.0" + dart: ">=2.10.0-110 <2.11.0" flutter: ">=1.12.13+hotfix.5 <2.0.0" From a014601334a6ca83e3f09df7be33956d6f3b9f94 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 15:38:33 -0400 Subject: [PATCH 043/251] Documented Services library --- lib/main.dart | 6 +- lib/src/models/data/admin/calendar.dart | 17 ++- lib/src/models/view/feedback.dart | 20 ++-- lib/src/services/auth.dart | 58 ++++----- lib/src/services/cloud_db.dart | 22 +--- lib/src/services/crashlytics.dart | 32 ++++- lib/src/services/crashlytics/mobile.dart | 7 +- lib/src/services/crashlytics/stub.dart | 5 + lib/src/services/database.dart | 113 ++++++++++++++++++ lib/src/services/databases.dart | 34 +++++- lib/src/services/firebase_core.dart | 8 ++ lib/src/services/local_db.dart | 91 +++++++++++--- lib/src/services/local_db/idb_factory.dart | 3 - lib/src/services/local_db/idb_factory_io.dart | 3 + .../services/local_db/idb_factory_stub.dart | 3 + .../services/local_db/idb_factory_web.dart | 3 + lib/src/services/notifications.dart | 14 ++- lib/src/services/service.dart | 93 +++++--------- 18 files changed, 377 insertions(+), 155 deletions(-) create mode 100644 lib/src/services/database.dart delete mode 100644 lib/src/services/local_db/idb_factory.dart diff --git a/lib/main.dart b/lib/main.dart index 08c076da2..34e2464db 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -52,10 +52,8 @@ Future main({bool restart = false}) async { : Brightness.dark; } - if (kDebugMode) { - // Turns Crashlyitcs off in debug mode. - await crashlytics.toggle(false); - } + // Turns Crashlyitcs off in debug mode. + await crashlytics.toggle(!kDebugMode); // Now we are ready to run the app (with error catching) FlutterError.onError = crashlytics.recordFlutterError; diff --git a/lib/src/models/data/admin/calendar.dart b/lib/src/models/data/admin/calendar.dart index 22fec15ce..8e75c1b65 100644 --- a/lib/src/models/data/admin/calendar.dart +++ b/lib/src/models/data/admin/calendar.dart @@ -60,12 +60,17 @@ class CalendarModel with ChangeNotifier { CalendarModel() { for (int month = 0; month < 12; month++) { subscriptions.add( - CloudDatabase.getCalendarStream(month + 1).listen( - (List> cal) { - calendar [month] = Day.getMonth(cal); - calendar [month] = layoutMonth(month); - notifyListeners(); - } + Services + .instance + .database + .cloudDatabase + .getCalendarStream(month + 1) + .listen( + (List> cal) { + calendar [month] = Day.getMonth(cal); + calendar [month] = layoutMonth(month); + notifyListeners(); + } ) ); } diff --git a/lib/src/models/view/feedback.dart b/lib/src/models/view/feedback.dart index 54eb0961e..2da340df7 100644 --- a/lib/src/models/view/feedback.dart +++ b/lib/src/models/view/feedback.dart @@ -31,13 +31,17 @@ class FeedbackModel with ChangeNotifier { /// Sends the feedback to Cloud Firestore. /// /// The feedback is anonymized if [anonymous] is true. - Future send() async => CloudDatabase.sendFeedback( - Feedback ( - message: message, - timestamp: DateTime.now(), - anonymous: anonymous, - name: anonymous ? null : Auth.name, - email: anonymous ? null : Auth.email, - ).toJson() + Future send() async => Services + .instance + .database + .cloudDatabase + .sendFeedback( + Feedback ( + message: message, + timestamp: DateTime.now(), + anonymous: anonymous, + name: anonymous ? null : Auth.name, + email: anonymous ? null : Auth.email, + ).toJson() ); } diff --git a/lib/src/services/auth.dart b/lib/src/services/auth.dart index b78427c99..a6ce714ad 100644 --- a/lib/src/services/auth.dart +++ b/lib/src/services/auth.dart @@ -1,13 +1,15 @@ import "package:firebase_auth/firebase_auth.dart"; import "package:google_sign_in/google_sign_in.dart"; +/// An exception thrown when no account has been selected. class NoAccountException implements Exception {} // ignore: avoid_classes_with_only_static_members /// An abstraction around FirebaseAuth. /// -/// This class handles all authentication operations via static methods. -/// There is no need to create an instance of this class. +/// This class handles all authentication operations via static methods. Do +/// not create an instance of this class; it is not a Service. Instead, use +/// it from within other services. class Auth { /// The [FirebaseAuth] service. static final FirebaseAuth auth = FirebaseAuth.instance; @@ -15,57 +17,62 @@ class Auth { /// The [GoogleSignIn] service. static final GoogleSignIn google = GoogleSignIn(); - /// The scope for the calendar. + /// The scope for calendar admins. /// - /// This string should be found in the users Firebase custom claims. + /// This string should be found in the user's Firebase custom claims. static const String calendarScope = "calendar"; - /// The scope for sports games. + /// The scope for sports admins. /// - /// This string should be found in the users Firebase custom claims. + /// This string should be found in the user's Firebase custom claims. static const String sportsScope = "sports"; /// The currently logged in user. /// /// This getter returns a [User], which should not be used /// outside this library. This method should only be called by - /// methods that provide higher level functionality, such as [isReady]. - static User get currentUser => auth.currentUser; + /// methods that provide higher level functionality, such as [isSignedIn]. + static User get _currentUser => auth.currentUser; /// The user's email. - static String get email => currentUser?.email?.toLowerCase(); + /// + /// Since the database is case-sensitive, we standardize the lower case. + static String get email => _currentUser?.email?.toLowerCase(); /// The user's full name. - static String get name => currentUser?.displayName; + static String get name => _currentUser?.displayName; /// Determines whether the user is currently logged - static bool get isReady => currentUser != null; + static bool get isSignedIn => _currentUser != null; - /// Whether the user is an admin or not. + /// Gets the user's custom claims. + /// + /// See the official [Firebase docs](https://firebase.google.com/docs/auth/admin/custom-claims). static Future get claims async => ( - await currentUser.getIdTokenResult() + await _currentUser.getIdTokenResult() ).claims; /// Whether the user is an admin. + /// + /// This works by checking for an "isAdmin" flag in the user's custom [claims]. static Future get isAdmin async => (await claims) ["isAdmin"] ?? false; /// The scopes of an admin. /// - /// No null-checks are necessary here, because the `scopes` field should be - /// present if the user is an admin, and this property will not be accessed - /// unless [isAdmin] returns true. - static Future> get adminScopes async => [ - for (final scope in (await claims) ["scopes"]) - scope.toString() - ]; + /// Returns null if the user is not an admin (ie, [isAdmin] returns false). + static Future> get adminScopes async => !(await isAdmin) + ? null : [ + for (final scope in (await claims) ["scopes"]) + scope.toString() + ]; /// Whether the user is an admin for the calendar. static Future get isCalendarAdmin async => - (await isAdmin) && (await adminScopes).contains(calendarScope); + (await adminScopes)?.contains(calendarScope) ?? false; /// Whether the user is an admin for sports games. static Future get isSportsAdmin async => - (await isAdmin) && (await adminScopes).contains(sportsScope); + (await adminScopes)?.contains(sportsScope) ?? false; /// Signs out the currently logged in user. static Future signOut() async { @@ -73,13 +80,6 @@ class Auth { await auth.signOut(); } - /// Determines whether the provided email is a valid Ramaz account - /// - /// This does no server side validation, only checking if it ends in - /// "@ramaz.org". - static bool isValidGoogleAccount(GoogleSignInAccount account) => account - .email.endsWith("@ramaz.org"); - /// Signs the user in using Google as a provider. static Future signIn() async { final GoogleSignInAccount googleAccount = await google.signIn(); diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index 44d5b3c8d..4838885d5 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -1,8 +1,8 @@ import "package:cloud_firestore/cloud_firestore.dart"; import "auth.dart"; +import "database.dart"; import "firebase_core.dart"; -import "service.dart"; /// A wrapper around Cloud Firestore. class CloudDatabase extends Database { @@ -125,9 +125,6 @@ class CloudDatabase extends Database { /// If the user does not have a reminders document, this function creates it. @override Future signIn() async { - if (Auth.isReady) { - return; - } await Auth.signIn(); final DocumentSnapshot remindersSnapshot = await remindersDocument.get(); if (!remindersSnapshot.exists) { @@ -138,7 +135,7 @@ class CloudDatabase extends Database { // Database methods. @override - Future get isSignedIn async => Auth.isReady; + Future get isSignedIn async => Auth.isSignedIn; @override Future signOut() => Auth.signOut(); @@ -160,19 +157,10 @@ class CloudDatabase extends Database { @override Future setUser(Map json) async {} - /// Gets an individual section. - /// - /// Do not use directly. Use [getSections] instead. + @override Future> getSection(String id) async => (await sectionCollection.doc(id).get()).data(); - @override - Future>> getSections(Set ids) - async => { - for (final String id in ids) - id: await getSection(id) - }; - /// No-op -- The user cannot edit the courses list. /// /// The courses list can only be modified by the admin SDK. @@ -227,12 +215,12 @@ class CloudDatabase extends Database { sportsDocument.set({sportsKey: json}); /// Submits feedback. - static Future sendFeedback( + Future sendFeedback( Map json ) => feedbackCollection.doc().set(json); /// Listens to a month for changes in the calendar. - static Stream>> getCalendarStream(int month) => + Stream>> getCalendarStream(int month) => calendarCollection.doc(month.toString()).snapshots().map( (DocumentSnapshot snapshot) => [ for (final dynamic entry in snapshot.data() ["calendar"]) diff --git a/lib/src/services/crashlytics.dart b/lib/src/services/crashlytics.dart index 665e00b19..11a25ae27 100644 --- a/lib/src/services/crashlytics.dart +++ b/lib/src/services/crashlytics.dart @@ -5,23 +5,53 @@ import "crashlytics/stub.dart" import "service.dart"; +/// A wrapper around the Crashlytics SDK. +/// +/// Crashlytics is a service that helps report errors from apps already in use. +/// Crashes and errors can be found in the Firebase console. +/// +/// This class has a singleton, since there are multiple implementations. Use +/// [Crashlytics.instance]. abstract class Crashlytics extends Service { + /// The singleton of this object. static Crashlytics instance = getCrashlytics(); + /// Whether the app crashed last time it ran. + /// + /// A "crash" according to Firebase is a fatal-error at the native level. So + /// most Flutter errors should not trigger this. In the future, however, it + /// may be helpful. bool didCrashLastTime = false; + /// Records an error to Crashlytics. + /// + /// This function is meant for Dart errors. For Flutter errors, use + /// [recordFlutterError]. Future recordError( dynamic exception, StackTrace stack, {dynamic context} ); + /// Records an error in the Flutter framework. Future recordFlutterError(FlutterErrorDetails details); + /// Sets the email of the current user. + /// + /// This is helpful when looking through error reports, and enables us to dig + /// around the database and find corrupted data. Future setEmail(String email); + /// Logs a message to Crashlytics. + /// + /// Put these everywhere. That way, if the app does crash, the error report + /// will be full of context. Future log(String message); + /// Toggles Crashlytics on or off. + /// + /// This should always be set to on (and it is by default), except for when + /// the app is running in dev mode. // ignore: avoid_positional_boolean_parameters Future toggle(bool value); -} \ No newline at end of file +} diff --git a/lib/src/services/crashlytics/mobile.dart b/lib/src/services/crashlytics/mobile.dart index 3c86ff870..59ce0c04c 100644 --- a/lib/src/services/crashlytics/mobile.dart +++ b/lib/src/services/crashlytics/mobile.dart @@ -4,9 +4,15 @@ import "package:flutter/foundation.dart"; import "../crashlytics.dart"; import "../firebase_core.dart"; +/// Provides the correct implementation for mobile. Crashlytics getCrashlytics() => CrashlyticsImplementation(); +/// Connects the app to Firebase Crashlytics. +/// +/// Currently, Crashlytics is only available on mobile, so this implementation +/// is only used where `dart:io` is available. class CrashlyticsImplementation extends Crashlytics { + /// Provides the connection to Firebase Crashlytics. static FirebaseCrashlytics firebase = FirebaseCrashlytics.instance; @override @@ -41,7 +47,6 @@ class CrashlyticsImplementation extends Crashlytics { Future log(String message) => firebase.log(message); - // ignore: avoid_positional_boolean_parameters @override Future toggle(bool value) => firebase.setCrashlyticsCollectionEnabled(value); diff --git a/lib/src/services/crashlytics/stub.dart b/lib/src/services/crashlytics/stub.dart index 758081873..df46da159 100644 --- a/lib/src/services/crashlytics/stub.dart +++ b/lib/src/services/crashlytics/stub.dart @@ -1,8 +1,13 @@ import "package:flutter/foundation.dart"; import "../crashlytics.dart"; +/// Provides the correct implementation for web. Crashlytics getCrashlytics() => CrashlyticsStub(); +/// Provides an empty [Crashlytics] instance. +/// +/// Currently, crashlytics is only available on mobile, so this implementation +/// is used where `dart:io` is unavailable. class CrashlyticsStub extends Crashlytics { @override Future init() async {} diff --git a/lib/src/services/database.dart b/lib/src/services/database.dart new file mode 100644 index 000000000..53d5b7190 --- /dev/null +++ b/lib/src/services/database.dart @@ -0,0 +1,113 @@ +import "service.dart"; + +/// A database that can read and write data. +/// +/// A [Database] is a special type of [Service]. Whereas a service only needs +/// to know when the app starts and the user signs in, a database has other +/// responsibilities. +/// +/// Functionally, a database needs to be able to determine whether the user +/// is signed in, so the app knows where to direct the user. Additionally, +/// since the data is tied to the user, the database needs to know when the +/// user is signing out, it can purge that data. Of course, the database also +/// needs to know when the user is signing in, so it can connect to the data. +/// +/// This class also serves to dictate what data the database should provide, +/// as well as their types. Most of the code in this class does exactly that. +abstract class Database extends Service { + /// The key to get the calendar within the returned JSON object. + /// + /// The calendar is stored along with its month, which means it cannot + /// be a list, and instead must be a `Map`. This key + /// gets the list out of the Map. + static const String calendarKey = "calendar"; + + /// Determines whether the user is signed in. + /// + /// From all the services, a [Database] is the only one that can, and is + /// expected to, know whether the user is signed in. The implementation + /// is up to the database itself, but it's allowed to be asynchronous. + Future get isSignedIn; + + /// Signs the user out of the app. + /// + /// As opposed to [signIn], only databases need to know when the user is + /// signing out. It can be helpful for non-database services to know when the + /// user signs in, since this indicates they are truly ready to engage with + /// the app, but signing out carries no valuable information. The databases, + /// however, must purge all their data. + Future signOut(); + + // ---------- Data code below ---------- + + /// The user object as JSON + Future> get user; + + /// Changes the user JSON object. + Future setUser(Map json); + + /// Gets one section (a course in Ramaz) as a JSON object. + /// + /// Do not use this directly. Instead, use [getSections]. + Future> getSection(String id); + + /// The different classes (sections, not courses) for a schedule. + Future>> getSections( + Iterable ids + ) async => { + for (final String id in ids) + id: await getSection(id) + }; + + /// Changes the user's classes. + Future setSections(Map> json); + + /// The calendar in JSON form. + /// + /// Admins can change this with [setCalendar]. + Future>>> get calendar async => [ + for (int month = 1; month <= 12; month++) [ + for (final dynamic day in (await getCalendarMonth(month)) [calendarKey]) + Map.from(day) + ] + ]; + + /// Gets one month out of the calendar. + /// + /// Months are in the range 1-12. The value returned will be a JSON object + /// containing the month and the calendar. The calendar itself can be retrieved + /// with [calendarKey]. + Future> getCalendarMonth(int month); + + /// Changes the calendar in the database. + /// + /// The fact that this method takes a [month] parameter while [calendar] does + /// not is an indicator that the calendar schema needs to be rewritten. + /// + /// [month] must be 1-12, not 0-11. + /// + /// Only admins can change this. + Future setCalendar(int month, Map json); + + /// The user's reminders. + Future>> get reminders; + + /// Sets the user's reminders. + Future setReminders(List> json); + + /// The admin object (or null). + Future> get admin; + + /// Sets the admin object for this user. + Future setAdmin(Map json); + + /// The sports games. + /// + /// Admins can change this with [setSports]. + Future>> get sports; + + /// Sets the sports games. + /// + /// Only admins can change this. + Future setSports(List> json); +} \ No newline at end of file diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart index c5f5cc892..1705236f5 100644 --- a/lib/src/services/databases.dart +++ b/lib/src/services/databases.dart @@ -1,8 +1,14 @@ import "auth.dart"; import "cloud_db.dart"; +import "database.dart"; import "local_db.dart"; -import "service.dart"; +/// Bundles different databases to provide more complex functionality. +/// +/// This class is used to consolidate the results of the online database and +/// the on-device database. It works by downloading all the necessary data in +/// [signIn]. All reads are from [localDatabase], and all writes are to both +/// databases. class Databases extends Database { /// Provides a connection to the online database. final CloudDatabase cloudDatabase = CloudDatabase(); @@ -19,6 +25,7 @@ class Databases extends Database { await localDatabase.init(); } + /// Downloads all the data and saves it to the local database. @override Future signIn() async { await cloudDatabase.signIn(); @@ -33,6 +40,7 @@ class Databases extends Database { } } + /// Downloads the calendar and saves it to the local database. Future updateCalendar() async { for (int month = 1; month <= 12; month++) { await localDatabase.setCalendar( @@ -42,6 +50,7 @@ class Databases extends Database { } } + /// Downloads sports games and saves them to the local database. Future updateSports() async { await localDatabase.setSports(await cloudDatabase.sports); } @@ -59,11 +68,27 @@ class Databases extends Database { @override Future> get user => localDatabase.user; + // Cannot modify user profile. @override Future setUser(Map json) async {} + /// Do not use this function. Use [getSections instead]. + /// + /// In a normal database, the [getSections] function works by calling + /// [getSection] repeatedly. So it would be this function that needs to be + /// overridden. However, this class uses other [Database]s, so instead, + /// this function is left blank and [getSections] uses other + /// [Database.getSections] to work. + @override + Future> getSection(String id) async => null; + + /// Gets section data. + /// + /// Checks the local database, and downloads it if the data is unavailable. @override - Future>> getSections(Set ids) async { + Future>> getSections( + Iterable ids + ) async { Map> result = await localDatabase.getSections(ids); if (result.values.every((value) => value == null)) { @@ -73,10 +98,9 @@ class Databases extends Database { return result; } + // Cannot modify sections @override - Future setSections( - Map> json - ) async {} // user cannot modify sections + Future setSections(Map> json) async {} @override Future> getCalendarMonth(int month) => diff --git a/lib/src/services/firebase_core.dart b/lib/src/services/firebase_core.dart index 2bedc9ff4..fbed781ce 100644 --- a/lib/src/services/firebase_core.dart +++ b/lib/src/services/firebase_core.dart @@ -1,8 +1,16 @@ import "package:firebase_core/firebase_core.dart"; +/// A wrapper around [Firebase]. +/// +/// Firebase needs to be initialized before any Firebase products can be used. +/// However, it is an error to initialize Firebase more than once. To simplify +/// the process, we register Firebase as a separate service that can keep track +/// of whether it has been initialized. class FirebaseCore { + /// Whether Firebase has already been initialized. static bool initialized = false; + /// Initializes Firebase if it hasn't already been. static Future init() async { if (!initialized) { await Firebase.initializeApp(); diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index c6a40e7b4..d948e46dd 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -1,31 +1,55 @@ import "package:idb_shim/idb_shim.dart" as idb; -import "auth.dart"; // for user email -import "local_db/idb_factory.dart"; // for platform-specific database -import "service.dart"; +import "auth.dart"; +import "database.dart"; +import "local_db/idb_factory_stub.dart" + if (dart.library.io) "local_db/idb_factory_io.dart" + if (dart.library.html) "local_db/idb_factory_web.dart"; /// Provides convenience methods around an [idb.ObjectStore]. -extension ObjectExtension on idb.ObjectStore { +extension ObjectStoreExtension on idb.ObjectStore { + /// Gets the data at the key in this object store. + /// + /// This extension provides type safety. Future get(dynamic key) async => await getObject(key) as T; } /// Provides convenience methods on a [Database]. extension DatabaseExtension on idb.Database { + /// Gets data at a key in an object store. + /// + /// This code handles transactions so other code doesn't have to. Future get(String storeName, dynamic key) => transaction(storeName, idb.idbModeReadOnly) .objectStore(storeName) .get(key); + /// Adds data at a key to an object store. + /// + /// This code handles transactions so other code doesn't have to. Future add(String storeName, T value) => transaction(storeName, idb.idbModeReadWrite) .objectStore(storeName) .add(value); + /// Updates data in an object store. + /// + /// This function does not care if the key already exists, it will simply + /// update it. + /// + /// This code can produce unexpected behavior if the object store does not + /// have a key. + /// + /// This code handles transactions so other code doesn't have to. Future update(String storeName, T value) => transaction(storeName, idb.idbModeReadWrite) .objectStore(storeName) .put(value); + /// Gets all the data in an object store. + /// + /// Also provides strong type safety on those values, treating them like JSON + /// objects. This code handles transactions so other code doesn't have to. Future>> getAll(String storeName) async => [ for ( final dynamic entry in @@ -35,22 +59,68 @@ extension DatabaseExtension on idb.Database { ]; } +/// A database that's hosted on the user's device. +/// +/// On mobile, the database is based on a complex JSON file. On web, the browser +/// has a built-in database called IndexedDb (idb for short). The mobile +/// implementation is built to match the idb schema. +/// +/// In idb, a table is called an "object store". There are two ways of +/// identifying rows: either by a key (a unique column), or an auto-incrementing +/// value. The choice should be made based on the data in that object store. +/// +/// Reading and writing data is done with transactions. This process is +/// abstracted by [ObjectStoreExtension] and [DatabaseExtension]. +/// +/// Another quirk of idb is that object stores can only be created on startup. +/// One way this is relevant is in [isSignedIn]. If it turns out that the user +/// is not signed in, it would be too late to create new object stores. That's +/// why the function that creates new object stores ([createObjectStores]) is +/// called in [init], so that it runs right away. +/// +/// Another consequence of having to consolidate object store creation in the +/// very beginning is that there is a strict way of migrating from one database +/// schema to another. Each database schema has a version number. When the app +/// starts, the [init] function checks to see what version the database is on. +/// If the code demands a new version, there must be code to create and destroy +/// object stores until the schemas match. The simplest way to do that is by +/// using a switch statement. A switch statement cascades, meaning the changes +/// from one version to another will follow each other, which should always +/// lead to an up-to-date schema. class LocalDatabase extends Database { + /// The name for the users object store. static const String userStoreName = "users"; + + /// The name for the sections object store. static const String sectionStoreName = "sections"; + + /// The name for the calendar object store. static const String calendarStoreName = "calendar"; + + /// The name for the reminders object store. static const String reminderStoreName = "reminders"; + + /// The name for the admin object store. static const String adminStoreName = "admin"; + + /// The name for the sports object store. static const String sportsStoreName = "sports"; + /// All the object stores. + /// + /// This is used in [signOut] to purge all the data. static const List storeNames = [ userStoreName, sectionStoreName, calendarStoreName, reminderStoreName, adminStoreName, sportsStoreName, ]; + /// The idb database itself. + /// + /// Not to be confused with a RamLife [Database]. idb.Database database; - Future initialize(idb.Database database) async => database + /// Creates all the object stores from scratch, specifying their keys. + Future createObjectStores(idb.Database database) async => database ..createObjectStore(userStoreName, keyPath: "email") ..createObjectStore(sectionStoreName, keyPath: "id") ..createObjectStore(calendarStoreName, keyPath: "month") @@ -65,7 +135,7 @@ class LocalDatabase extends Database { onUpgradeNeeded: (idb.VersionChangeEvent event) { switch (event.oldVersion) { case 0: // fresh install - initialize(event.database); + createObjectStores(event.database); break; } } @@ -94,17 +164,10 @@ class LocalDatabase extends Database { Future setUser(Map json) => database.add(userStoreName, json); + @override Future> getSection(String id) => database.get(sectionStoreName, id); - @override - Future>> getSections( - Set ids - ) async => { - for (final String id in ids) - id: await getSection(id) - }; - @override Future setSections(Map> json) async { for (final Map entry in json.values) { diff --git a/lib/src/services/local_db/idb_factory.dart b/lib/src/services/local_db/idb_factory.dart deleted file mode 100644 index b2243ac7e..000000000 --- a/lib/src/services/local_db/idb_factory.dart +++ /dev/null @@ -1,3 +0,0 @@ -export "idb_factory_stub.dart" - if (dart.library.io) "idb_factory_io.dart" - if (dart.library.html) "idb_factory_web.dart"; \ No newline at end of file diff --git a/lib/src/services/local_db/idb_factory_io.dart b/lib/src/services/local_db/idb_factory_io.dart index 2ced90866..4556ea7a4 100644 --- a/lib/src/services/local_db/idb_factory_io.dart +++ b/lib/src/services/local_db/idb_factory_io.dart @@ -2,6 +2,9 @@ import "package:idb_shim/idb_shim.dart"; import "package:idb_shim/idb_io.dart"; import "package:path_provider/path_provider.dart"; +/// Provides access to an IndexedDB implementation. +/// +/// The mobile implementation is based on a .json file. Future get idbFactory async => getIdbFactoryPersistent( (await getApplicationDocumentsDirectory()).path ); diff --git a/lib/src/services/local_db/idb_factory_stub.dart b/lib/src/services/local_db/idb_factory_stub.dart index 27f2c1348..655608e2b 100644 --- a/lib/src/services/local_db/idb_factory_stub.dart +++ b/lib/src/services/local_db/idb_factory_stub.dart @@ -1,3 +1,6 @@ import "package:idb_shim/idb_shim.dart"; +/// Provides access to an IndexedDB implementation. +/// +/// Throws an error on an unrecognized platform. Future get idbFactory => throw UnsupportedError("Unknown platform"); diff --git a/lib/src/services/local_db/idb_factory_web.dart b/lib/src/services/local_db/idb_factory_web.dart index 486bf35f5..b5dd2e57c 100644 --- a/lib/src/services/local_db/idb_factory_web.dart +++ b/lib/src/services/local_db/idb_factory_web.dart @@ -1,4 +1,7 @@ import "package:idb_shim/idb_shim.dart"; import "package:idb_shim/idb_browser.dart"; +/// Provides access to an IndexedDB implementation. +/// +/// The browser has an implementation built-in. Future get idbFactory async => idbFactoryBrowser; diff --git a/lib/src/services/notifications.dart b/lib/src/services/notifications.dart index 045c28abc..0dedcfb64 100644 --- a/lib/src/services/notifications.dart +++ b/lib/src/services/notifications.dart @@ -5,6 +5,7 @@ import "package:ramaz/constants.dart"; import "service.dart"; +/// Describes how a reminders notification should look. NotificationDetails reminderDetails = const NotificationDetails( android: AndroidNotificationDetails( "reminders", @@ -35,7 +36,7 @@ NotificationDetails reminderDetails = const NotificationDetails( class Notification { /// The ID of this notification. /// - /// The ID is used for cancelling the notifications. + /// The ID is used for canceling the notifications. int get id => 0; /// The title of this notification. @@ -64,8 +65,15 @@ class Notification { // ignore: avoid_classes_with_only_static_members /// An abstract wrapper around the notifications plugin. /// -/// This class uses static methods to send and schedule -/// notifications. +/// There are two types of notifications: local notifications, and push +/// notifications. Local notifications are sent by the app itself, and +/// push notifications are sent by the server. These are local notifications. +/// +/// Local notifications can be customized to appear differently depending on +/// the type of notification and platform. They can also be scheduled to appear +/// at certain times. This is based on [FlutterLocalNotificationsPlugin]. +/// +/// Currently, Web is not supported. class Notifications extends Service { final _plugin = FlutterLocalNotificationsPlugin(); diff --git a/lib/src/services/service.dart b/lib/src/services/service.dart index 6dc7eca44..a8fc1eb06 100644 --- a/lib/src/services/service.dart +++ b/lib/src/services/service.dart @@ -1,69 +1,34 @@ +/// A Service that interacts with third-party code. +/// +/// A service can be defined as a plugin which needs special code to interact +/// with, independent of the functionality of the service. For example, +/// authentication needs a lot of extra code, before you even get into the +/// details like sign-in providers and UI flow. +/// +/// This class is abstract and provides a structure to all services, which +/// should inherit from it. There are two functions that provide convenient +/// hooks for managing the life cycle of the service. +/// +/// The first one is the [init] function. The init function should contain code +/// that needs to be run when the app starts, whether or not the user is signed +/// in. +/// +/// The other function is the [signIn] function. The signIn function should +/// contain code that needs to be run when the user signs into the app. One +/// example can be notifications that need to request permissions when the +/// user logs in. +/// +/// Other than the [signIn] function, services should not care (or know) whether +/// the user is signed in or not. abstract class Service { + /// Initializes the service. + /// + /// Override this function with code that needs to be run when the app starts. + /// A good use for this is registering with plugins that return a Future. Future init(); + /// A callback that runs when the user signs in. + /// + /// Override this function with code that facilitates the sign-in process. Future signIn(); } - -abstract class Database extends Service { - static const String calendarKey = "calendar"; - - Future get isSignedIn; - - Future signOut(); - - /// The user object as JSON - Future> get user; - - /// Changes the user JSON object. - Future setUser(Map json); - - /// The different classes (sections, not courses) for a schedule. - Future>> getSections(Set ids); - - /// Changes the user's classes. - Future setSections(Map> json); - - /// The calendar in JSON form. - /// - /// Admins can change this with [setCalendar]. - Future>>> get calendar async => [ - for (int month = 1; month <= 12; month++) [ - for (final dynamic day in (await getCalendarMonth(month)) [calendarKey]) - Map.from(day) - ] - ]; - - Future> getCalendarMonth(int month); - - /// Changes the calendar in the database. - /// - /// The fact that this method takes a [month] parameter while [calendar] does - /// not is an indicator that the calendar schema needs to be rewritten. - /// - /// [month] must be 1-12, not 0-11. - /// - /// Only admins can change this. - Future setCalendar(int month, Map json); - - /// The user's reminders. - Future>> get reminders; - - /// Changes the user's reminders. - Future setReminders(List> json); - - /// The admin object (or null). - Future> get admin; - - /// Sets the admin object for this user. - Future setAdmin(Map json); - - /// The sports games. - /// - /// Admins can change this with [setSports]. - Future>> get sports; - - /// Changes the sports games (for all users). - /// - /// Only admins can change this. - Future setSports(List> json); -} \ No newline at end of file From 36d0b2e8d5dc4f3eca671aa3b9110fbbf0afdd30 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 16:30:22 -0400 Subject: [PATCH 044/251] Refactored FCM into the PushNotification Service --- lib/src/services/fcm.dart | 2 - lib/src/services/fcm/mobile.dart | 116 ------------------ lib/src/services/fcm/stub.dart | 7 -- lib/src/services/notifications.dart | 1 - lib/src/services/push_notifications.dart | 33 +++++ .../services/push_notifications/mobile.dart | 106 ++++++++++++++++ lib/src/services/push_notifications/stub.dart | 26 ++++ 7 files changed, 165 insertions(+), 126 deletions(-) delete mode 100644 lib/src/services/fcm.dart delete mode 100644 lib/src/services/fcm/mobile.dart delete mode 100644 lib/src/services/fcm/stub.dart create mode 100644 lib/src/services/push_notifications.dart create mode 100644 lib/src/services/push_notifications/mobile.dart create mode 100644 lib/src/services/push_notifications/stub.dart diff --git a/lib/src/services/fcm.dart b/lib/src/services/fcm.dart deleted file mode 100644 index 3b807bf39..000000000 --- a/lib/src/services/fcm.dart +++ /dev/null @@ -1,2 +0,0 @@ -export "fcm/stub.dart" - if (dart.library.io) "fcm/mobile.dart"; \ No newline at end of file diff --git a/lib/src/services/fcm/mobile.dart b/lib/src/services/fcm/mobile.dart deleted file mode 100644 index c6aa9a034..000000000 --- a/lib/src/services/fcm/mobile.dart +++ /dev/null @@ -1,116 +0,0 @@ -import "dart:convert" show JsonUnsupportedObjectError; -import "package:firebase_messaging/firebase_messaging.dart"; - -/// Callback that expects no arguments and returns no data. -typedef VoidCallback = Future Function(); - -// ignore: avoid_classes_with_only_static_members -/// An abstraction around Firebase Cloud Messaging. -/// -/// The app can receive a notification from Firebase at any time. -/// What it does with the notification depends on when it was received: -/// -/// - If the app is in the foreground, `onMessage` is called. -/// - If the app is in the background: -/// - If it's a notification, `onResume` is called when the app starts. -/// - Otherwise, `onMessage` is called. -/// - If the app is terminated, `onLaunch` will be called when the app is -/// opened. -/// -/// In any case, notification configuration is handled by -/// [registerNotifications], which assigns the same callback to all cases. -/// The callbacks can be registered by passing in a map to -/// [registerNotifications]. The value of the `command` field will be used as -/// the key to the map parameter. See [registerNotifications] for more details. -class FCM { - static final FirebaseMessaging _firebase = FirebaseMessaging(); - - /// A list of topics to subscribe to. - /// - /// Notifications sent with these topics will be received by the app. - static const List topics = ["calendar", "sports"]; - - /// Returns the device's FCM token - static Future get token => _firebase.getToken(); - - /// Registers a group of callbacks with Firebase Cloud Messaging. - /// - /// The callbacks should be a map of command keys and functions. - /// The value of the `command` field of the data message will be passed - /// as the key to the [commands]. This function should be called from a scope - /// with access to data models and services. - static Future registerNotifications( - Map commands - ) async { - // First, get permission on iOS: - _firebase.requestNotificationPermissions(); - - /// Calls the correct function based on the data message. - /// - /// This function handles validation of the notification and looks - /// up the correct callback function based on the command in the - /// data payload of the notification. - Future callback(Map message) async { - // DO NOT TRY TO GIVE THIS TYPE ARGUMENTS - // For some reason adding Map won't let the code - // continue, not even throwing an error. I think I spent like an - // hour debugging this with 0 progress whatsoever. Attempt at - // your own risk, but you've been warned. - final Map data = message["data"] ?? message; - - final String command = data ["command"]; - if (command == null) { - throw JsonUnsupportedObjectError( - message, - cause: "Data payload doesn't contain a 'command' field'", - partialResult: data.toString(), - ); - } - - // Same warning about types applies here. - final function = commands [command]; - if (function == null) { - throw ArgumentError.value( - command, - "Command", - "The 'command' field of the Firebase Cloud Message must be one of: " - "${commands.keys.toList().join(", ")}" - ); - } else { - await function(); - } - } - - // Register the callback - _firebase.configure( - onMessage: callback, - onResume: callback, - onLaunch: callback, - ); - } - - /// Subscribes to all the topics in [topics]. - static Future subscribeToTopics() async { - for (final String topic in topics) { - await _firebase.subscribeToTopic(topic); - } - } - - Future init() async { - // Register for FCM notifications. - // We don't care when this happens - // ignore: unawaited_futures - Future( - () async { - await FCM.registerNotifications( - { - // "refresh": initialize, - // "updateCalendar": updateCalendar, - // "updateSports": updateSports, - } - ); - await FCM.subscribeToTopics(); - } - ); - } -} diff --git a/lib/src/services/fcm/stub.dart b/lib/src/services/fcm/stub.dart deleted file mode 100644 index a1a1d2300..000000000 --- a/lib/src/services/fcm/stub.dart +++ /dev/null @@ -1,7 +0,0 @@ -class FCM { - static Future registerNotifications( - Map commands - ) async {} - - static Future subscribeToTopics() async {} -} diff --git a/lib/src/services/notifications.dart b/lib/src/services/notifications.dart index 0dedcfb64..f9a7ca8c8 100644 --- a/lib/src/services/notifications.dart +++ b/lib/src/services/notifications.dart @@ -62,7 +62,6 @@ class Notification { }) : details = reminderDetails; } -// ignore: avoid_classes_with_only_static_members /// An abstract wrapper around the notifications plugin. /// /// There are two types of notifications: local notifications, and push diff --git a/lib/src/services/push_notifications.dart b/lib/src/services/push_notifications.dart new file mode 100644 index 000000000..f24f4f4ab --- /dev/null +++ b/lib/src/services/push_notifications.dart @@ -0,0 +1,33 @@ +import "push_notifications/stub.dart" + if (dart.library.io) "push_notifications/mobile.dart"; + +import "service.dart"; + +/// Callback that expects no arguments and returns no data. +typedef AsyncCallback = Future Function(); + +/// An abstract wrapper around the notifications plugin. +/// +/// There are two types of notifications: local notifications, and push +/// notifications. Local notifications are sent by the app itself, and +/// push notifications are sent by the server. These are push notifications. +/// +/// Push notifications can trigger certain callbacks based on the content of +/// the notification. Use [registerForNotifications] to pass in callbacks and +/// use [subscribeToTopics] to specify what types of notifications the app +/// should be listening for. +abstract class PushNotifications extends Service { + /// The default implementation of [PushNotifications]. + static PushNotifications instance = getPushNotifications(); + + /// Registers async callbacks with push notifications. + /// + /// Each push notification has a `command` field. This function uses the value + /// of that field to find the correct function to run. + Future registerForNotifications(Map callbacks); + + /// Subscribes to certain topics. + /// + /// The server will notify the app when a notification is served to that topic. + Future subscribeToTopics(); +} diff --git a/lib/src/services/push_notifications/mobile.dart b/lib/src/services/push_notifications/mobile.dart new file mode 100644 index 000000000..fd57e50db --- /dev/null +++ b/lib/src/services/push_notifications/mobile.dart @@ -0,0 +1,106 @@ +import "dart:convert" show JsonUnsupportedObjectError; +import "package:firebase_messaging/firebase_messaging.dart"; + +import "../firebase_core.dart"; +import "../push_notifications.dart"; + +/// Provides the correct implementation for push notifications. +/// +/// On mobile, uses Firebase Messaging. +PushNotifications getPushNotifications() => FCM(); + +/// Receives push notifications using Firebase Messaging. +/// +/// The app can receive a notification from Firebase at any time. +/// What it does with the notification depends on when it was received: +/// +/// - If the app is in the foreground, `onMessage` is called. +/// - If the app is in the background: +/// - If it's a notification, `onResume` is called when the app starts. +/// - Otherwise, `onMessage` is called. +/// - If the app is terminated, `onLaunch` will be called when the app is +/// opened. +/// +/// In any case, notification configuration is handled by +/// [registerForNotifications], which assigns the same callback to all cases. +/// The callbacks can be registered by passing in a map to +/// [registerForNotifications]. +/// +/// The value of the `command` field of the notification will be used as +/// the key to the map parameter. See [callback] for details. +class FCM extends PushNotifications { + /// A list of topics to subscribe to. + /// + /// Notifications sent with these topics will be received by the app. + static const List topics = ["calendar", "sports"]; + + /// Provides the connection to Firebase Messaging. + static final FirebaseMessaging firebase = FirebaseMessaging(); + + @override + Future init() async { + await FirebaseCore.init(); + await registerForNotifications( + { + // "refresh": initialize, + // "updateCalendar": updateCalendar, + // "updateSports": updateSports, + } + ); + await subscribeToTopics(); + } + + @override + Future signIn() async => firebase.requestNotificationPermissions(); + + /// A callback to handle any notification. + /// + /// This function uses the `command` field of the notification to find the + /// right [AsyncCallback], and calls it. + Future callback( + Map message, + Map callbacks + ) async { + final String command = (message["data"] ?? message) ["command"]; + if (command == null) { + throw JsonUnsupportedObjectError( + message, + cause: "Data payload doesn't contain a 'command' field'", + partialResult: message.toString(), + ); + } + final AsyncCallback function = callbacks [command]; + if (function == null) { + throw ArgumentError.value( + command, + "Command", + "The 'command' field of the Firebase Cloud Message must be one of: " + "${callbacks.keys.toList().join(", ")}" + ); + } + await function(); + } + + @override + Future registerForNotifications( + Map callbacks + ) async { + Future handler(Map message) => + callback(message, callbacks); + + firebase.configure( + onMessage: handler, + onBackgroundMessage: handler, + onLaunch: handler, + onResume: handler, + ); + } + + /// Subscribes to all the topics in [topics]. + @override + Future subscribeToTopics() async { + for (final String topic in topics) { + await firebase.subscribeToTopic(topic); + } + } +} diff --git a/lib/src/services/push_notifications/stub.dart b/lib/src/services/push_notifications/stub.dart new file mode 100644 index 000000000..842074568 --- /dev/null +++ b/lib/src/services/push_notifications/stub.dart @@ -0,0 +1,26 @@ +import "../push_notifications.dart"; + +/// Provides the correct implementation for push notifications. +/// +/// Currently, Firebase Messaging is not supported on web, so this function +/// provides a blank implementation. +PushNotifications getPushNotifications() => PushNotificationsStub(); + +/// Receives push notifications using Firebase Messaging. +/// +/// Currently, Firebase Messaging does not support web. +class PushNotificationsStub extends PushNotifications { + @override + Future init() async {} + + @override + Future signIn() async {} + + @override + Future registerForNotifications( + Map callbacks + ) async {} + + @override + Future subscribeToTopics() async {} +} From 528941c22d2750849b8cdf263ca2d9e5d4571f83 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 17:00:15 -0400 Subject: [PATCH 045/251] Cleaned up Services exports --- lib/services.dart | 6 +++--- lib/src/models/data/admin/calendar.dart | 2 +- lib/src/models/data/schedule.dart | 7 ++++--- lib/src/widgets/ambient/brightness_changer.dart | 2 -- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/services.dart b/lib/services.dart index 9fa33baa9..275af9f2f 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -19,12 +19,11 @@ import "src/services/crashlytics.dart"; import "src/services/databases.dart"; import "src/services/notifications.dart"; import "src/services/preferences.dart"; +import "src/services/push_notifications.dart"; import "src/services/service.dart"; export "src/services/auth.dart"; -export "src/services/cloud_db.dart"; export "src/services/crashlytics.dart"; -export "src/services/databases.dart"; export "src/services/notifications.dart"; export "src/services/preferences.dart"; @@ -35,6 +34,7 @@ class Services implements Service { final Crashlytics crashlytics = Crashlytics.instance; final Databases database = Databases(); final Notifications notifications = Notifications(); + final PushNotifications pushNotifications = PushNotifications.instance; final Preferences prefs = Preferences(); List services; @@ -43,7 +43,7 @@ class Services implements Service { /// /// Also initializes [services]. Services() { - services = [prefs, database, crashlytics, notifications]; + services = [prefs, database, crashlytics, notifications, pushNotifications]; } @override diff --git a/lib/src/models/data/admin/calendar.dart b/lib/src/models/data/admin/calendar.dart index 8e75c1b65..cb76f3709 100644 --- a/lib/src/models/data/admin/calendar.dart +++ b/lib/src/models/data/admin/calendar.dart @@ -56,7 +56,7 @@ class CalendarModel with ChangeNotifier { /// Creates a data model to hold the calendar. /// /// Initializing a [CalendarModel] automatically listens to the calendar in - /// Firebase. See [CloudDatabase.getCalendarStream] for details. + /// Firebase. CalendarModel() { for (int month = 0; month < 12; month++) { subscriptions.add( diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index da5089b74..a1e100a25 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -58,9 +58,10 @@ class Schedule with ChangeNotifier { /// /// Should be called whenever there is new data for this model to work with. Future init() async { - final Databases database = Services.instance.database; - student = Student.fromJson(await database.user); - subjects = Subject.getSubjects(await database.getSections(student.getIds())); + student = Student.fromJson(await Services.instance.database.user); + subjects = Subject.getSubjects( + await Services.instance.database.getSections(student.getIds()) + ); await initCalendar(); } diff --git a/lib/src/widgets/ambient/brightness_changer.dart b/lib/src/widgets/ambient/brightness_changer.dart index 1b0089512..a544d1eed 100644 --- a/lib/src/widgets/ambient/brightness_changer.dart +++ b/lib/src/widgets/ambient/brightness_changer.dart @@ -107,7 +107,6 @@ class BrightnessChanger extends StatelessWidget { ), ); - /// void setBrightness (BuildContext context, {bool value}) { ThemeChanger.of(context).brightness = caseConverter ( value: value, @@ -116,6 +115,5 @@ class BrightnessChanger extends StatelessWidget { onNull: MediaQuery.of(context).platformBrightness, ); prefs.brightness = value; - // brightnessNotifier.value = value; // trigger rebuild } } From f30b4b532e4220fb0bfb4706a3e46d7e51d061b7 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Oct 2020 19:20:39 -0400 Subject: [PATCH 046/251] Defined data classes for clubs feature --- lib/src/data/club.dart | 31 +++++++++++++++++++++++++++++++ lib/src/data/contact_info.dart | 18 ++++++++++++++++++ lib/src/data/message.dart | 14 ++++++++++++++ lib/src/data/student_clubs.dart | 24 ++++++++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 lib/src/data/club.dart create mode 100644 lib/src/data/contact_info.dart create mode 100644 lib/src/data/message.dart create mode 100644 lib/src/data/student_clubs.dart diff --git a/lib/src/data/club.dart b/lib/src/data/club.dart new file mode 100644 index 000000000..73dbf5424 --- /dev/null +++ b/lib/src/data/club.dart @@ -0,0 +1,31 @@ +import "package:meta/meta.dart"; +import "contact_info.dart"; +import "message.dart"; + +class Club { + final String name; + final String shortDescription; + final String description; + final List captains; + final ContactInfo facultyAdvisor; + final String image; + final List members; + final List messages; + final String formUrl; + final bool phoneNumberRequested; + final Map attendance; + + Club({ + @required this.name, + @required this.shortDescription, + @required this.description, + @required this.phoneNumberRequested, + @required this.captains, + @required this.facultyAdvisor, + @required this.image, + this.formUrl, + }) : + members = [], + attendance = {}, + messages = []; +} diff --git a/lib/src/data/contact_info.dart b/lib/src/data/contact_info.dart new file mode 100644 index 000000000..270fa7406 --- /dev/null +++ b/lib/src/data/contact_info.dart @@ -0,0 +1,18 @@ +import "package:meta/meta.dart"; + +class ContactInfo { + final String name; + final String email; + final String phoneNumber; + + ContactInfo({ + @required this.name, + @required this.email, + @required this.phoneNumber, + }); + + ContactInfo.fromJson(Map json) : + name = json ["name"], + email = json ["email"], + phoneNumber = json ["phoneNumber"]; +} diff --git a/lib/src/data/message.dart b/lib/src/data/message.dart new file mode 100644 index 000000000..c43918d78 --- /dev/null +++ b/lib/src/data/message.dart @@ -0,0 +1,14 @@ +import "package:meta/meta.dart"; +import "contact_info.dart"; + +class Message { + ContactInfo sender; + DateTime timestamp; + String body; + + Message({ + @required this.sender, + @required this.timestamp, + @required this.body, + }); +} diff --git a/lib/src/data/student_clubs.dart b/lib/src/data/student_clubs.dart new file mode 100644 index 000000000..90cd4dec8 --- /dev/null +++ b/lib/src/data/student_clubs.dart @@ -0,0 +1,24 @@ +import "package:meta/meta.dart"; + +import "club.dart"; +import "contact_info.dart"; + +enum Grade { + freshman, + sophomore, + junior, + senior +} + +class Student { + final ContactInfo contact; + final List clubsAttending; + final Grade grade; + + Student({ + @required this.contact, + @required this.clubsAttending, + @required this.grade, + }); +} + From 43479683d711b0d3648b4bfe5a0d6b8539bfa7c8 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Oct 2020 15:23:55 -0400 Subject: [PATCH 047/251] Organized data library --- lib/data.dart | 17 +- lib/src/data/admin.dart | 4 +- lib/src/data/{ => clubs}/club.dart | 3 +- lib/src/data/{ => clubs}/message.dart | 3 +- lib/src/data/feedback.dart | 2 +- lib/src/data/reminder.dart | 2 +- lib/src/data/schedule.dart | 407 ------------------ lib/src/data/schedule/activity.dart | 134 ++++++ lib/src/data/schedule/advisory.dart | 16 + lib/src/data/schedule/day.dart | 152 +++++++ lib/src/data/schedule/period.dart | 187 ++++++++ .../{times.dart => schedule/special.dart} | 259 +---------- lib/src/data/schedule/subject.dart | 66 +++ lib/src/data/schedule/time.dart | 124 ++++++ lib/src/data/sports.dart | 5 +- lib/src/data/student.dart | 233 +++++----- lib/src/data/student_clubs.dart | 24 -- 17 files changed, 836 insertions(+), 802 deletions(-) rename lib/src/data/{ => clubs}/club.dart (95%) rename lib/src/data/{ => clubs}/message.dart (86%) delete mode 100644 lib/src/data/schedule.dart create mode 100644 lib/src/data/schedule/activity.dart create mode 100644 lib/src/data/schedule/advisory.dart create mode 100644 lib/src/data/schedule/day.dart create mode 100644 lib/src/data/schedule/period.dart rename lib/src/data/{times.dart => schedule/special.dart} (61%) create mode 100644 lib/src/data/schedule/subject.dart create mode 100644 lib/src/data/schedule/time.dart delete mode 100644 lib/src/data/student_clubs.dart diff --git a/lib/data.dart b/lib/data.dart index 959c1ccca..71aea6bb5 100644 --- a/lib/data.dart +++ b/lib/data.dart @@ -9,9 +9,22 @@ library data; export "src/data/admin.dart"; + +// The clubs feature +export "src/data/clubs/club.dart"; +export "src/data/clubs/message.dart"; + export "src/data/feedback.dart"; export "src/data/reminder.dart"; -export "src/data/schedule.dart"; + +// The schedule feature +export "src/data/schedule/activity.dart"; +export "src/data/schedule/advisory.dart"; +export "src/data/schedule/day.dart"; +export "src/data/schedule/period.dart"; +export "src/data/schedule/special.dart"; +export "src/data/schedule/subject.dart"; +export "src/data/schedule/time.dart"; + export "src/data/sports.dart"; export "src/data/student.dart"; -export "src/data/times.dart"; diff --git a/lib/src/data/admin.dart b/lib/src/data/admin.dart index 42eb4d8aa..48b35e287 100644 --- a/lib/src/data/admin.dart +++ b/lib/src/data/admin.dart @@ -1,6 +1,6 @@ -import "package:flutter/foundation.dart"; +import "package:meta/meta.dart"; -import "times.dart"; +import "schedule/special.dart"; /// Scopes for administrative privileges. /// diff --git a/lib/src/data/club.dart b/lib/src/data/clubs/club.dart similarity index 95% rename from lib/src/data/club.dart rename to lib/src/data/clubs/club.dart index 73dbf5424..c7a416773 100644 --- a/lib/src/data/club.dart +++ b/lib/src/data/clubs/club.dart @@ -1,5 +1,6 @@ import "package:meta/meta.dart"; -import "contact_info.dart"; + +import "../contact_info.dart"; import "message.dart"; class Club { diff --git a/lib/src/data/message.dart b/lib/src/data/clubs/message.dart similarity index 86% rename from lib/src/data/message.dart rename to lib/src/data/clubs/message.dart index c43918d78..ae539516e 100644 --- a/lib/src/data/message.dart +++ b/lib/src/data/clubs/message.dart @@ -1,5 +1,6 @@ import "package:meta/meta.dart"; -import "contact_info.dart"; + +import "../contact_info.dart"; class Message { ContactInfo sender; diff --git a/lib/src/data/feedback.dart b/lib/src/data/feedback.dart index 4418229ee..b63455d9b 100644 --- a/lib/src/data/feedback.dart +++ b/lib/src/data/feedback.dart @@ -1,4 +1,4 @@ -import "package:flutter/foundation.dart" show immutable, required; +import "package:meta/meta.dart"; /// Feedback from the user. @immutable diff --git a/lib/src/data/reminder.dart b/lib/src/data/reminder.dart index 1806b4dbe..58ca691f7 100644 --- a/lib/src/data/reminder.dart +++ b/lib/src/data/reminder.dart @@ -7,7 +7,7 @@ library reminder_dataclasses; import "dart:convert" show JsonUnsupportedObjectError; -import "package:flutter/foundation.dart" show required, immutable; +import "package:meta/meta.dart"; /// An enum to decide when the reminder should appear. /// diff --git a/lib/src/data/schedule.dart b/lib/src/data/schedule.dart deleted file mode 100644 index 3b1da86b6..000000000 --- a/lib/src/data/schedule.dart +++ /dev/null @@ -1,407 +0,0 @@ -/// This library holds data classes for various schedule-related data. -/// -/// Classes here are used to abstract the weird schedule details -/// to make the code a whole lot simpler. -library schedule_dataclasses; - -import "dart:convert" show JsonUnsupportedObjectError; -import "package:flutter/foundation.dart"; - -import "times.dart"; - -/// A subject, or class, that a student can take. -/// -/// Since one's schedule contains multiple instances of the same subject, -/// subjects are represented externally by an ID, which is used to look up -/// a canonicalized [Subject] instance. This saves space and simplifies -/// compatibility with existing school databases. -@immutable -class Subject { - /// Returns a map of [Subject]s from a list of JSON objects. - /// - /// The keys are IDs to the subject, and the values are the - /// corresponding [Subject] instances. - /// See [Subject.fromJson] for more details. - static Map getSubjects( - Map> data - ) => data.map ( - (String id, Map json) => MapEntry ( - id, - Subject.fromJson(json) - ) - ); - - /// The name of this subject. - final String name; - - /// The teacher who teaches this subject. - final String teacher; - - /// A const constructor for a [Subject]. - const Subject ({ - @required this.name, - @required this.teacher - }); - - /// Returns a [Subject] instance from a JSON object. - /// - /// The JSON map must have a `teacher` and `name` field. - Subject.fromJson(Map json) : - name = json ["name"], - teacher = json ["teacher"] - { - if (name == null || teacher == null) { - throw JsonUnsupportedObjectError (json.toString()); - } - } - - @override - String toString() => "$name ($teacher)"; - - @override - int get hashCode => "$name-$teacher".hashCode; - - @override - bool operator == (dynamic other) => other is Subject && - other.name == name && - other.teacher == teacher; -} - -/// A representation of a period, independent of the time. -/// -/// This is needed since the time can change on any day. -/// See [Special] for when the times can change. -@immutable -class PeriodData { - /// Returns a list of [PeriodData] from a JSON object. - /// - /// Note that some entries in the list may be null. - /// They represent a free period in the schedule. - /// See [PeriodData.fromJson] for more details. - static List getList(List json) => [ - for (final dynamic periodJson in json) - periodJson == null ? null : - PeriodData.fromJson(Map.from(periodJson)) - ]; - - /// The room the student needs to be in for this period. - final String room; - - /// The id for this period's subject. - /// - /// See the [Subject] class for more details. - final String id; - - /// A const constructor for a [PeriodData]. - /// - /// If both [id] and [room] are null, then it is a free period. - /// Use [PeriodData.free] instead. Otherwise, it is considered an error - /// to have a null [room] OR [id]. - const PeriodData ({ - @required this.room, - @required this.id - }) : - assert ( - room != null || id != null, - "Room and id must both be null or not." - ); - - const PeriodData._free() : - room = null, - id = null; - - /// A free period. - /// - /// Use this instead of manually constructing a [PeriodData] - /// to keep consistency throughout the code. - static const free = PeriodData._free(); - - /// Returns a [PeriodData] from a JSON object. - /// - /// If the JSON object is null, then it is considered a free period. - /// Otherwise, both `json ["room"]` and `json ["id"]` must be non-null. - factory PeriodData.fromJson (Map json) => json == null - ? PeriodData.free - : PeriodData( - room: json ["room"], - id: json ["id"] - ); - - @override - String toString() => "PeriodData ($id, $room)"; - - @override - int get hashCode => "$room-$id".hashCode; - - @override - bool operator == (dynamic other) => other is PeriodData && - other.id == id && - other.room == room; -} - -/// A representation of a period, including the time it takes place. -/// -/// Period objects unpack the [PeriodData] passed to them, -/// so that they alone contain all the information to represent a period. -@immutable -class Period { - /// The time this period takes place. - /// - /// If the time is not known (ie, the schedule is [Special.modified]), - /// then this will be null. - final Range time; - - /// The room this period is in. - /// - /// It may be null, indicating that the student is not expected to be in class. - /// - /// Since the room comes from a [PeriodData] object, both the room and [id] - /// must both be null, or both must be non-null. See [PeriodData()] for more. - final String room; - - /// A String representation of this period. - /// - /// Since a period can be a number (like 9), or a word (like "Homeroom"), - /// String was chosen to represent both. This means that the app does not - /// care whether a period is a regular class or something like homeroom. - final String period; - - /// The id of the [Subject] for this period. - /// - /// It may be null, indicating that the student is not expected - /// to be in a class at this time. - /// - /// Since the id comes from a [PeriodData] object, both the id and [room] - /// must both be null, or both must be non-null. See [PeriodData()] for more. - final String id; - - /// The activity for this period. - /// - /// This is set in [Special.activities]. - final Activity activity; - - /// Unpacks a [PeriodData] object and returns a Period. - Period( - PeriodData data, - {@required this.time, @required this.period, @required this.activity} - ) : - room = data.room, - id = data.id; - - /// Returns a period that represents time for Mincha. - /// - /// Use this constructor to keep a consistent definition of "Mincha". - const Period.mincha(this.time, {this.activity}) : - room = null, - id = null, - period = "Mincha"; - - /// This is only for debug purposes. Use [getName] for UI labels. - @override - String toString() => "Period $period"; - - @override - int get hashCode => "$period-$id".hashCode; - - @override - bool operator == (dynamic other) => other is Period && - other.time == time && - other.room == room && - other.period == period && - other.id == id; - - /// Returns a String representation of this period. - /// - /// The expected subject can be retrieved by looking up the [id]. - /// - /// If [period] is an integer and [id] is null, then it is a free period. - /// Otherwise, if [period] is not a number, than it is returned instead. - /// Finally, the [Subject] that corresponds to [id] will be returned. - /// - /// For example: - /// - /// 1. A period with [PeriodData.free] will return "Free period" - /// 2. A period with `period == "Homeroom"` will return "Homeroom" - /// 3. A period with `period == "3"` will return the name of the [Subject]. - /// - String getName(Subject subject) => int.tryParse(period) != null && id == null - ? "Free period" - : subject?.name ?? period; - - /// Returns a list of descriptions for this period. - /// - /// The expected subject can be retrieved by looking up the [id]. - /// - /// Useful throughout the UI. This function will: - /// - /// 1. Always display the time. - /// 2. If [period] is a number, will display the period. - /// 3. If [room] is not null, will display the room. - /// 4. If [id] is valid, will return the name of the [Subject]. - /// - List getInfo (Subject subject) => [ - if (time != null) "Time: $time", - if (int.tryParse(period) != null) "Period: $period", - if (room != null) "Room: $room", - if (subject != null) "Teacher: ${subject.teacher}", - ]; -} - -/// A day at Ramaz. -/// -/// Each day has a [name] and [special] property. -/// The [name] property decides which schedule to show, -/// while the [special] property decides what time slots to give the periods. -@immutable -class Day { - /// Gets the calendar for the whole year. - /// - /// Each element of [data]'s months should be a JSON representation of a [Day]. - /// See [Day.fromJson] for how to represent a Day in JSON. - static List> getCalendar(List>> data) => [ - for (final List> month in data) - getMonth(month) - ]; - - /// Parses a particular month from JSON. - /// - /// See [Day.getCalendar] for details. - static List getMonth(List> data) => [ - for (final Map json in data) - Day.fromJson(json) - ]; - - /// Converts a month in the calendar to JSON. - /// - /// This is how it is currently stored in the database. - static List> monthToJson(List month) => [ - for (final Day day in month) - day.toJson() - ]; - - /// Gets the Day for [date] in the [calendar]. - static Day getDate(List> calendar, DateTime date) => - calendar [date.month - 1] [date.day - 1]; - - /// The name of this day. - /// - /// This decides which schedule of the student is shown. - final String name; - - /// The time allotment for this day. - /// - /// See the [Special] class for more details. - final Special special; - - /// Returns a new Day from a [name] and [Special]. - const Day({ - @required this.name, - @required this.special - }); - - /// Returns a Day from a JSON object. - /// - /// `json ["name"]` and `json ["special"]` must not be null. - /// - /// `json ["special"]` may be: - /// - /// 1. One of the specials from [Special.specials]. - /// 2. JSON of a special. See [Special.fromJson]. - /// - /// This factory is not a constructor so it can dynamically check - /// for a valid [name] while keeping the field final. - factory Day.fromJson(Map json) { - if (!json.containsKey("name")) { - throw JsonUnsupportedObjectError(json); - } - final String name = json ["name"]; - final jsonSpecial = json ["special"]; - final Special special = Special.fromJson(jsonSpecial); - return Day(name: name, special: special); - } - - @override - String toString() => displayName; - - @override - int get hashCode => name.hashCode; - - @override - bool operator == (dynamic other) => other is Day && - other.name == name && - other.special == special; - - /// Returns a JSON representation of this Day. - /// - /// Will convert [special] to its name if it is a built-in special. - /// Otherwise it will convert it to JSON form. - Map toJson() => { - "name": name, - "special": Special.stringToSpecial.containsKey(special.name) - ? special.name - : special.toJson() - }; - - /// A human-readable string representation of this day. - /// - /// If [name] is null, returns null. - /// Otherwise, returns [name] and [special]. - /// If [special] was left as the default, will only return the [name]. - String get displayName => name == null - ? "No School" - : "$name${ - special == Special.regular || special == Special.rotate - ? '' : ' ${special.name}' - }"; - - /// Whether to say "a" or "an". - /// - /// Remember, [name] can be a letter and not a word. - /// So a letter like "R" might need "an" while "B" would need "a". - String get n => {"A", "E", "I", "O", "U"}.contains(name [0]) - || {"A", "M", "R", "E", "F"}.contains(name) ? "n" : ""; - - /// Whether there is school on this day. - bool get school => name != null; - - /// Whether the times for this day are known. - bool get isModified => special == Special.modified; - - /// The period right now. - /// - /// Uses [special] to calculate the time slots for all the different periods, - /// and uses [DateTime.now()] to look up what period it is right now. - /// - /// See [Time] and [Range] for implementation details. - int get period { - final Time time = Time.fromDateTime (DateTime.now()); - for (int index = 0; index < (special.periods?.length ?? 0); index++) { - final Range range = special.periods [index]; - if ( - range.contains(time) || // during class - ( // between periods - index != 0 && - special.periods [index - 1] < time && - range > time - ) - ) { - return index; - } - } - // ignore: avoid_returning_null - return null; - } -} - -// class Lunch { -// final String main, soup, side1, side2, salad, dessert; - -// const Lunch ({ -// @required this.main, -// @required this.soup, -// @required this.side1, -// @required this.side2, -// @required this.salad, -// this.dessert = "Seasonal Fresh Fruit" -// }); -// } diff --git a/lib/src/data/schedule/activity.dart b/lib/src/data/schedule/activity.dart new file mode 100644 index 000000000..88c34fcbd --- /dev/null +++ b/lib/src/data/schedule/activity.dart @@ -0,0 +1,134 @@ +import "package:meta/meta.dart"; + +/// An activity for each grade. +@immutable +class GradeActivity { + /// The activity for freshmen. + final Activity freshmen; + + /// The activity for sophomores. + final Activity sophomores; + + /// The activity for juniors. + final Activity juniors; + + /// The activity for seniors. + final Activity seniors; + + /// Creates a container for activities by grade. + const GradeActivity({ + @required this.freshmen, + @required this.sophomores, + @required this.juniors, + @required this.seniors, + }); + + /// Creates a container for activities from a JSON object. + GradeActivity.fromJson(Map json) : + freshmen = Activity.fromJson(Map.from(json ["freshmen"])), + sophomores = Activity.fromJson( + Map.from(json ["sophomores"]) + ), + juniors = Activity.fromJson(Map.from(json ["juniors"])), + seniors = Activity.fromJson(Map.from(json ["seniors"])); + + @override + String toString() => + "Freshmen: ${freshmen.toString()}\n\n" + "Sophomores: ${sophomores.toString()}\n\n" + "Juniors: ${juniors.toString()}\n\n" + "Seniors: ${seniors.toString()}"; +} + +/// A type of activity during the day. +enum ActivityType { + /// When students should go to their advisories. + /// + /// The app will show everyone to their advisories. + advisory, + + /// When students should go to a certain room. + room, + + /// A grade activity. + /// + /// Students will be shown the activities for each grade, and in the future, + /// students can be shown their grade's activity. + grade, + + /// This type of activity should not be parsed by the app. + /// + /// Just shows the message associated with the action. + misc, +} + +/// An activity during a period. +/// +/// Students can either be directed to their advisories or to a certain room. +/// See [ActivityType] for a description of different activities. +/// +/// Activities can also be nested. +@immutable +class Activity { + /// Parses a JSON map of Activities still in JSON. + static Map getActivities(Map json) { + final Map result = {}; + for (final MapEntry entry in json.entries) { + result [entry.key] = Activity.fromJson( + Map.from(entry.value) + ); + } + return result; + } + + /// Maps JSON string values to [ActivityType]s. + static const Map stringToActivityType = { + "advisory": ActivityType.advisory, + "room": ActivityType.room, + "grade": ActivityType.grade, + "misc": ActivityType.misc, + }; + + /// The type of this activity. + final ActivityType type; + + /// A message to be displayed with this activity. + /// + /// For example, this can be used to direct students to a certain room based + /// on grade, which is better handled by the user rather than the app. + final String message; + + /// Creates an activity. + const Activity({ + @required this.type, + @required this.message, + }) : + assert(type != null, "Type cannot be null"); + + /// Creates an activity for each grade + Activity.grade(GradeActivity gradeActivty) : + message = gradeActivty.toString(), + type = ActivityType.grade; + + /// Creates an activity from a JSON object. + factory Activity.fromJson(Map json) => json ["message"] is Map + ? Activity.grade( + GradeActivity.fromJson(Map.from(json ["message"])) + ) + : Activity( + type: stringToActivityType[json ["type"]], + message: json ["message"] + ); + + @override + String toString() { + switch (type) { + case ActivityType.misc: return message; + case ActivityType.advisory: + return "Advisory${message != null ? ' -- $message' : ''}"; + case ActivityType.room: return message; + default: return "Activity"; + } + } +} + diff --git a/lib/src/data/schedule/advisory.dart b/lib/src/data/schedule/advisory.dart new file mode 100644 index 000000000..6925197be --- /dev/null +++ b/lib/src/data/schedule/advisory.dart @@ -0,0 +1,16 @@ +import "package:meta/meta.dart"; + +@immutable +class Advisory { + final String id; + final String room; + + const Advisory({ + @required this.id, + @required this.room, + }); + + Advisory.fromJson(Map json) : + id = json ["id"], + room = json ["room"]; +} \ No newline at end of file diff --git a/lib/src/data/schedule/day.dart b/lib/src/data/schedule/day.dart new file mode 100644 index 000000000..fe40b45d9 --- /dev/null +++ b/lib/src/data/schedule/day.dart @@ -0,0 +1,152 @@ +import "dart:convert"; + +import "package:meta/meta.dart"; + +import "special.dart"; +import "time.dart"; + +/// A day at Ramaz. +/// +/// Each day has a [name] and [special] property. +/// The [name] property decides which schedule to show, +/// while the [special] property decides what time slots to give the periods. +@immutable +class Day { + /// Gets the calendar for the whole year. + /// + /// Each element of [data]'s months should be a JSON representation of a [Day]. + /// See [Day.fromJson] for how to represent a Day in JSON. + static List> getCalendar(List>> data) => [ + for (final List> month in data) + getMonth(month) + ]; + + /// Parses a particular month from JSON. + /// + /// See [Day.getCalendar] for details. + static List getMonth(List> data) => [ + for (final Map json in data) + Day.fromJson(json) + ]; + + /// Converts a month in the calendar to JSON. + /// + /// This is how it is currently stored in the database. + static List> monthToJson(List month) => [ + for (final Day day in month) + day.toJson() + ]; + + /// Gets the Day for [date] in the [calendar]. + static Day getDate(List> calendar, DateTime date) => + calendar [date.month - 1] [date.day - 1]; + + /// The name of this day. + /// + /// This decides which schedule of the student is shown. + final String name; + + /// The time allotment for this day. + /// + /// See the [Special] class for more details. + final Special special; + + /// Returns a new Day from a [name] and [Special]. + const Day({ + @required this.name, + @required this.special + }); + + /// Returns a Day from a JSON object. + /// + /// `json ["name"]` and `json ["special"]` must not be null. + /// + /// `json ["special"]` may be: + /// + /// 1. One of the specials from [Special.specials]. + /// 2. JSON of a special. See [Special.fromJson]. + /// + /// This factory is not a constructor so it can dynamically check + /// for a valid [name] while keeping the field final. + factory Day.fromJson(Map json) { + if (!json.containsKey("name")) { + throw JsonUnsupportedObjectError(json); + } + final String name = json ["name"]; + final jsonSpecial = json ["special"]; + final Special special = Special.fromJson(jsonSpecial); + return Day(name: name, special: special); + } + + @override + String toString() => displayName; + + @override + int get hashCode => name.hashCode; + + @override + bool operator == (dynamic other) => other is Day && + other.name == name && + other.special == special; + + /// Returns a JSON representation of this Day. + /// + /// Will convert [special] to its name if it is a built-in special. + /// Otherwise it will convert it to JSON form. + Map toJson() => { + "name": name, + "special": Special.stringToSpecial.containsKey(special.name) + ? special.name + : special.toJson() + }; + + /// A human-readable string representation of this day. + /// + /// If [name] is null, returns null. + /// Otherwise, returns [name] and [special]. + /// If [special] was left as the default, will only return the [name]. + String get displayName => name == null + ? "No School" + : "$name${ + special == Special.regular || special == Special.rotate + ? '' : ' ${special.name}' + }"; + + /// Whether to say "a" or "an". + /// + /// Remember, [name] can be a letter and not a word. + /// So a letter like "R" might need "an" while "B" would need "a". + String get n => {"A", "E", "I", "O", "U"}.contains(name [0]) + || {"A", "M", "R", "E", "F"}.contains(name) ? "n" : ""; + + /// Whether there is school on this day. + bool get school => name != null; + + /// Whether the times for this day are known. + bool get isModified => special == Special.modified; + + /// The period right now. + /// + /// Uses [special] to calculate the time slots for all the different periods, + /// and uses [DateTime.now()] to look up what period it is right now. + /// + /// See [Time] and [Range] for implementation details. + int get period { + final Time time = Time.fromDateTime (DateTime.now()); + for (int index = 0; index < (special.periods?.length ?? 0); index++) { + final Range range = special.periods [index]; + if ( + range.contains(time) || // during class + ( // between periods + index != 0 && + special.periods [index - 1] < time && + range > time + ) + ) { + return index; + } + } + // ignore: avoid_returning_null + return null; + } +} diff --git a/lib/src/data/schedule/period.dart b/lib/src/data/schedule/period.dart new file mode 100644 index 000000000..a1e6f2f31 --- /dev/null +++ b/lib/src/data/schedule/period.dart @@ -0,0 +1,187 @@ +import "package:meta/meta.dart"; + +import "activity.dart"; +import "special.dart"; +import "subject.dart"; +import "time.dart"; + +/// A representation of a period, independent of the time. +/// +/// This is needed since the time can change on any day. +/// See [Special] for when the times can change. +@immutable +class PeriodData { + /// Returns a list of [PeriodData] from a JSON object. + /// + /// Note that some entries in the list may be null. + /// They represent a free period in the schedule. + /// See [PeriodData.fromJson] for more details. + static List getList(List json) => [ + for (final dynamic periodJson in json) + periodJson == null ? null : + PeriodData.fromJson(Map.from(periodJson)) + ]; + + /// The room the student needs to be in for this period. + final String room; + + /// The id for this period's subject. + /// + /// See the [Subject] class for more details. + final String id; + + /// A const constructor for a [PeriodData]. + /// + /// If both [id] and [room] are null, then it is a free period. + /// Use [PeriodData.free] instead. Otherwise, it is considered an error + /// to have a null [room] OR [id]. + const PeriodData ({ + @required this.room, + @required this.id + }) : + assert ( + room != null || id != null, + "Room and id must both be null or not." + ); + + const PeriodData._free() : + room = null, + id = null; + + /// A free period. + /// + /// Use this instead of manually constructing a [PeriodData] + /// to keep consistency throughout the code. + static const free = PeriodData._free(); + + /// Returns a [PeriodData] from a JSON object. + /// + /// If the JSON object is null, then it is considered a free period. + /// Otherwise, both `json ["room"]` and `json ["id"]` must be non-null. + factory PeriodData.fromJson (Map json) => json == null + ? PeriodData.free + : PeriodData( + room: json ["room"], + id: json ["id"] + ); + + @override + String toString() => "PeriodData ($id, $room)"; + + @override + int get hashCode => "$room-$id".hashCode; + + @override + bool operator == (dynamic other) => other is PeriodData && + other.id == id && + other.room == room; +} + +/// A representation of a period, including the time it takes place. +/// +/// Period objects unpack the [PeriodData] passed to them, +/// so that they alone contain all the information to represent a period. +@immutable +class Period { + /// The time this period takes place. + /// + /// If the time is not known (ie, the schedule is [Special.modified]), + /// then this will be null. + final Range time; + + /// The room this period is in. + /// + /// It may be null, indicating that the student is not expected to be in class. + /// + /// Since the room comes from a [PeriodData] object, both the room and [id] + /// must both be null, or both must be non-null. See [PeriodData()] for more. + final String room; + + /// A String representation of this period. + /// + /// Since a period can be a number (like 9), or a word (like "Homeroom"), + /// String was chosen to represent both. This means that the app does not + /// care whether a period is a regular class or something like homeroom. + final String period; + + /// The id of the [Subject] for this period. + /// + /// It may be null, indicating that the student is not expected + /// to be in a class at this time. + /// + /// Since the id comes from a [PeriodData] object, both the id and [room] + /// must both be null, or both must be non-null. See [PeriodData()] for more. + final String id; + + /// The activity for this period. + /// + /// This is set in [Special.activities]. + final Activity activity; + + /// Unpacks a [PeriodData] object and returns a Period. + Period( + PeriodData data, + {@required this.time, @required this.period, @required this.activity} + ) : + room = data.room, + id = data.id; + + /// Returns a period that represents time for Mincha. + /// + /// Use this constructor to keep a consistent definition of "Mincha". + const Period.mincha(this.time, {this.activity}) : + room = null, + id = null, + period = "Mincha"; + + /// This is only for debug purposes. Use [getName] for UI labels. + @override + String toString() => "Period $period"; + + @override + int get hashCode => "$period-$id".hashCode; + + @override + bool operator == (dynamic other) => other is Period && + other.time == time && + other.room == room && + other.period == period && + other.id == id; + + /// Returns a String representation of this period. + /// + /// The expected subject can be retrieved by looking up the [id]. + /// + /// If [period] is an integer and [id] is null, then it is a free period. + /// Otherwise, if [period] is not a number, than it is returned instead. + /// Finally, the [Subject] that corresponds to [id] will be returned. + /// + /// For example: + /// + /// 1. A period with [PeriodData.free] will return "Free period" + /// 2. A period with `period == "Homeroom"` will return "Homeroom" + /// 3. A period with `period == "3"` will return the name of the [Subject]. + /// + String getName(Subject subject) => int.tryParse(period) != null && id == null + ? "Free period" + : subject?.name ?? period; + + /// Returns a list of descriptions for this period. + /// + /// The expected subject can be retrieved by looking up the [id]. + /// + /// Useful throughout the UI. This function will: + /// + /// 1. Always display the time. + /// 2. If [period] is a number, will display the period. + /// 3. If [room] is not null, will display the room. + /// 4. If [id] is valid, will return the name of the [Subject]. + /// + List getInfo (Subject subject) => [ + if (time != null) "Time: $time", + if (int.tryParse(period) != null) "Period: $period", + if (room != null) "Room: $room", + if (subject != null) "Teacher: ${subject.teacher}", + ]; +} + diff --git a/lib/src/data/times.dart b/lib/src/data/schedule/special.dart similarity index 61% rename from lib/src/data/times.dart rename to lib/src/data/schedule/special.dart index f44dd3d0c..58d5b4bc3 100644 --- a/lib/src/data/times.dart +++ b/lib/src/data/schedule/special.dart @@ -1,262 +1,9 @@ -/// A collection of dataclasses to sufficiently represent time for a student. -library time_dataclasses; +import "package:meta/meta.dart"; -import "package:flutter/foundation.dart"; import "package:ramaz/constants.dart"; -/// The hour and minute representation of a time. -/// -/// This is used instead of [Flutter's TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) -/// to provide the `>` and `<` operators. -@immutable -class Time { - /// The hour in 24-hour format. - final int hour; - - /// The minutes. - final int minutes; - - /// A const constructor. - const Time (this.hour, this.minutes); - - /// Simplifies a [DateTime] object to a [Time]. - Time.fromDateTime (DateTime date) : - hour = date.hour, - minutes = date.minute; - - /// Returns a new [Time] object from JSON data. - /// - /// The json must have `hour` and `minutes` fields that map to integers. - Time.fromJson(Map json) : - hour = json ["hour"], - minutes = json ["minutes"]; - - /// Returns this obect in JSON form - Map toJson() => { - "hour": hour, - "minutes": minutes, - }; - - @override - int get hashCode => toString().hashCode; - - @override - bool operator == (dynamic other) => other.runtimeType == Time && - other.hour == hour && - other.minutes == minutes; - - /// Returns whether this [Time] is before another [Time]. - bool operator < (Time other) => hour < other.hour || - (hour == other.hour && minutes < other.minutes); - - /// Returns whether this [Time] is at or before another [Time]. - bool operator <= (Time other) => this < other || this == other; - - /// Returns whether this [Time] is after another [Time]. - bool operator > (Time other) => hour > other.hour || - (hour == other.hour && minutes > other.minutes); - - /// Returns whether this [Time] is at or after another [Time]. - bool operator >= (Time other) => this > other || this == other; - - @override - String toString() => - "${hour > 12 ? hour - 12 : hour}:${minutes.toString().padLeft(2, '0')}"; -} - -/// A range of times. -@immutable -class Range { - /// When this range starts. - final Time start; - - /// When this range ends. - final Time end; - - /// Provides a const constructor. - const Range (this.start, this.end); - - /// Convenience method for manually creating a range by hand. - Range.nums ( - int startHour, - int startMinute, - int endHour, - int endMinute - ) : - start = Time (startHour, startMinute), - end = Time (endHour, endMinute); - - /// Returns a new [Range] from JSON data - /// - /// The json must have `start` and `end` fields - /// that map to [Time] JSON objects. - /// See [Time.fromJson] for more details. - Range.fromJson(Map json) : - start = Time.fromJson(Map.from(json ["start"])), - end = Time.fromJson(Map.from(json ["end"])); - - /// Returns a JSON representation of this range. - Map toJson() => { - "start": start.toJson(), - "end": end.toJson(), - }; - - /// Returns whether [other] is in this range. - bool contains (Time other) => start <= other && other <= end; - - @override String toString() => "${start ?? ''}-${end ?? ''}"; - - @override bool operator == (dynamic other) => other is Range && - other.start == start && other.end == end; - - @override int get hashCode => toString().hashCode; - - /// Returns whether this range is before another range. - bool operator < (Time other) => end.hour < other.hour || - ( - end.hour == other.hour && - end.minutes < other.minutes - ); - - /// Returns whether this range is after another range. - bool operator > (Time other) => start.hour > other.hour || - ( - start.hour == other.hour && - start.minutes > other.minutes - ); -} - -/// An activity for each grade. -@immutable -class GradeActivity { - /// The activity for freshmen. - final Activity freshmen; - - /// The activity for sophomores. - final Activity sophomores; - - /// The activity for juniors. - final Activity juniors; - - /// The activity for seniors. - final Activity seniors; - - /// Creates a container for activities by grade. - const GradeActivity({ - @required this.freshmen, - @required this.sophomores, - @required this.juniors, - @required this.seniors, - }); - - /// Creates a container for activities from a JSON object. - GradeActivity.fromJson(Map json) : - freshmen = Activity.fromJson(Map.from(json ["freshmen"])), - sophomores = Activity.fromJson( - Map.from(json ["sophomores"]) - ), - juniors = Activity.fromJson(Map.from(json ["juniors"])), - seniors = Activity.fromJson(Map.from(json ["seniors"])); - - @override - String toString() => - "Freshmen: ${freshmen.toString()}\n\n" - "Sophomores: ${sophomores.toString()}\n\n" - "Juniors: ${juniors.toString()}\n\n" - "Seniors: ${seniors.toString()}"; -} - -/// A type of activity during the day. -enum ActivityType { - /// When students should go to their advisories. - /// - /// The app will show everyone to their advisories. - advisory, - - /// When students should go to a certain room. - room, - - /// A grade activity. - /// - /// Students will be shown the activities for each grade, and in the future, - /// students can be shown their grade's activity. - grade, - - /// This type of activity should not be parsed by the app. - /// - /// Just shows the message associated with the action. - misc, -} - -/// An activity during a period. -/// -/// Students can either be directed to their advisories or to a certain room. -/// See [ActivityType] for a description of different activities. -/// -/// Activities can also be nested. -@immutable -class Activity { - /// Parses a JSON map of Activities still in JSON. - static Map getActivities(Map json) { - final Map result = {}; - for (final MapEntry entry in json.entries) { - result [entry.key] = Activity.fromJson( - Map.from(entry.value) - ); - } - return result; - } - - /// Maps JSON string values to [ActivityType]s. - static const Map stringToActivityType = { - "advisory": ActivityType.advisory, - "room": ActivityType.room, - "grade": ActivityType.grade, - "misc": ActivityType.misc, - }; - - /// The type of this activity. - final ActivityType type; - - /// A message to be displayed with this activity. - /// - /// For example, this can be used to direct students to a certain room based - /// on grade, which is better handled by the user rather than the app. - final String message; - - /// Creates an activity. - const Activity({ - @required this.type, - @required this.message, - }) : - assert(type != null, "Type cannot be null"); - - /// Creates an activity for each grade - Activity.grade(GradeActivity gradeActivty) : - message = gradeActivty.toString(), - type = ActivityType.grade; - - /// Creates an activity from a JSON object. - factory Activity.fromJson(Map json) => json ["message"] is Map - ? Activity.grade( - GradeActivity.fromJson(Map.from(json ["message"])) - ) - : Activity( - type: stringToActivityType[json ["type"]], - message: json ["message"] - ); - - @override - String toString() { - switch (type) { - case ActivityType.misc: return message; - case ActivityType.advisory: - return "Advisory${message != null ? ' -- $message' : ''}"; - case ActivityType.room: return message; - default: return "Activity"; - } - } -} +import "activity.dart"; +import "time.dart"; /// A description of the time allotment for a day. /// diff --git a/lib/src/data/schedule/subject.dart b/lib/src/data/schedule/subject.dart new file mode 100644 index 000000000..ad1743b50 --- /dev/null +++ b/lib/src/data/schedule/subject.dart @@ -0,0 +1,66 @@ +/// This library holds data classes for various schedule-related data. +/// +/// Classes here are used to abstract the weird schedule details +/// to make the code a whole lot simpler. +library schedule_dataclasses; + +import "dart:convert" show JsonUnsupportedObjectError; +import "package:flutter/foundation.dart"; + +/// A subject, or class, that a student can take. +/// +/// Since one's schedule contains multiple instances of the same subject, +/// subjects are represented externally by an ID, which is used to look up +/// a canonicalized [Subject] instance. This saves space and simplifies +/// compatibility with existing school databases. +@immutable +class Subject { + /// Returns a map of [Subject]s from a list of JSON objects. + /// + /// The keys are IDs to the subject, and the values are the + /// corresponding [Subject] instances. + /// See [Subject.fromJson] for more details. + static Map getSubjects( + Map> data + ) => data.map ( + (String id, Map json) => MapEntry ( + id, + Subject.fromJson(json) + ) + ); + + /// The name of this subject. + final String name; + + /// The teacher who teaches this subject. + final String teacher; + + /// A const constructor for a [Subject]. + const Subject ({ + @required this.name, + @required this.teacher + }); + + /// Returns a [Subject] instance from a JSON object. + /// + /// The JSON map must have a `teacher` and `name` field. + Subject.fromJson(Map json) : + name = json ["name"], + teacher = json ["teacher"] + { + if (name == null || teacher == null) { + throw JsonUnsupportedObjectError (json.toString()); + } + } + + @override + String toString() => "$name ($teacher)"; + + @override + int get hashCode => "$name-$teacher".hashCode; + + @override + bool operator == (dynamic other) => other is Subject && + other.name == name && + other.teacher == teacher; +} diff --git a/lib/src/data/schedule/time.dart b/lib/src/data/schedule/time.dart new file mode 100644 index 000000000..cd9dda9ed --- /dev/null +++ b/lib/src/data/schedule/time.dart @@ -0,0 +1,124 @@ +import "package:meta/meta.dart"; + +/// The hour and minute representation of a time. +/// +/// This is used instead of [Flutter's TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) +/// to provide the `>` and `<` operators. +@immutable +class Time { + /// The hour in 24-hour format. + final int hour; + + /// The minutes. + final int minutes; + + /// A const constructor. + const Time (this.hour, this.minutes); + + /// Simplifies a [DateTime] object to a [Time]. + Time.fromDateTime (DateTime date) : + hour = date.hour, + minutes = date.minute; + + /// Returns a new [Time] object from JSON data. + /// + /// The json must have `hour` and `minutes` fields that map to integers. + Time.fromJson(Map json) : + hour = json ["hour"], + minutes = json ["minutes"]; + + /// Returns this obect in JSON form + Map toJson() => { + "hour": hour, + "minutes": minutes, + }; + + @override + int get hashCode => toString().hashCode; + + @override + bool operator == (dynamic other) => other.runtimeType == Time && + other.hour == hour && + other.minutes == minutes; + + /// Returns whether this [Time] is before another [Time]. + bool operator < (Time other) => hour < other.hour || + (hour == other.hour && minutes < other.minutes); + + /// Returns whether this [Time] is at or before another [Time]. + bool operator <= (Time other) => this < other || this == other; + + /// Returns whether this [Time] is after another [Time]. + bool operator > (Time other) => hour > other.hour || + (hour == other.hour && minutes > other.minutes); + + /// Returns whether this [Time] is at or after another [Time]. + bool operator >= (Time other) => this > other || this == other; + + @override + String toString() => + "${hour > 12 ? hour - 12 : hour}:${minutes.toString().padLeft(2, '0')}"; +} + +/// A range of times. +@immutable +class Range { + /// When this range starts. + final Time start; + + /// When this range ends. + final Time end; + + /// Provides a const constructor. + const Range (this.start, this.end); + + /// Convenience method for manually creating a range by hand. + Range.nums ( + int startHour, + int startMinute, + int endHour, + int endMinute + ) : + start = Time (startHour, startMinute), + end = Time (endHour, endMinute); + + /// Returns a new [Range] from JSON data + /// + /// The json must have `start` and `end` fields + /// that map to [Time] JSON objects. + /// See [Time.fromJson] for more details. + Range.fromJson(Map json) : + start = Time.fromJson(Map.from(json ["start"])), + end = Time.fromJson(Map.from(json ["end"])); + + /// Returns a JSON representation of this range. + Map toJson() => { + "start": start.toJson(), + "end": end.toJson(), + }; + + /// Returns whether [other] is in this range. + bool contains (Time other) => start <= other && other <= end; + + @override String toString() => "${start ?? ''}-${end ?? ''}"; + + @override bool operator == (dynamic other) => other is Range && + other.start == start && other.end == end; + + @override int get hashCode => toString().hashCode; + + /// Returns whether this range is before another range. + bool operator < (Time other) => end.hour < other.hour || + ( + end.hour == other.hour && + end.minutes < other.minutes + ); + + /// Returns whether this range is after another range. + bool operator > (Time other) => start.hour > other.hour || + ( + start.hour == other.hour && + start.minutes > other.minutes + ); +} + diff --git a/lib/src/data/sports.dart b/lib/src/data/sports.dart index 6c54706e9..b023d6c05 100644 --- a/lib/src/data/sports.dart +++ b/lib/src/data/sports.dart @@ -1,7 +1,8 @@ -import "package:flutter/foundation.dart"; +import "package:meta/meta.dart"; import "package:ramaz/constants.dart" show DayComparison; -import "package:ramaz/data.dart"; + +import "schedule/time.dart"; /// All the different sports that can be played. /// diff --git a/lib/src/data/student.dart b/lib/src/data/student.dart index fb79d0d7b..fcfdcc0c6 100644 --- a/lib/src/data/student.dart +++ b/lib/src/data/student.dart @@ -1,135 +1,158 @@ -library student_dataclasses; +import "package:meta/meta.dart"; -import "dart:convert" show JsonUnsupportedObjectError; -import "package:flutter/foundation.dart"; +import "contact_info.dart"; +import "schedule/advisory.dart"; +import "schedule/day.dart"; +import "schedule/period.dart"; +import "schedule/special.dart"; +import "schedule/time.dart"; -import "schedule.dart"; -import "times.dart"; +/// What grade the user is in. +/// +/// The [User.grade] field could be an `int`, but by specifying the exact +/// possible values, we avoid any possible errors, as well as possibly cleaner +/// code. +/// +/// Faculty users can have [User.grade] be null. +enum Grade { + /// A Freshman. + freshman, + + /// A Sophomore. + sophomore, + + /// A Junior. + junior, -/// A representation of a student. + /// A Senior. + senior +} + +/// Maps grade numbers to a [Grade] type. +Map intToGrade = { + 9: Grade.freshman, + 10: Grade.sophomore, + 11: Grade.junior, + 12: Grade.senior, +}; + +/// Represents a user and all their data. /// -/// This object holds their schedule, and is a convenience class for getting -/// their schedule, as well as some other notable data, such as when and where -/// to meet for homeroom. +/// This objects includes data like the user's schedule, grade, list of clubs, +/// and more. @immutable -class Student { - /// This student's schedule. +class User { + /// The user's schedule. + /// + /// Each key is a different day, and the values are list of periods in that + /// day. Possible key values are defined by [dayNames]. /// - /// Each key is a different day, and the value is a list of periods. - /// See [PeriodData] for more information. + /// Periods may be null to indicate free periods (or, in the case of faculty, + /// periods where they don't teach). final Map> schedule; - /// The section ID for this student's homeroom; - final String homeroomId; + /// The advisory for this user. + // TODO: work this into the logic. + final Advisory advisory; - /// The room location for this student's homeroom; - final String homeroomLocation; + /// This user's contact information. + final ContactInfo contactInfo; - /// `const` constructor for a student. - const Student ({ - @required this.schedule, - @required this.homeroomId, - @required this.homeroomLocation, - }); + /// The grade this user is in. + /// + /// This property is null for faculty. + final Grade grade; - @override - String toString() => schedule.toString(); + /// The IDs of the clubs this user attends. + /// + /// TODO: decide if this is relevant for captains. + final List registeredClubs; - @override - int get hashCode => schedule.hashCode; + /// The possible day names for this user's schedule. + /// + /// These will be used as the keys for [schedule]. + final Iterable dayNames; - @override - bool operator == (dynamic other) => other is Student && - other.schedule == schedule; + /// Creates a new user. + const User({ + @required this.schedule, + @required this.advisory, + @required this.contactInfo, + @required this.grade, + @required this.registeredClubs, + @required this.dayNames, + }); - /// Creates a student from a JSON object. + /// Creates a new user from JSON. + User.fromJson(Map json) : + dayNames = List.from(json ["dayNames"]), + schedule = { + for (final String dayName in [...json ["dayNames"]]) + dayName: PeriodData.getList(json [dayName]) + }, + advisory = Advisory.fromJson( + Map.from(json ["advisory"]) + ), + contactInfo = ContactInfo.fromJson( + Map.from(json ["contactInfo"]) + ), + grade = intToGrade [json ["grade"]], + registeredClubs = List.from(json ["registeredClubs"]); + + /// Gets the unique section IDs for the courses this user is enrolled in. /// - /// Needs to be a factory so there can be proper error checking. - factory Student.fromJson (Map json) { - // Fun Fact: ALl this is error checking. - // Your welcome. - - // Check for null homeroom - const String homeroomLocationKey = "homeroom meeting room"; - if (!json.containsKey(homeroomLocationKey)) { - throw JsonUnsupportedObjectError( - json, cause: "No homeroom location present" - ); - } - final String homeroomLocation = json [homeroomLocationKey]; - - const String homeroomKey = "homeroom"; - if (!json.containsKey (homeroomKey)) { - throw JsonUnsupportedObjectError(json, cause: "No homeroom present"); - } - final String homeroomId = json [homeroomKey]; - - // Real code starts here - return Student ( - schedule: { - for (final String dayName in json ["dayNames"]) - dayName: PeriodData.getList(json [dayName]) - }, - homeroomId: homeroomId, - homeroomLocation: homeroomLocation, - ); - } + /// For teachers, these will be the courses they teach. + Set get sectionIDs => { + for (final List daySchedule in schedule.values) + for (final PeriodData period in daySchedule) + if (period?.id != null) + period.id + }; - /// Returns the schedule for this student on a given day. + /// Computes the periods, in order, for a given day. /// - /// Iterates over the schedule for [day] in [schedule], and converts the - /// [PeriodData]s to [Period] objects using the [Range]s in [Day.special]. + /// This method converts the [PeriodData]s in [schedule] into [Period]s using + /// [Day.special]. [PeriodData] objects are specific to the user's schedule, + /// whereas the times of the day [Range]s are specific to the calendar. /// - /// If `day.special` is [Special.modified], every [Period] will have their - /// [Period.time] property set to null. - List getPeriods (Day day) { + /// See [Special] for an explanation of the different factors this method + /// takes into account. + /// + /// TODO: consolidate behavior on no school. + List getPeriods(Day day) { if (!day.school) { return []; - } + } - int periodIndex = 0; - final Map activities = day.special.activities ?? {}; final Special special = day.special; + int periodIndex = 0; + + Range getTime(int index) => day.isModified + ? null : special.periods [index]; - // Loop over all the periods and assign each one a Period. return [ - for (int index = 0; index < special.periods.length; index++) - if (special.homeroom == index) - Period( - PeriodData.free, - time: day.isModified ? null : special.periods [index], - period: "Homeroom", - activity: activities ["Homeroom"] - ) - else if (special.mincha == index) - Period.mincha( - day.isModified ? null : special.periods [index], - activity: activities ["Mincha"], - ) - else if (special.skip.contains(index)) - Period( - PeriodData.free, - time: day.isModified ? null : special.periods [index], - period: "Free", - activity: null, - ) - else Period( + for (int index = 0; index < special.periods.length; index++) + if (special.homeroom == index) Period( + PeriodData.free, + period: "Homeroom", + time: getTime(index), + activity: null, + ) else if (special.mincha == index) Period( + PeriodData.free, + period: "Mincha", + time: getTime(index), + activity: null, + ) else if (special.skip.contains(index)) Period( + PeriodData.free, + period: "Free period", + time: getTime(index), + activity: null, + ) else Period( schedule [day.name] [periodIndex] ?? PeriodData.free, - time: day.isModified ? null : special.periods [index], period: (++periodIndex).toString(), - activity: activities [(periodIndex).toString()] + time: getTime(index), + activity: null, ) ]; } - - /// Gets the section ids for this student. - /// - /// This includes every course in every day of the student's schedule, - /// without taking duplicates. - Set getIds() => { - for (final List schedule in schedule.values) - for (final PeriodData period in schedule) - if (period != null && period != PeriodData.free) // skip free periods - period.id - }; } diff --git a/lib/src/data/student_clubs.dart b/lib/src/data/student_clubs.dart deleted file mode 100644 index 90cd4dec8..000000000 --- a/lib/src/data/student_clubs.dart +++ /dev/null @@ -1,24 +0,0 @@ -import "package:meta/meta.dart"; - -import "club.dart"; -import "contact_info.dart"; - -enum Grade { - freshman, - sophomore, - junior, - senior -} - -class Student { - final ContactInfo contact; - final List clubsAttending; - final Grade grade; - - Student({ - @required this.contact, - @required this.clubsAttending, - @required this.grade, - }); -} - From c11ed5fa892391ad89fe13613be3a27f02df8e07 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Oct 2020 15:36:14 -0400 Subject: [PATCH 048/251] Cleanup after reorganizing data library --- lib/src/models/data/schedule.dart | 22 ++++++++++++------- .../view/builders/reminder_builder.dart | 2 +- lib/src/models/view/schedule.dart | 2 +- lib/src/pages/builders/day_builder.dart | 2 +- lib/src/pages/builders/reminder_builder.dart | 2 +- lib/src/pages/schedule.dart | 2 +- lib/src/widgets/generic/class_list.dart | 6 ++--- 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index a1e100a25..7d4d34726 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -18,8 +18,8 @@ class Schedule with ChangeNotifier { /// How often to refresh the schedule. static const timerInterval = Duration (minutes: 1); - /// The student object for the user. - Student student; + /// The current user. + User user; /// The subjects this user has. Map subjects; @@ -58,9 +58,9 @@ class Schedule with ChangeNotifier { /// /// Should be called whenever there is new data for this model to work with. Future init() async { - student = Student.fromJson(await Services.instance.database.user); + user = User.fromJson(await Services.instance.database.user); subjects = Subject.getSubjects( - await Services.instance.database.getSections(student.getIds()) + await Services.instance.database.getSections(user.sectionIDs) ); await initCalendar(); } @@ -104,7 +104,7 @@ class Schedule with ChangeNotifier { timer?.cancel(); if (today.school) { // initialize periods. - periods = student.getPeriods(today); + periods = user.getPeriods(today); // initialize the current period. onNewPeriod(first: true); // initialize the timer. See comments for [timer]. @@ -227,16 +227,22 @@ class Schedule with ChangeNotifier { } } + /// Determines whether a reminder is compatible with the user's schedule. + /// + /// If [User.dayNames] has changed, then reminders with [PeriodReminderTime] + /// might fail. Similarly, if the user changes classes, [SubjectReminderTime] + /// might fail. This method helps the app spot these inconsistencies and get + /// rid of the problematic reminders. bool isValidReminder(Reminder reminder) { switch(reminder.time.type) { case ReminderTimeType.period: final PeriodReminderTime time = reminder.time; - final Iterable dayNames = student.schedule.keys; + final Iterable dayNames = user.schedule.keys; return dayNames.contains(time.dayName) - && int.parse(time.period) <= student.schedule [time.dayName].length; + && int.parse(time.period) <= user.schedule [time.dayName].length; case ReminderTimeType.subject: final SubjectReminderTime time = reminder.time; - return subjects.keys.contains(time.name); + return subjects.values.any((Subject subject) => subject.name == time.name); default: throw StateError("Reminder <$reminder> has invalid ReminderTime"); } } diff --git a/lib/src/models/view/builders/reminder_builder.dart b/lib/src/models/view/builders/reminder_builder.dart index 30e7c8655..96b334ce3 100644 --- a/lib/src/models/view/builders/reminder_builder.dart +++ b/lib/src/models/view/builders/reminder_builder.dart @@ -109,7 +109,7 @@ class RemindersBuilderModel with ChangeNotifier { if (dayName == null) { return null; } - final List schedule = _schedule.student.schedule [dayName]; + final List schedule = _schedule.user.schedule [dayName]; return [ for (int index = 0; index < schedule.length; index++) (index + 1).toString() diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index ad83e3962..4291c318f 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -36,7 +36,7 @@ class ScheduleModel with ChangeNotifier { ? schedule.today : defaultDay; defaultDay = Day( - name: schedule.student.schedule.keys.first, + name: schedule.user.schedule.keys.first, special: defaultSpecial ); } diff --git a/lib/src/pages/builders/day_builder.dart b/lib/src/pages/builders/day_builder.dart index 8839abe99..6f868e884 100644 --- a/lib/src/pages/builders/day_builder.dart +++ b/lib/src/pages/builders/day_builder.dart @@ -71,7 +71,7 @@ class DayBuilder extends StatelessWidget { onChanged: !model.hasSchool ? null : (String value) => model.name = value, items: [ - for (final String dayName in Models.schedule.student.schedule.keys) + for (final String dayName in Models.schedule.user.dayNames) DropdownMenuItem( value: dayName, child: Text(dayName), diff --git a/lib/src/pages/builders/reminder_builder.dart b/lib/src/pages/builders/reminder_builder.dart index e8b9fcb3d..e7dd4f648 100644 --- a/lib/src/pages/builders/reminder_builder.dart +++ b/lib/src/pages/builders/reminder_builder.dart @@ -159,7 +159,7 @@ class ReminderBuilderState extends State { title: const Text ("Day"), trailing: DropdownButton( items: [ - for (final String dayName in Models.schedule.student.schedule.keys) + for (final String dayName in Models.schedule.user.dayNames) DropdownMenuItem( value: dayName, child: Text(dayName), diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index 5fcb168c1..9cc5d951f 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -45,7 +45,7 @@ class SchedulePage extends StatelessWidget { value: model.day.name, onChanged: (String value) => model.update(newName: value), items: [ - for (final String dayName in Models.schedule.student.schedule.keys) + for (final String dayName in Models.schedule.user.dayNames) DropdownMenuItem( value: dayName, child: Text(dayName), diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index e8b582918..05cf936a7 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -83,7 +83,7 @@ class ClassList extends StatelessWidget { /// A list of periods for today. /// - /// Comes from using [day] with [Student.getPeriods]. + /// Comes from using [day] with [User.getPeriods]. final Iterable periods; /// The header for this list. May be null. @@ -98,14 +98,14 @@ class ClassList extends StatelessWidget { Iterable _getPeriods(BuildContext context) { try { - return periods ?? Models.schedule.student.getPeriods(day); + return periods ?? Models.schedule.user.getPeriods(day); } on RangeError { // ignore: avoid_catching_errors Future( // cannot show snackbar on build, so wait for next frame () => Scaffold.of(context).showSnackBar( const SnackBar(content: Text("Invalid schedule")) ) ); - return Models.schedule.student.getPeriods( + return Models.schedule.user.getPeriods( Models.schedule.today ); } From 2e33ef4ae8042ba3b7d9d53d1b13376011b62e68 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Oct 2020 16:37:19 -0400 Subject: [PATCH 049/251] Fixed some null errors in User.fromJson --- lib/data.dart | 2 +- lib/src/data/{student.dart => user.dart} | 5 +++-- lib/src/models/data/schedule.dart | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) rename lib/src/data/{student.dart => user.dart} (95%) diff --git a/lib/data.dart b/lib/data.dart index 71aea6bb5..997c05ed3 100644 --- a/lib/data.dart +++ b/lib/data.dart @@ -27,4 +27,4 @@ export "src/data/schedule/subject.dart"; export "src/data/schedule/time.dart"; export "src/data/sports.dart"; -export "src/data/student.dart"; +export "src/data/user.dart"; diff --git a/lib/src/data/student.dart b/lib/src/data/user.dart similarity index 95% rename from lib/src/data/student.dart rename to lib/src/data/user.dart index fcfdcc0c6..88a6d6bd0 100644 --- a/lib/src/data/student.dart +++ b/lib/src/data/user.dart @@ -90,14 +90,15 @@ class User { for (final String dayName in [...json ["dayNames"]]) dayName: PeriodData.getList(json [dayName]) }, - advisory = Advisory.fromJson( + advisory = json ["advisory"] == null ? null : Advisory.fromJson( Map.from(json ["advisory"]) ), contactInfo = ContactInfo.fromJson( Map.from(json ["contactInfo"]) ), grade = intToGrade [json ["grade"]], - registeredClubs = List.from(json ["registeredClubs"]); + registeredClubs = json ["registeredClubs"] == null + ? null : List.from(json ["registeredClubs"]); /// Gets the unique section IDs for the courses this user is enrolled in. /// diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index 7d4d34726..0563d17e3 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -74,7 +74,7 @@ class Schedule with ChangeNotifier { @override void dispose() { Models.reminders.removeListener(remindersListener); - timer.cancel(); + timer?.cancel(); super.dispose(); } From 7b1b4339ba5543fdf3085685b0aa4c459f3de503 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Oct 2020 16:42:44 -0400 Subject: [PATCH 050/251] Disabled FCM due to native errors --- lib/services.dart | 2 +- lib/src/services/push_notifications/mobile.dart | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/services.dart b/lib/services.dart index 275af9f2f..1882412be 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -43,7 +43,7 @@ class Services implements Service { /// /// Also initializes [services]. Services() { - services = [prefs, database, crashlytics, notifications, pushNotifications]; + services = [prefs, database, crashlytics, notifications]; } @override diff --git a/lib/src/services/push_notifications/mobile.dart b/lib/src/services/push_notifications/mobile.dart index fd57e50db..37fd705b1 100644 --- a/lib/src/services/push_notifications/mobile.dart +++ b/lib/src/services/push_notifications/mobile.dart @@ -37,6 +37,8 @@ class FCM extends PushNotifications { /// Provides the connection to Firebase Messaging. static final FirebaseMessaging firebase = FirebaseMessaging(); + static Map callbacks; + @override Future init() async { await FirebaseCore.init(); @@ -57,9 +59,8 @@ class FCM extends PushNotifications { /// /// This function uses the `command` field of the notification to find the /// right [AsyncCallback], and calls it. - Future callback( + static Future callback( Map message, - Map callbacks ) async { final String command = (message["data"] ?? message) ["command"]; if (command == null) { @@ -85,14 +86,13 @@ class FCM extends PushNotifications { Future registerForNotifications( Map callbacks ) async { - Future handler(Map message) => - callback(message, callbacks); + FCM.callbacks = callbacks; firebase.configure( - onMessage: handler, - onBackgroundMessage: handler, - onLaunch: handler, - onResume: handler, + onMessage: callback, + onBackgroundMessage: callback, + onLaunch: callback, + onResume: callback, ); } From c0a221c98d5a3b1b35171a313aaa8ace310d9e30 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Oct 2020 16:54:01 -0400 Subject: [PATCH 051/251] Left groundwork for coding club 10/22/2020 --- lib/src/services/database.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/src/services/database.dart b/lib/src/services/database.dart index 53d5b7190..11ff50c8c 100644 --- a/lib/src/services/database.dart +++ b/lib/src/services/database.dart @@ -110,4 +110,6 @@ abstract class Database extends Service { /// /// Only admins can change this. Future setSports(List> json); + + Future> getClub(String id); } \ No newline at end of file From 73950c297aeeb438376a74f017b0961e60fa88a2 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 16 Oct 2020 01:14:50 -0400 Subject: [PATCH 052/251] Repo cleanup -- gitignore and analysis_options --- .gitignore | 1 + analysis_options.yaml | 5 ++++- lib/generated_plugin_registrant.dart | 26 -------------------------- 3 files changed, 5 insertions(+), 27 deletions(-) delete mode 100644 lib/generated_plugin_registrant.dart diff --git a/.gitignore b/.gitignore index f3539e182..7b9f305fb 100644 --- a/.gitignore +++ b/.gitignore @@ -76,6 +76,7 @@ flutter_*.png linked_*.png unlinked.ds unlinked_spec.ds +lib/generated_plugin_registrant.dart # Android related **/android/**/GeneratedPluginRegistrant.java diff --git a/analysis_options.yaml b/analysis_options.yaml index 18f64e0dd..7024ef9a2 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,5 +1,8 @@ analyzer: - exclude: [lib/generated_plugin_registrant.dart] + exclude: + - lib/generated_plugin_registrant.dart + - test/* + - firebase/* linter: rules: - always_declare_return_types diff --git a/lib/generated_plugin_registrant.dart b/lib/generated_plugin_registrant.dart deleted file mode 100644 index 052a2cd9c..000000000 --- a/lib/generated_plugin_registrant.dart +++ /dev/null @@ -1,26 +0,0 @@ -// -// Generated file. Do not edit. -// - -// ignore: unused_import -import 'dart:ui'; - -import 'package:cloud_firestore_web/cloud_firestore_web.dart'; -import 'package:firebase_auth_web/firebase_auth_web.dart'; -import 'package:firebase_core_web/firebase_core_web.dart'; -import 'package:google_sign_in_web/google_sign_in_web.dart'; -import 'package:shared_preferences_web/shared_preferences_web.dart'; -import 'package:url_launcher_web/url_launcher_web.dart'; - -import 'package:flutter_web_plugins/flutter_web_plugins.dart'; - -// ignore: public_member_api_docs -void registerPlugins(PluginRegistry registry) { - FirebaseFirestoreWeb.registerWith(registry.registrarFor(FirebaseFirestoreWeb)); - FirebaseAuthWeb.registerWith(registry.registrarFor(FirebaseAuthWeb)); - FirebaseCoreWeb.registerWith(registry.registrarFor(FirebaseCoreWeb)); - GoogleSignInPlugin.registerWith(registry.registrarFor(GoogleSignInPlugin)); - SharedPreferencesPlugin.registerWith(registry.registrarFor(SharedPreferencesPlugin)); - UrlLauncherPlugin.registerWith(registry.registrarFor(UrlLauncherPlugin)); - registry.registerMessageHandler(); -} From 0dbe55eea9614e7a8ceb9281c8a2b621bbdb69e3 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 16 Oct 2020 01:16:45 -0400 Subject: [PATCH 053/251] Revert "Left groundwork for coding club 10/22/2020" This reverts commit c0a221c98d5a3b1b35171a313aaa8ace310d9e30. --- lib/src/services/database.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/src/services/database.dart b/lib/src/services/database.dart index 11ff50c8c..53d5b7190 100644 --- a/lib/src/services/database.dart +++ b/lib/src/services/database.dart @@ -110,6 +110,4 @@ abstract class Database extends Service { /// /// Only admins can change this. Future setSports(List> json); - - Future> getClub(String id); } \ No newline at end of file From 842b392dddfb0da161763e08e33f2dd6ce05e066 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 16 Oct 2020 01:44:59 -0400 Subject: [PATCH 054/251] Fixed bug on modified day --- lib/src/data/user.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index 88a6d6bd0..3ab2317b1 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -131,8 +131,12 @@ class User { Range getTime(int index) => day.isModified ? null : special.periods [index]; + final int periodCount = day.isModified + ? schedule [day.name].length + : special.periods.length; + return [ - for (int index = 0; index < special.periods.length; index++) + for (int index = 0; index < periodCount; index++) if (special.homeroom == index) Period( PeriodData.free, period: "Homeroom", From 415e6792e6a52de7311ab92cd9794f8be4129f91 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 16 Oct 2020 11:05:37 -0400 Subject: [PATCH 055/251] Incorporated Advisory into Firestore --- firebase/firestore/lib/src/data/student.dart | 9 ++++++--- lib/src/data/schedule/advisory.dart | 11 +++++++++++ lib/src/data/user.dart | 1 - 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/firebase/firestore/lib/src/data/student.dart b/firebase/firestore/lib/src/data/student.dart index 02307c728..59613ccf5 100644 --- a/firebase/firestore/lib/src/data/student.dart +++ b/firebase/firestore/lib/src/data/student.dart @@ -151,9 +151,12 @@ class User extends Serializable { @override Map get json => { for (final String dayName in dayNames) - dayName: scheduleToJson(schedule [dayName]), - "homeroom": homeroom, - "homeroom meeting room": homeroomLocation, + dayName: scheduleToJson(schedule [dayName]), + + "advisory": homeroom == null ? null : { + "id": homeroom, + "room": homeroomLocation, + }, "email": email, "dayNames": dayNamesList, }; diff --git a/lib/src/data/schedule/advisory.dart b/lib/src/data/schedule/advisory.dart index 6925197be..8a9d94031 100644 --- a/lib/src/data/schedule/advisory.dart +++ b/lib/src/data/schedule/advisory.dart @@ -1,15 +1,26 @@ import "package:meta/meta.dart"; +/// Bundles data relevant to advisory. +/// +/// This is not incorporated with the schedule since advisories can happen +/// during homeroom, and are thus dependent on the day, not the user's profile. @immutable class Advisory { + /// The section ID of this advisory. final String id; + + /// The room where this advisory meets. final String room; + /// Holds advisory data. const Advisory({ @required this.id, @required this.room, }); + /// Creates an advisory object from JSON. + /// + /// This JSON can be null, so this constructor should only be called if needed. Advisory.fromJson(Map json) : id = json ["id"], room = json ["room"]; diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index 3ab2317b1..940f5bb89 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -52,7 +52,6 @@ class User { final Map> schedule; /// The advisory for this user. - // TODO: work this into the logic. final Advisory advisory; /// This user's contact information. From 8184adb2fe06e4121c7ec6bb6e19800577769c3f Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 18 Oct 2020 16:38:06 -0400 Subject: [PATCH 056/251] Added ContactInfo to User --- firebase/firestore/lib/src/data/student.dart | 4 ++++ lib/src/data/contact_info.dart | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/firebase/firestore/lib/src/data/student.dart b/firebase/firestore/lib/src/data/student.dart index 59613ccf5..09da0bf07 100644 --- a/firebase/firestore/lib/src/data/student.dart +++ b/firebase/firestore/lib/src/data/student.dart @@ -159,6 +159,10 @@ class User extends Serializable { }, "email": email, "dayNames": dayNamesList, + "contactInfo": { + "name": "$first $last", + "email": email, + } }; @override diff --git a/lib/src/data/contact_info.dart b/lib/src/data/contact_info.dart index 270fa7406..f24604997 100644 --- a/lib/src/data/contact_info.dart +++ b/lib/src/data/contact_info.dart @@ -1,16 +1,32 @@ import "package:meta/meta.dart"; +/// Holds personal information about the user. +/// +/// While [name] and [email] can be read from the authentication service, +/// bundling them together in the user object can be useful too. However, +/// this data is retrieved from the database, which needs the user's email, +/// so the authentication service is still needed for that. class ContactInfo { + /// The user's name. final String name; + + /// The user's email. final String email; + + /// The user's phone number. + /// + /// This is filled in voluntary by the user, and cannot be retrieved from the + /// database. So this field will start off null, and be populated over time. final String phoneNumber; + /// Bundles personal info about the user. ContactInfo({ @required this.name, @required this.email, @required this.phoneNumber, }); + /// Creates a contact from JSON. ContactInfo.fromJson(Map json) : name = json ["name"], email = json ["email"], From 10d4e3574ae747a7eb289d0143c0f3be3aea3dc1 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 18 Oct 2020 16:51:10 -0400 Subject: [PATCH 057/251] Bumped version to 2.1.0 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c898e7d86..cab02e8cf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ description: A new Flutter project. # Both the version and the builder number may be overridden in flutter # build by specifying --build-name and --build-number, respectively. # Read more about versioning at semver.org. -version: 2.0.1+1 +version: 2.1.0+1 environment: sdk: ">=2.7.0 <=3.0.0" From d0f4530ca0228a2f6eb41ee34d414bbe3e37cc04 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 20 Oct 2020 13:35:56 -0400 Subject: [PATCH 058/251] Documented services library --- lib/src/services/push_notifications/mobile.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/services/push_notifications/mobile.dart b/lib/src/services/push_notifications/mobile.dart index 37fd705b1..7533be886 100644 --- a/lib/src/services/push_notifications/mobile.dart +++ b/lib/src/services/push_notifications/mobile.dart @@ -37,6 +37,7 @@ class FCM extends PushNotifications { /// Provides the connection to Firebase Messaging. static final FirebaseMessaging firebase = FirebaseMessaging(); + /// Maps command payloads to async functions. static Map callbacks; @override From 290c99aa447710fbb9b3ad6656be2747b8d8f6e3 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 21 Oct 2020 09:09:56 -0400 Subject: [PATCH 059/251] Made data models inherit from Model --- lib/main.dart | 2 +- lib/models.dart | 25 +++---- lib/src/models/data/admin.dart | 4 +- lib/src/models/data/model.dart | 15 +++++ lib/src/models/data/reminders.dart | 8 ++- lib/src/models/data/schedule.dart | 34 +++++----- lib/src/models/data/sports.dart | 13 ++-- lib/src/models/view/builders/day_builder.dart | 2 +- .../view/builders/reminder_builder.dart | 4 +- lib/src/models/view/home.dart | 8 +-- lib/src/models/view/schedule.dart | 2 +- lib/src/pages/builders/day_builder.dart | 2 +- lib/src/pages/builders/reminder_builder.dart | 2 +- lib/src/pages/builders/special_builder.dart | 2 +- lib/src/pages/drawer.dart | 2 +- lib/src/pages/home.dart | 65 +++++++++++-------- lib/src/pages/login.dart | 6 +- lib/src/pages/reminders.dart | 2 +- lib/src/pages/schedule.dart | 2 +- lib/src/pages/specials.dart | 2 +- lib/src/pages/sports.dart | 10 +-- lib/src/widgets/atomic/reminder_tile.dart | 4 +- lib/src/widgets/generic/class_list.dart | 12 ++-- lib/src/widgets/generic/footer.dart | 6 +- 24 files changed, 128 insertions(+), 106 deletions(-) create mode 100644 lib/src/models/data/model.dart diff --git a/lib/main.dart b/lib/main.dart index 34e2464db..2e3f42684 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -29,7 +29,7 @@ Future main({bool restart = false}) async { try { if (isSignedIn) { // This initializes data models -- it may error. - await Models.init(); + await Models.instance.init(); } // We want to at least try again on ANY error. // ignore: avoid_catches_without_on_clauses diff --git a/lib/models.dart b/lib/models.dart index 45c693e1a..471089a78 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -26,6 +26,7 @@ library models; import "package:ramaz/services.dart"; import "src/models/data/admin.dart"; +import "src/models/data/model.dart"; import "src/models/data/reminders.dart"; import "src/models/data/schedule.dart"; import "src/models/data/sports.dart"; @@ -46,21 +47,18 @@ export "src/models/view/home.dart"; export "src/models/view/schedule.dart"; export "src/models/view/sports.dart"; -class Models { - static Reminders reminders; +class Models extends Model { + static Models instance = Models(); - static Schedule schedule; + Reminders reminders = Reminders(); + Schedule schedule = Schedule(); + Sports sports = Sports(); + AdminModel admin; - static Sports sports; - - static AdminModel admin; - - static Future init() async { - reminders = Reminders(); + @override + Future init() async { await reminders.init(); - schedule = Schedule(); await schedule.init(); - sports = Sports(); await sports.init(refresh: true); if (await Auth.isAdmin) { admin = AdminModel(); @@ -68,13 +66,16 @@ class Models { } } - static void reset() { + @override + void dispose() { schedule?.dispose(); reminders?.dispose(); sports?.dispose(); + admin?.dispose(); reminders = null; schedule = null; sports = null; admin = null; + super.dispose(); } } \ No newline at end of file diff --git a/lib/src/models/data/admin.dart b/lib/src/models/data/admin.dart index d91ff08f8..10418db10 100644 --- a/lib/src/models/data/admin.dart +++ b/lib/src/models/data/admin.dart @@ -2,12 +2,13 @@ import "package:ramaz/services.dart"; import "admin/calendar.dart"; import "admin/user.dart"; +import "model.dart"; export "admin/calendar.dart"; export "admin/user.dart"; /// A data model that manages all admin responsibilities. -class AdminModel { +class AdminModel extends Model { CalendarModel _calendar; /// The admin user this model is managing. @@ -15,6 +16,7 @@ class AdminModel { /// This is an [AdminUserModel], not just the user itself. AdminUserModel user; + @override Future init() async { user = AdminUserModel( json: await Services.instance.database.admin, diff --git a/lib/src/models/data/model.dart b/lib/src/models/data/model.dart new file mode 100644 index 000000000..f4949dea0 --- /dev/null +++ b/lib/src/models/data/model.dart @@ -0,0 +1,15 @@ +import "package:flutter/foundation.dart"; + +/// A data model to provide data to the app. +/// +/// A data model combines services with dataclasses to provide functionality. +/// Whereas dataclasses don't care where they get their data from, and services +/// don't care what data they get, a data model uses dataclasses to structure +/// the data retrieved by a service. +// ignore: prefer_mixin +abstract class Model with ChangeNotifier { + /// Gets whatever data is needed by this model from a service. + /// + /// This model may not function properly if this function is not called. + Future init(); +} \ No newline at end of file diff --git a/lib/src/models/data/reminders.dart b/lib/src/models/data/reminders.dart index aaaae0dd8..7012a9b86 100644 --- a/lib/src/models/data/reminders.dart +++ b/lib/src/models/data/reminders.dart @@ -1,15 +1,17 @@ -import "package:flutter/foundation.dart"; +import "package:meta/meta.dart"; import "package:ramaz/data.dart"; import "package:ramaz/services.dart"; +import "model.dart"; + /// A DataModel that keeps the state of the user's reminders. /// /// This data model abstracts all operations that have to do with reminders, /// and all other parts of the app that want to operate on reminders should use /// this data model. // ignore: prefer_mixin -class Reminders with ChangeNotifier { +class Reminders extends Model { /// The reminders for the user. List reminders; @@ -28,7 +30,7 @@ class Reminders with ChangeNotifier { /// These reminders will be marked for deletion if they do not repeat. List readReminders; - /// Initializes the data model. + @override Future init() async { reminders = [ for ( diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index 0563d17e3..6c660c6c5 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -1,15 +1,14 @@ import "dart:async" show Timer; -import "package:flutter/foundation.dart"; - import "package:ramaz/services.dart"; import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; + +import "model.dart"; import "reminders.dart"; /// A data model for the user's schedule. -// ignore: prefer_mixin -class Schedule with ChangeNotifier { +class Schedule extends Model { /// The current date. /// /// This helps track when the day has changed. @@ -48,16 +47,13 @@ class Schedule with ChangeNotifier { /// The index that represents [period]'s location in [periods]. int periodIndex; - /// Initializes the schedule model. - Schedule( - ) { - Models.reminders.addListener(remindersListener); - } + final Reminders reminders; - /// Does the main initialization work for the schedule model. - /// - /// Should be called whenever there is new data for this model to work with. + Schedule() : reminders = Models.instance.reminders; + + @override Future init() async { + reminders.addListener(remindersListener); user = User.fromJson(await Services.instance.database.user); subjects = Subject.getSubjects( await Services.instance.database.getSections(user.sectionIDs) @@ -73,7 +69,7 @@ class Schedule with ChangeNotifier { @override void dispose() { - Models.reminders.removeListener(remindersListener); + reminders.removeListener(remindersListener); timer?.cancel(); super.dispose(); } @@ -169,19 +165,19 @@ class Schedule with ChangeNotifier { /// response to changed reminders. See [scheduleReminders] for more details /// on scheduling notifications. void updateReminders({bool scheduleNotifications = false}) { - Models.reminders - ..currentReminders = Models.reminders.getReminders( + reminders + ..currentReminders = reminders.getReminders( period: period?.period, subject: subjects [period?.id]?.name, dayName: today.name, ) - ..nextReminders = Models.reminders.getReminders( + ..nextReminders = reminders.getReminders( period: nextPeriod?.period, subject: subjects [nextPeriod?.id]?.name, dayName: today.name, ); - (Models.reminders.currentReminders ?? []).forEach(Models.reminders.markShown); + (reminders.currentReminders ?? []).forEach(reminders.markShown); if (scheduleNotifications) { Future(scheduleReminders); @@ -205,7 +201,7 @@ class Schedule with ChangeNotifier { // For all periods starting from periodIndex, schedule applicable reminders. for (int index = periodIndex; index < periods.length; index++) { final Period period = periods [index]; - for (final int reminderIndex in Models.reminders.getReminders( + for (final int reminderIndex in reminders.getReminders( period: period?.period, subject: subjects [period?.id]?.name, dayName: today.name, @@ -220,7 +216,7 @@ class Schedule with ChangeNotifier { ), notification: Notification.reminder( title: "New reminder", - message: Models.reminders.reminders [reminderIndex].message, + message: reminders.reminders [reminderIndex].message, ) ); } diff --git a/lib/src/models/data/sports.dart b/lib/src/models/data/sports.dart index f1d266fb7..de3414216 100644 --- a/lib/src/models/data/sports.dart +++ b/lib/src/models/data/sports.dart @@ -1,17 +1,17 @@ import "dart:async"; -import "package:flutter/foundation.dart"; - import "package:ramaz/constants.dart" show DayComparison; import "package:ramaz/data.dart"; import "package:ramaz/services.dart"; +import "model.dart"; + /// A data model for sports games. /// /// This class hosts [todayGames], a list of games being played today, /// as well as CRUD methods for the database (if permissions allow). // ignore: prefer_mixin -class Sports with ChangeNotifier { +class Sports extends Model { static const Duration _minute = Duration(minutes: 1); /// A timer to refresh [todayGames]. @@ -25,13 +25,10 @@ class Sports with ChangeNotifier { /// A list of games being played today to be showed on the home screen. List todayGames; - /// Creates a data model for sports games. - Sports() { - timer = Timer.periodic(_minute, (_) => todayGames = getTodayGames()); - } - /// Loads data from the device and + @override Future init({bool refresh = false}) async { + timer = Timer.periodic(_minute, (_) => todayGames = getTodayGames()); if (refresh) { games = SportsGame.fromList(await Services.instance.database.sports); todayGames = getTodayGames(); diff --git a/lib/src/models/view/builders/day_builder.dart b/lib/src/models/view/builders/day_builder.dart index 02cefb3f9..8ed8ab469 100644 --- a/lib/src/models/view/builders/day_builder.dart +++ b/lib/src/models/view/builders/day_builder.dart @@ -16,7 +16,7 @@ class DayBuilderModel with ChangeNotifier { bool _hasSchool; /// Creates a view model for modifying a [Day]. - DayBuilderModel(Day day) : admin = Models.admin.user { + DayBuilderModel(Day day) : admin = Models.instance.admin.user { admin.addListener(notifyListeners); _name = day?.name; _special = day?.special; diff --git a/lib/src/models/view/builders/reminder_builder.dart b/lib/src/models/view/builders/reminder_builder.dart index 96b334ce3..4e2479e89 100644 --- a/lib/src/models/view/builders/reminder_builder.dart +++ b/lib/src/models/view/builders/reminder_builder.dart @@ -43,9 +43,9 @@ class RemindersBuilderModel with ChangeNotifier { /// If [reminder] is not null, then the relevant fields of this /// class are filled in with the corresponding fields of the reminder. RemindersBuilderModel(Reminder reminder) : - _schedule = Models.schedule, + _schedule = Models.instance.schedule, courses = [ - for (final Subject subject in Models.schedule.subjects.values) + for (final Subject subject in Models.instance.schedule.subjects.values) subject.name ] { diff --git a/lib/src/models/view/home.dart b/lib/src/models/view/home.dart index c32512192..704a85668 100644 --- a/lib/src/models/view/home.dart +++ b/lib/src/models/view/home.dart @@ -6,14 +6,14 @@ import "package:ramaz/models.dart"; class HomeModel with ChangeNotifier { // Do NOT use a list here. See null checks in [dispose]. HomeModel() { - Models.schedule.addListener(notifyListeners); - Models.sports.addListener(notifyListeners); + Models.instance.schedule.addListener(notifyListeners); + Models.instance.sports.addListener(notifyListeners); } @override void dispose() { - Models?.schedule?.removeListener(notifyListeners); - Models?.sports?.removeListener(notifyListeners); + Models.instance?.schedule?.removeListener(notifyListeners); + Models.instance?.sports?.removeListener(notifyListeners); super.dispose(); } } diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index 4291c318f..d3c7082d9 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -31,7 +31,7 @@ class ScheduleModel with ChangeNotifier { /// Also initializes the default day shown to the user. /// If today is a school day, then use that. Otherwise, use the /// defaults (see [defaultSpecial]). - ScheduleModel () : schedule = Models.schedule { + ScheduleModel () : schedule = Models.instance.schedule { day = schedule.hasSchool ? schedule.today : defaultDay; diff --git a/lib/src/pages/builders/day_builder.dart b/lib/src/pages/builders/day_builder.dart index 6f868e884..1af99497b 100644 --- a/lib/src/pages/builders/day_builder.dart +++ b/lib/src/pages/builders/day_builder.dart @@ -71,7 +71,7 @@ class DayBuilder extends StatelessWidget { onChanged: !model.hasSchool ? null : (String value) => model.name = value, items: [ - for (final String dayName in Models.schedule.user.dayNames) + for (final String dayName in Models.instance.schedule.user.dayNames) DropdownMenuItem( value: dayName, child: Text(dayName), diff --git a/lib/src/pages/builders/reminder_builder.dart b/lib/src/pages/builders/reminder_builder.dart index e7dd4f648..b24dab70a 100644 --- a/lib/src/pages/builders/reminder_builder.dart +++ b/lib/src/pages/builders/reminder_builder.dart @@ -159,7 +159,7 @@ class ReminderBuilderState extends State { title: const Text ("Day"), trailing: DropdownButton( items: [ - for (final String dayName in Models.schedule.user.dayNames) + for (final String dayName in Models.instance.schedule.user.dayNames) DropdownMenuItem( value: dayName, child: Text(dayName), diff --git a/lib/src/pages/builders/special_builder.dart b/lib/src/pages/builders/special_builder.dart index a743b44e8..be4c8e8fb 100644 --- a/lib/src/pages/builders/special_builder.dart +++ b/lib/src/pages/builders/special_builder.dart @@ -80,7 +80,7 @@ class SpecialBuilderState extends State { const Divider(), for ( final Special special in - Models.admin.user.specials + Models.instance.admin.user.specials ) ListTile( title: Text (special.name), onTap: () => Navigator.of(context).pop(special), diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index 4352aa1cb..f9431c43f 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -46,7 +46,7 @@ class NavigationDrawer extends StatelessWidget { // leading: Icon (Icons.directions_run), // onTap: pushRoute(context, Routes.sports), // ), - if (Models.admin != null) + if (Models.instance.admin != null) ListTile( title: const Text("Admin console"), leading: Icon(Icons.verified_user), diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index f16c87e62..d805d7c59 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -9,12 +9,21 @@ import "package:ramaz/widgets.dart"; /// The homepage of the app. class HomePage extends StatelessWidget { + final Schedule scheduleModel; + final Reminders remindersModel; + final Sports sportsModel; + + HomePage() : + scheduleModel = Models.instance.schedule, + remindersModel = Models.instance.reminders, + sportsModel = Models.instance.sports; + /// Downloads the calendar again and calls [Schedule.onNewPeriod]. Future refresh(BuildContext context) async { try { await Services.instance.database.updateCalendar(); await Services.instance.database.updateSports(); - await Models.schedule.initCalendar(); + await scheduleModel.initCalendar(); } on PlatformException catch(error) { if (error.code == "Error performing get") { Scaffold.of(context).showSnackBar( @@ -37,7 +46,7 @@ class HomePage extends StatelessWidget { appBar: AppBar ( title: const Text ("Home"), actions: [ - if (Models.schedule.hasSchool) Builder ( + if (scheduleModel.hasSchool) Builder ( builder: (BuildContext context) => FlatButton( textColor: Colors.white, onPressed: () => Scaffold.of(context).openEndDrawer(), @@ -47,16 +56,16 @@ class HomePage extends StatelessWidget { ], ), drawer: NavigationDrawer(), - endDrawer: !Models.schedule.hasSchool ? null : Drawer ( + endDrawer: !scheduleModel.hasSchool ? null : Drawer ( child: ClassList( - day: Models.schedule.today, - periods: Models.schedule.nextPeriod == null - ? Models.schedule.periods - : Models.schedule.periods.getRange ( - (Models.schedule.periodIndex ?? -1) + 1, - Models.schedule.periods.length + day: scheduleModel.today, + periods: scheduleModel.nextPeriod == null + ? scheduleModel.periods + : scheduleModel.periods.getRange ( + (scheduleModel.periodIndex ?? -1) + 1, + scheduleModel.periods.length ), - headerText: Models.schedule.period == null + headerText: scheduleModel.period == null ? "Today's Schedule" : "Upcoming Classes" ) @@ -68,33 +77,33 @@ class HomePage extends StatelessWidget { RamazLogos.ramRectangle, const Divider(), Text ( - Models.schedule.hasSchool - ? "Today is a${Models.schedule.today.n} " - "${Models.schedule.today.name}" - "\nSchedule: ${Models.schedule.today.special.name}" + scheduleModel.hasSchool + ? "Today is a${scheduleModel.today.n} " + "${scheduleModel.today.name}" + "\nSchedule: ${scheduleModel.today.special.name}" : "There is no school today", textScaleFactor: 2, textAlign: TextAlign.center ), const SizedBox (height: 20), - if (Models.schedule.hasSchool) NextClass( - reminders: Models.reminders.currentReminders, - period: Models.schedule.period, - subject: Models.schedule.subjects [Models.schedule.period?.id], - modified: Models.schedule.today.isModified, + if (scheduleModel.hasSchool) NextClass( + reminders: remindersModel.currentReminders, + period: scheduleModel.period, + subject: scheduleModel.subjects [scheduleModel.period?.id], + modified: scheduleModel.today.isModified, ), // if school won't be over, show the next class if ( - Models.schedule.nextPeriod != null && - !Models.schedule.today.isModified + scheduleModel.nextPeriod != null && + !scheduleModel.today.isModified ) NextClass ( next: true, - reminders: Models.reminders.nextReminders, - period: Models.schedule.nextPeriod, - subject: Models.schedule.subjects [Models.schedule.nextPeriod?.id], - modified: Models.schedule.today.isModified, + reminders: remindersModel.nextReminders, + period: scheduleModel.nextPeriod, + subject: scheduleModel.subjects [scheduleModel.nextPeriod?.id], + modified: scheduleModel.today.isModified, ), - if (Models.sports.todayGames.isNotEmpty) ...[ + if (sportsModel.todayGames.isNotEmpty) ...[ const SizedBox(height: 10), const Center( child: Text( @@ -104,8 +113,8 @@ class HomePage extends StatelessWidget { ) ), const SizedBox(height: 10), - for (final int index in Models.sports.todayGames) - SportsTile(Models.sports.games [index]) + for (final int index in sportsModel.todayGames) + SportsTile(sportsModel.games [index]) ] ] ) diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index f54c4bd70..eb5f21308 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -38,7 +38,7 @@ class LoginState extends State { // "To log in, one must first log out" // -- Levi Lesches, class of '21, creator of this app, 2019 Services.instance.database.signOut(); - Models.reset(); + Models.instance.dispose(); } @override @@ -96,7 +96,7 @@ class LoginState extends State { await crashlytics.log("Attempted to log in"); await crashlytics.setEmail(Auth.email); await Services.instance.database.signOut(); - Models.reset(); + Models.instance.dispose(); // ignore: unawaited_futures showDialog ( context: context, @@ -156,7 +156,7 @@ class LoginState extends State { function: () async { setState(() => isLoading = true); await Services.instance.signIn(); - await Models.init(); + await Models.instance.init(); }, onSuccess: () { setState(() => isLoading = false); diff --git a/lib/src/pages/reminders.dart b/lib/src/pages/reminders.dart index d8a2237cb..b4f45b338 100644 --- a/lib/src/pages/reminders.dart +++ b/lib/src/pages/reminders.dart @@ -9,7 +9,7 @@ import "package:ramaz/widgets.dart"; class RemindersPage extends StatelessWidget { @override Widget build(BuildContext context) => ModelListener( - model: () => Models.reminders, + model: () => Models.instance.reminders, dispose: false, // ignore: sort_child_properties_last child: const Center ( diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index 9cc5d951f..0872e5f38 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -45,7 +45,7 @@ class SchedulePage extends StatelessWidget { value: model.day.name, onChanged: (String value) => model.update(newName: value), items: [ - for (final String dayName in Models.schedule.user.dayNames) + for (final String dayName in Models.instance.schedule.user.dayNames) DropdownMenuItem( value: dayName, child: Text(dayName), diff --git a/lib/src/pages/specials.dart b/lib/src/pages/specials.dart index 0ec8dcb91..11df980d6 100644 --- a/lib/src/pages/specials.dart +++ b/lib/src/pages/specials.dart @@ -8,7 +8,7 @@ import "package:ramaz/widgets.dart"; class SpecialPage extends StatelessWidget { @override Widget build(BuildContext context) => ModelListener( - model: () => Models.admin.user, + model: () => Models.instance.admin.user, dispose: false, builder: (_, AdminUserModel model, __) => Scaffold( appBar: AppBar( diff --git a/lib/src/pages/sports.dart b/lib/src/pages/sports.dart index 93936e86d..f8ec65609 100644 --- a/lib/src/pages/sports.dart +++ b/lib/src/pages/sports.dart @@ -70,7 +70,7 @@ class SportsPage extends StatelessWidget { Widget build(BuildContext context) => DefaultTabController( length: 2, child: ModelListener( - model: () => SportsModel(Models.sports), + model: () => SportsModel(Models.instance.sports), builder: (BuildContext context, SportsModel model, Widget _) => Scaffold( appBar: AppBar( title: const Text("Sports"), @@ -185,7 +185,7 @@ class SportsPage extends StatelessWidget { return; } model.loading = true; - await Models.sports.replace( + await Models.instance.sports.replace( index, model.data.games [index].replaceScores(scores) ); @@ -198,7 +198,7 @@ class SportsPage extends StatelessWidget { onPressed: () async { Navigator.of(newContext).pop(); model.loading = true; - await Models.sports.replace( + await Models.instance.sports.replace( index, model.data.games [index].replaceScores(null) ); @@ -211,7 +211,7 @@ class SportsPage extends StatelessWidget { onPressed: () async { Navigator.of(newContext).pop(); model.loading = true; - await Models.sports.replace( + await Models.instance.sports.replace( index, await SportsBuilder.createGame(context, model.data.games [index]) ); @@ -242,7 +242,7 @@ class SportsPage extends StatelessWidget { ); if (confirm) { model.loading = true; - await Models.sports.delete(index); + await Models.instance.sports.delete(index); model.loading = false; } }, diff --git a/lib/src/widgets/atomic/reminder_tile.dart b/lib/src/widgets/atomic/reminder_tile.dart index 9d817ef07..e69fcc388 100644 --- a/lib/src/widgets/atomic/reminder_tile.dart +++ b/lib/src/widgets/atomic/reminder_tile.dart @@ -22,7 +22,7 @@ class ReminderTile extends StatelessWidget { @override Widget build (BuildContext context) { - final Reminders reminders = Models.reminders; + final Reminders reminders = Models.instance.reminders; final Reminder reminder = reminders.reminders [index]; return SizedBox ( @@ -32,7 +32,7 @@ class ReminderTile extends StatelessWidget { title: Text (reminder.message), subtitle: Text (reminder.time.toString() ?? ""), onTap: () async { - if (!Models.schedule.isValidReminder(reminder)) { + if (!Models.instance.schedule.isValidReminder(reminder)) { reminders.deleteReminder(index); Scaffold.of(context).showSnackBar( const SnackBar(content: Text("Deleted outdated reminder")) diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index 05cf936a7..617d2ece2 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -98,21 +98,21 @@ class ClassList extends StatelessWidget { Iterable _getPeriods(BuildContext context) { try { - return periods ?? Models.schedule.user.getPeriods(day); + return periods ?? Models.instance.schedule.user.getPeriods(day); } on RangeError { // ignore: avoid_catching_errors Future( // cannot show snackbar on build, so wait for next frame () => Scaffold.of(context).showSnackBar( const SnackBar(content: Text("Invalid schedule")) ) ); - return Models.schedule.user.getPeriods( - Models.schedule.today + return Models.instance.schedule.user.getPeriods( + Models.instance.schedule.today ); } } @override Widget build(BuildContext context) => ModelListener( - model: () => Models.reminders, + model: () => Models.instance.reminders, dispose: false, // ignore: sort_child_properties_last child: DrawerHeader ( @@ -138,7 +138,7 @@ class ClassList extends StatelessWidget { /// Creates a [ClassPanel] for a given period. Widget getPanel(Period period) { - final Subject subject = Models.schedule.subjects[period.id]; + final Subject subject = Models.instance.schedule.subjects[period.id]; return ClassPanel ( children: [ for (final String description in period.getInfo(subject)) @@ -150,7 +150,7 @@ class ClassList extends StatelessWidget { title: int.tryParse(period.period) == null ? period.getName(subject) : "${period.period}: ${period.getName(subject)}", - reminders: Models.reminders.getReminders( + reminders: Models.instance.reminders.getReminders( period: period.period, dayName: day.name, subject: subject?.name, diff --git a/lib/src/widgets/generic/footer.dart b/lib/src/widgets/generic/footer.dart index 1eec6c4b9..9bd438003 100644 --- a/lib/src/widgets/generic/footer.dart +++ b/lib/src/widgets/generic/footer.dart @@ -16,7 +16,7 @@ class Footer extends StatelessWidget { static const double textScale = 1.25; @override Widget build (BuildContext context) => ModelListener( - model: () => Models.schedule, + model: () => Models.instance.schedule, dispose: false, // ignore: sort_child_properties_last child: Container(height: 0, width: 0), @@ -25,7 +25,7 @@ class Footer extends StatelessWidget { enableDrag: false, onClosing: () {}, builder: (BuildContext context) => GestureDetector( - onTap: !Models.reminders.hasNextReminder ? null : + onTap: !Models.instance.reminders.hasNextReminder ? null : () { final NavigatorState nav = Navigator.of(context); if (nav.canPop()) { @@ -57,7 +57,7 @@ class Footer extends StatelessWidget { ), if (schedule.nextPeriod?.activity != null) const Text("There is an activity"), - if (Models.reminders.hasNextReminder) + if (Models.instance.reminders.hasNextReminder) const Text ("Click to see reminder"), ] ) From 21d020a3a43881d0b8f949c23c29a1df45b867a7 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 21 Oct 2020 15:44:15 -0400 Subject: [PATCH 060/251] Added UserModel --- lib/models.dart | 32 +++++++----- lib/src/models/data/schedule.dart | 9 ++-- lib/src/models/data/user.dart | 52 +++++++++++++++++++ lib/src/models/view/builders/day_builder.dart | 6 +-- lib/src/pages/builders/special_builder.dart | 2 +- lib/src/pages/drawer.dart | 2 +- lib/src/pages/specials.dart | 12 ++--- 7 files changed, 85 insertions(+), 30 deletions(-) create mode 100644 lib/src/models/data/user.dart diff --git a/lib/models.dart b/lib/models.dart index 471089a78..f703ec1df 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -24,20 +24,20 @@ /// state should depend on their corresponding view model. library models; -import "package:ramaz/services.dart"; -import "src/models/data/admin.dart"; import "src/models/data/model.dart"; import "src/models/data/reminders.dart"; import "src/models/data/schedule.dart"; import "src/models/data/sports.dart"; +import "src/models/data/user.dart"; // data models -export "src/models/data/admin.dart"; export "src/models/data/reminders.dart"; export "src/models/data/schedule.dart"; export "src/models/data/sports.dart"; +export "src/models/data/user.dart"; // view models +export "src/models/data/admin/calendar.dart"; export "src/models/view/builders/day_builder.dart"; export "src/models/view/builders/reminder_builder.dart"; export "src/models/view/builders/special_builder.dart"; @@ -50,32 +50,36 @@ export "src/models/view/sports.dart"; class Models extends Model { static Models instance = Models(); - Reminders reminders = Reminders(); - Schedule schedule = Schedule(); - Sports sports = Sports(); - AdminModel admin; + Reminders reminders; + Schedule schedule; + Sports sports; + UserModel user; @override Future init() async { + reminders = Reminders(); + schedule = Schedule(); + sports = Sports(); + user = UserModel(); + await reminders.init(); await schedule.init(); await sports.init(refresh: true); - if (await Auth.isAdmin) { - admin = AdminModel(); - await admin.init(); - } + await user.init(); } @override + // This object can be revived using [init]. + // ignore: must_call_super void dispose() { schedule?.dispose(); reminders?.dispose(); sports?.dispose(); - admin?.dispose(); + user?.dispose(); + reminders = null; schedule = null; sports = null; - admin = null; - super.dispose(); + user = null; } } \ No newline at end of file diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index 6c660c6c5..9992bfa76 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -47,13 +47,12 @@ class Schedule extends Model { /// The index that represents [period]'s location in [periods]. int periodIndex; - final Reminders reminders; - - Schedule() : reminders = Models.instance.reminders; + Reminders reminders; @override Future init() async { - reminders.addListener(remindersListener); + reminders = Models.instance.reminders + ..addListener(remindersListener); user = User.fromJson(await Services.instance.database.user); subjects = Subject.getSubjects( await Services.instance.database.getSections(user.sectionIDs) @@ -69,7 +68,7 @@ class Schedule extends Model { @override void dispose() { - reminders.removeListener(remindersListener); + Models.instance.reminders?.removeListener(remindersListener); timer?.cancel(); super.dispose(); } diff --git a/lib/src/models/data/user.dart b/lib/src/models/data/user.dart new file mode 100644 index 000000000..d5395c529 --- /dev/null +++ b/lib/src/models/data/user.dart @@ -0,0 +1,52 @@ +import "package:ramaz/data.dart"; +import "package:ramaz/services.dart"; + +import "model.dart"; + +class UserModel extends Model { + User data; + Admin admin; + Map subjects; + + bool get isAdmin => admin == null; + + @override + Future init() async { + data = User.fromJson(await Services.instance.database.user); + subjects = Subject.getSubjects( + await Services.instance.database.getSections(data.sectionIDs) + ); + if (await Auth.isAdmin) { + admin = Admin.fromJson( + await Services.instance.database.admin, + await Auth.adminScopes, + ); + } + } + + Future saveAdmin() async { + await Services.instance.database.setAdmin(admin.toJson()); + notifyListeners(); + } + + Future addSpecialToAdmin(Special special) async { + if (special == null) { + return; + } + admin.specials.add(special); + return saveAdmin(); + } + + Future replaceAdminSpecial(int index, Special special) async { + if (special == null) { + return; + } + admin.specials [index] = special; + return saveAdmin(); + } + + Future removeSpecialFromAdmin(int index) { + admin.specials.removeAt(index); + return saveAdmin(); + } +} diff --git a/lib/src/models/view/builders/day_builder.dart b/lib/src/models/view/builders/day_builder.dart index 8ed8ab469..a8c927178 100644 --- a/lib/src/models/view/builders/day_builder.dart +++ b/lib/src/models/view/builders/day_builder.dart @@ -9,14 +9,14 @@ class DayBuilderModel with ChangeNotifier { /// The admin creating this [Day]. /// /// This is used to create [userSpecials]. - final AdminUserModel admin; + final UserModel admin; String _name; Special _special; bool _hasSchool; /// Creates a view model for modifying a [Day]. - DayBuilderModel(Day day) : admin = Models.instance.admin.user { + DayBuilderModel(Day day) : admin = Models.instance.user { admin.addListener(notifyListeners); _name = day?.name; _special = day?.special; @@ -50,7 +50,7 @@ class DayBuilderModel with ChangeNotifier { (Special preset) => preset.name == value.name ) ) { - admin.addSpecial(value); + admin.addSpecialToAdmin(value); } notifyListeners(); diff --git a/lib/src/pages/builders/special_builder.dart b/lib/src/pages/builders/special_builder.dart index be4c8e8fb..cb7623068 100644 --- a/lib/src/pages/builders/special_builder.dart +++ b/lib/src/pages/builders/special_builder.dart @@ -80,7 +80,7 @@ class SpecialBuilderState extends State { const Divider(), for ( final Special special in - Models.instance.admin.user.specials + Models.instance.user.admin.specials ) ListTile( title: Text (special.name), onTap: () => Navigator.of(context).pop(special), diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index f9431c43f..51e855041 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -46,7 +46,7 @@ class NavigationDrawer extends StatelessWidget { // leading: Icon (Icons.directions_run), // onTap: pushRoute(context, Routes.sports), // ), - if (Models.instance.admin != null) + if (Models.instance.user.isAdmin) ListTile( title: const Text("Admin console"), leading: Icon(Icons.verified_user), diff --git a/lib/src/pages/specials.dart b/lib/src/pages/specials.dart index 11df980d6..90b5d9cb9 100644 --- a/lib/src/pages/specials.dart +++ b/lib/src/pages/specials.dart @@ -7,15 +7,15 @@ import "package:ramaz/widgets.dart"; /// A page to show the admin's custom specials. class SpecialPage extends StatelessWidget { @override - Widget build(BuildContext context) => ModelListener( - model: () => Models.instance.admin.user, + Widget build(BuildContext context) => ModelListener( + model: () => Models.instance.user, dispose: false, - builder: (_, AdminUserModel model, __) => Scaffold( + builder: (_, UserModel model, __) => Scaffold( appBar: AppBar( title: const Text("Custom schedules"), ), floatingActionButton: FloatingActionButton( - onPressed: () async => model.addSpecial( + onPressed: () async => model.addSpecialToAdmin( await SpecialBuilder.buildSpecial(context), ), child: const Icon(Icons.add), @@ -37,9 +37,9 @@ class SpecialPage extends StatelessWidget { title: Text (model.admin.specials [index].name), trailing: IconButton( icon: const Icon(Icons.remove_circle), - onPressed: () => model.removeSpecial(index), + onPressed: () => model.removeSpecialFromAdmin(index), ), - onTap: () async => model.replaceSpecial( + onTap: () async => model.replaceAdminSpecial( index, await SpecialBuilder.buildSpecial( context, From 8f1226bda39b9eb3bd918b16609531d85757d823 Mon Sep 17 00:00:00 2001 From: todesj Date: Wed, 21 Oct 2020 18:21:57 -0400 Subject: [PATCH 061/251] tried to upgrade crashlytics --- ios/Podfile.lock | 108 ++++++++++++--------------- ios/Runner.xcodeproj/project.pbxproj | 35 ++++----- ios/Runner/Info.plist | 2 +- pubspec.lock | 2 +- pubspec.yaml | 2 +- 5 files changed, 66 insertions(+), 83 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 87f2d8434..e5929b685 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -4,54 +4,42 @@ PODS: - AppAuth/ExternalUserAgent (= 1.4.0) - AppAuth/Core (1.4.0) - AppAuth/ExternalUserAgent (1.4.0) - - cloud_firestore (0.14.0-2): + - cloud_firestore (0.14.1-3): - Firebase/CoreOnly (~> 6.26.0) - Firebase/Firestore (~> 6.26.0) - firebase_core - Flutter - - Crashlytics (3.14.0): - - Fabric (~> 1.10.2) - - Fabric (1.10.2) - Firebase/Auth (6.26.0): - Firebase/CoreOnly - FirebaseAuth (~> 6.5.3) - - Firebase/Core (6.26.0): - - Firebase/CoreOnly - - FirebaseAnalytics (= 6.6.0) - Firebase/CoreOnly (6.26.0): - FirebaseCore (= 6.7.2) + - Firebase/Crashlytics (6.26.0): + - Firebase/CoreOnly + - FirebaseCrashlytics (~> 4.1.1) - Firebase/Firestore (6.26.0): - Firebase/CoreOnly - FirebaseFirestore (~> 1.15.0) - Firebase/Messaging (6.26.0): - Firebase/CoreOnly - FirebaseMessaging (~> 4.4.1) - - firebase_auth (0.18.0-1): + - firebase_auth (0.18.1-2): - Firebase/Auth (~> 6.26.0) - Firebase/CoreOnly (~> 6.26.0) - firebase_core - Flutter - - firebase_core (0.5.0): + - firebase_core (0.5.0-1): - Firebase/CoreOnly (~> 6.26.0) - Flutter - - firebase_crashlytics (0.0.1): - - Crashlytics - - Fabric - - Firebase/Core - - Flutter - - firebase_messaging (0.0.1): - - Firebase/Core - - Firebase/Messaging + - firebase_crashlytics (0.2.1-1): + - Firebase/CoreOnly (~> 6.26.0) + - Firebase/Crashlytics (~> 6.26.0) + - firebase_core + - firebase_messaging (7.0.3): + - Firebase/CoreOnly (~> 6.26.0) + - Firebase/Messaging (~> 6.26.0) + - firebase_core - Flutter - - FirebaseAnalytics (6.6.0): - - FirebaseCore (~> 6.7) - - FirebaseInstallations (~> 1.3) - - GoogleAppMeasurement (= 6.6.0) - - GoogleUtilities/AppDelegateSwizzler (~> 6.0) - - GoogleUtilities/MethodSwizzler (~> 6.0) - - GoogleUtilities/Network (~> 6.0) - - "GoogleUtilities/NSData+zlib (~> 6.0)" - - nanopb (~> 1.30905.0) - FirebaseAnalyticsInterop (1.5.0) - FirebaseAuth (6.5.3): - FirebaseAuthInterop (~> 1.0) @@ -65,12 +53,20 @@ PODS: - FirebaseCoreDiagnosticsInterop (~> 1.2) - GoogleUtilities/Environment (~> 6.5) - GoogleUtilities/Logger (~> 6.5) - - FirebaseCoreDiagnostics (1.5.0): - - GoogleDataTransport (~> 7.0) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/Logger (~> 6.7) + - FirebaseCoreDiagnostics (1.4.0): + - GoogleDataTransportCCTSupport (~> 3.1) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/Logger (~> 6.5) - nanopb (~> 1.30905.0) - FirebaseCoreDiagnosticsInterop (1.2.0) + - FirebaseCrashlytics (4.1.1): + - FirebaseAnalyticsInterop (~> 1.2) + - FirebaseCore (~> 6.6) + - FirebaseInstallations (~> 1.1) + - GoogleDataTransport (~> 6.1) + - GoogleDataTransportCCTSupport (~> 3.1) + - nanopb (~> 1.30905.0) + - PromisesObjC (~> 1.2) - FirebaseFirestore (1.15.0) - FirebaseInstallations (1.3.0): - FirebaseCore (~> 6.6) @@ -97,13 +93,9 @@ PODS: - google_sign_in (0.0.1): - Flutter - GoogleSignIn (~> 5.0) - - GoogleAppMeasurement (6.6.0): - - GoogleUtilities/AppDelegateSwizzler (~> 6.0) - - GoogleUtilities/MethodSwizzler (~> 6.0) - - GoogleUtilities/Network (~> 6.0) - - "GoogleUtilities/NSData+zlib (~> 6.0)" - - nanopb (~> 1.30905.0) - - GoogleDataTransport (7.2.0): + - GoogleDataTransport (6.2.1) + - GoogleDataTransportCCTSupport (3.2.0): + - GoogleDataTransport (~> 6.1) - nanopb (~> 1.30905.0) - GoogleSignIn (5.0.2): - AppAuth (~> 1.2) @@ -117,8 +109,6 @@ PODS: - PromisesObjC (~> 1.2) - GoogleUtilities/Logger (6.7.2): - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (6.7.2): - - GoogleUtilities/Logger - GoogleUtilities/Network (6.7.2): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" @@ -128,9 +118,9 @@ PODS: - GoogleUtilities/Logger - GoogleUtilities/UserDefaults (6.7.2): - GoogleUtilities/Logger - - GTMAppAuth (1.0.0): - - AppAuth/Core (~> 1.0) - - GTMSessionFetcher (~> 1.1) + - GTMAppAuth (1.1.0): + - AppAuth/Core (~> 1.4) + - GTMSessionFetcher (~> 1.4) - GTMSessionFetcher (1.4.0): - GTMSessionFetcher/Full (= 1.4.0) - GTMSessionFetcher/Core (1.4.0) @@ -143,7 +133,7 @@ PODS: - nanopb/encode (1.30905.0) - path_provider (0.0.1): - Flutter - - PromisesObjC (1.2.10) + - PromisesObjC (1.2.11) - Protobuf (3.13.0) - shared_preferences (0.0.1): - Flutter @@ -167,21 +157,19 @@ DEPENDENCIES: SPEC REPOS: trunk: - AppAuth - - Crashlytics - - Fabric - Firebase - - FirebaseAnalytics - FirebaseAnalyticsInterop - FirebaseAuth - FirebaseAuthInterop - FirebaseCore - FirebaseCoreDiagnostics - FirebaseCoreDiagnosticsInterop + - FirebaseCrashlytics - FirebaseInstallations - FirebaseInstanceID - FirebaseMessaging - - GoogleAppMeasurement - GoogleDataTransport + - GoogleDataTransportCCTSupport - GoogleSignIn - GoogleUtilities - GTMAppAuth @@ -224,37 +212,35 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 - cloud_firestore: b054ccc068b5907645c32b669d38e82db2a11fc7 - Crashlytics: 540b7e5f5da5a042647227a5e3ac51d85eed06df - Fabric: 706c8b8098fff96c33c0db69cbf81f9c551d0d74 + cloud_firestore: db3dab8f6a348f0f6ec01c3ba911ec5ac5e0df1a Firebase: 7cf5f9c67f03cb3b606d1d6535286e1080e57eb6 - firebase_auth: c42c06a212439824b5da53437da905931e8e6b9a - firebase_core: 3134fe79d257d430f163b558caf52a10a87efe8a - firebase_crashlytics: cc468e94e5a637364aeeeec5c8a96d92ea75ec7b - firebase_messaging: 21344b3b3a7d9d325d63a70e3750c0c798fe1e03 - FirebaseAnalytics: 96634d356482d4f3af8fe459a0ebf19a99c71b75 + firebase_auth: 8ae6798925da84bf8745668a73c936b148c1b04d + firebase_core: 00e54a4744164a6b5a250b96dd1ad5afaba7a342 + firebase_crashlytics: d98ee7212fc6a7102c0f775a7cc30cd3f7041f5a + firebase_messaging: 666d9994651b1ecf8c582b52dd913f3fa58c17ef FirebaseAnalyticsInterop: 3f86269c38ae41f47afeb43ebf32a001f58fcdae FirebaseAuth: 7047aec89c0b17ecd924a550c853f0c27ac6015e FirebaseAuthInterop: a0f37ae05833af156e72028f648d313f7e7592e9 FirebaseCore: f42e5e5f382cdcf6b617ed737bf6c871a6947b17 - FirebaseCoreDiagnostics: 7535fe695737f8c5b350584292a70b7f8ff0357b + FirebaseCoreDiagnostics: 4505e4d4009b1d93f605088ee7d7764d5f0d1c84 FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850 + FirebaseCrashlytics: a87cce5746d3335995bd18b1b60d073cd05a6920 FirebaseFirestore: 2cf6944bc538e57c94d8332bae501178edb70727 FirebaseInstallations: 6f5f680e65dc374397a483c32d1799ba822a395b FirebaseInstanceID: cef67c4967c7cecb56ea65d8acbb4834825c587b FirebaseMessaging: 29543feb343b09546ab3aa04d008ee8595b43c44 Flutter: 0e3d915762c693b495b44d77113d4970485de6ec - flutter_local_notifications: 9e4738ce2471c5af910d961a6b7eadcf57c50186 + flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 google_sign_in: 6bd214b9c154f881422f5fe27b66aaa7bbd580cc - GoogleAppMeasurement: 67458367830514fb20fd9e233496f1eef9d90185 - GoogleDataTransport: 672fb0ce96fe7f7f31d43672fca62ad2c9c86f7b + GoogleDataTransport: 9a8a16f79feffc7f42096743de2a7c4815e84020 + GoogleDataTransportCCTSupport: 489c1265d2c85b68187a83a911913d190012158d GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 - GTMAppAuth: 4deac854479704f348309e7b66189e604cf5e01e + GTMAppAuth: 197a8dabfea5d665224aa00d17f164fc2248dab9 GTMSessionFetcher: 6f5c8abbab8a9bce4bb3f057e317728ec6182b10 nanopb: c43f40fadfe79e8b8db116583945847910cbabc9 path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c - PromisesObjC: b14b1c6b68e306650688599de8a45e49fae81151 + PromisesObjC: 8c196f5a328c2cba3e74624585467a557dcb482f Protobuf: 3dac39b34a08151c6d949560efe3f86134a3f748 shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 1665991a2..f154592ca 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -160,7 +160,7 @@ 19C30BF24B9B3764322558E0 /* [CP] Embed Pods Frameworks */, B95F8B29E8B1475B6CE0DCBC /* [CP] Copy Pods Resources */, 3834E8522344353A0065EDE5 /* Auto increment Xcode version number */, - 3864E4252347CC4B00516597 /* Crashlytics (needs to be last) */, + 03E104E1253E7F040083B7F0 /* ShellScript */, ); buildRules = ( ); @@ -224,60 +224,57 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 19C30BF24B9B3764322558E0 /* [CP] Embed Pods Frameworks */ = { + 03E104E1253E7F040083B7F0 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + ); outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n${PODS_ROOT}/FirebaseCrashlytics/run\n"; }; - 3834E8522344353A0065EDE5 /* Auto increment Xcode version number */ = { + 19C30BF24B9B3764322558E0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); - name = "Auto increment Xcode version number"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh $SRCROOT/auto_increment_version.sh\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - 3864E4252347CC4B00516597 /* Crashlytics (needs to be last) */ = { + 3834E8522344353A0065EDE5 /* Auto increment Xcode version number */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "", ); inputPaths = ( - "$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", ); - name = "Crashlytics (needs to be last)"; + name = "Auto increment Xcode version number"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n${PODS_ROOT}/Fabric/run\n"; + shellScript = "/bin/sh $SRCROOT/auto_increment_version.sh\n"; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 8f56bd686..31c71b3b5 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 7 + 19 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/pubspec.lock b/pubspec.lock index b7668a65d..a1fc052f4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -175,7 +175,7 @@ packages: name: firebase_messaging url: "https://pub.dartlang.org" source: hosted - version: "6.0.16" + version: "7.0.3" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index cab02e8cf..5d4c9a86e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: cloud_firestore: ^0.14.1+3 firebase_auth: ^0.18.1+2 firebase_crashlytics: ^0.2.1+1 - firebase_messaging: ^6.0.1 + firebase_messaging: ^7.0.3 google_sign_in: ^4.5.1 # Misc flutter_local_notifications: ^2.0.0 From faae1a948162b1ec9523ecc6876eb43bf27ca7c5 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 23 Oct 2020 14:15:21 -0400 Subject: [PATCH 062/251] Deleted Admin models in favor of UserModel --- lib/models.dart | 4 +- lib/src/models/data/admin.dart | 29 ---------- lib/src/models/data/admin/user.dart | 53 ------------------- .../calendar_editor.dart} | 8 +-- lib/src/pages/calendar.dart | 6 +-- 5 files changed, 9 insertions(+), 91 deletions(-) delete mode 100644 lib/src/models/data/admin.dart delete mode 100644 lib/src/models/data/admin/user.dart rename lib/src/models/{data/admin/calendar.dart => view/calendar_editor.dart} (94%) diff --git a/lib/models.dart b/lib/models.dart index f703ec1df..5204916e8 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -37,11 +37,11 @@ export "src/models/data/sports.dart"; export "src/models/data/user.dart"; // view models -export "src/models/data/admin/calendar.dart"; export "src/models/view/builders/day_builder.dart"; export "src/models/view/builders/reminder_builder.dart"; export "src/models/view/builders/special_builder.dart"; export "src/models/view/builders/sports_builder.dart"; +export "src/models/view/calendar_editor.dart"; export "src/models/view/feedback.dart"; export "src/models/view/home.dart"; export "src/models/view/schedule.dart"; @@ -61,7 +61,7 @@ class Models extends Model { schedule = Schedule(); sports = Sports(); user = UserModel(); - + await reminders.init(); await schedule.init(); await sports.init(refresh: true); diff --git a/lib/src/models/data/admin.dart b/lib/src/models/data/admin.dart deleted file mode 100644 index 10418db10..000000000 --- a/lib/src/models/data/admin.dart +++ /dev/null @@ -1,29 +0,0 @@ -import "package:ramaz/services.dart"; - -import "admin/calendar.dart"; -import "admin/user.dart"; -import "model.dart"; - -export "admin/calendar.dart"; -export "admin/user.dart"; - -/// A data model that manages all admin responsibilities. -class AdminModel extends Model { - CalendarModel _calendar; - - /// The admin user this model is managing. - /// - /// This is an [AdminUserModel], not just the user itself. - AdminUserModel user; - - @override - Future init() async { - user = AdminUserModel( - json: await Services.instance.database.admin, - scopes: await Auth.adminScopes - ); - } - - /// The data model for modifying the calendar. - CalendarModel get calendar => _calendar ??= CalendarModel(); -} \ No newline at end of file diff --git a/lib/src/models/data/admin/user.dart b/lib/src/models/data/admin/user.dart deleted file mode 100644 index 11422bd4a..000000000 --- a/lib/src/models/data/admin/user.dart +++ /dev/null @@ -1,53 +0,0 @@ -import "package:flutter/foundation.dart"; - -import "package:ramaz/data.dart"; -import "package:ramaz/services.dart"; - -/// A data model to manage an [Admin] user. -/// -/// While the [Admin] class handles admin data, this class handles syncing -/// the admin's data to the database. -// ignore: prefer_mixin -class AdminUserModel with ChangeNotifier { - /// The admin being managed by this model. - final Admin admin; - - /// Creates a data model to manage admin data. - AdminUserModel({ - @required Map json, - @required List scopes - }) : admin = Admin.fromJson(json, scopes); - - /// The list of this admin's custom [Special]s. - List get specials => admin.specials; - - /// Saves the admin's data both to the device and the cloud. - Future save() async { - await Services.instance.database.setAdmin(admin.toJson()); - notifyListeners(); - } - - /// Adds a [Special] to the admin's list of custom specials. - void addSpecial(Special special) { - if (special == null) { - return; - } - admin.specials.add(special); - save(); - } - - /// Replaces a [Special] in the admin's list of custom specials. - void replaceSpecial(int index, Special special) { - if (special == null) { - return; - } - admin.specials [index] = special; - save(); - } - - /// Removes a [Special] in the admin's list of custom specials. - void removeSpecial(int index) { - admin.specials.removeAt(index); - save(); - } -} diff --git a/lib/src/models/data/admin/calendar.dart b/lib/src/models/view/calendar_editor.dart similarity index 94% rename from lib/src/models/data/admin/calendar.dart rename to lib/src/models/view/calendar_editor.dart index cb76f3709..fce2230de 100644 --- a/lib/src/models/data/admin/calendar.dart +++ b/lib/src/models/view/calendar_editor.dart @@ -5,11 +5,11 @@ import "package:flutter/foundation.dart" show ChangeNotifier; import "package:ramaz/data.dart"; import "package:ramaz/services.dart"; -/// A data model to manage the calendar. +/// A model to manage the calendar. /// /// This model listens to the calendar and can modify it in the database. // ignore: prefer_mixin -class CalendarModel with ChangeNotifier { +class CalendarEditor with ChangeNotifier { /// How many days there are in every month. static const int daysInMonth = 7 * 5; @@ -55,9 +55,9 @@ class CalendarModel with ChangeNotifier { /// Creates a data model to hold the calendar. /// - /// Initializing a [CalendarModel] automatically listens to the calendar in + /// Initializing a [CalendarEditor] automatically listens to the calendar in /// Firebase. - CalendarModel() { + CalendarEditor() { for (int month = 0; month < 12; month++) { subscriptions.add( Services diff --git a/lib/src/pages/calendar.dart b/lib/src/pages/calendar.dart index 31cfb71d4..2609414d5 100644 --- a/lib/src/pages/calendar.dart +++ b/lib/src/pages/calendar.dart @@ -28,9 +28,9 @@ class CalendarPage extends StatelessWidget { appBar: AppBar(title: const Text("Calendar")), body: SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 5), - child: ModelListener( - model: () => CalendarModel(), - builder: (_, CalendarModel model, __) => ExpansionPanelList.radio( + child: ModelListener( + model: () => CalendarEditor(), + builder: (_, CalendarEditor model, __) => ExpansionPanelList.radio( children: [ for (int month = 0; month < 12; month++) ExpansionPanelRadio( From 8c8c6e777155af02b24e35cde5c1cb17595b0a20 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 23 Oct 2020 14:17:52 -0400 Subject: [PATCH 063/251] Made Schedule rely on User model' --- lib/models.dart | 4 ++-- lib/src/models/data/schedule.dart | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/models.dart b/lib/models.dart index 5204916e8..7e436dee4 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -57,15 +57,15 @@ class Models extends Model { @override Future init() async { + user = UserModel(); reminders = Reminders(); schedule = Schedule(); sports = Sports(); - user = UserModel(); + await user.init(); await reminders.init(); await schedule.init(); await sports.init(refresh: true); - await user.init(); } @override diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index 9992bfa76..2fcd8deba 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -53,7 +53,7 @@ class Schedule extends Model { Future init() async { reminders = Models.instance.reminders ..addListener(remindersListener); - user = User.fromJson(await Services.instance.database.user); + user = Models.instance.user.data; subjects = Subject.getSubjects( await Services.instance.database.getSections(user.sectionIDs) ); From 038c856f7698adfef13ad194b2e7c01f48aa94bd Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 26 Oct 2020 22:48:41 -0400 Subject: [PATCH 064/251] Refactored Period to use PeriodData --- lib/src/data/schedule/period.dart | 92 ++++++++++++------------------- lib/src/data/user.dart | 8 +-- 2 files changed, 40 insertions(+), 60 deletions(-) diff --git a/lib/src/data/schedule/period.dart b/lib/src/data/schedule/period.dart index a1e6f2f31..81bae0547 100644 --- a/lib/src/data/schedule/period.dart +++ b/lib/src/data/schedule/period.dart @@ -32,34 +32,22 @@ class PeriodData { /// A const constructor for a [PeriodData]. /// - /// If both [id] and [room] are null, then it is a free period. - /// Use [PeriodData.free] instead. Otherwise, it is considered an error - /// to have a null [room] OR [id]. + /// It is an error to have a null [room] or [id]. Free periods should not be + /// represented by [PeriodData]s, instead use null. const PeriodData ({ @required this.room, @required this.id - }) : - assert ( - room != null || id != null, - "Room and id must both be null or not." - ); - - const PeriodData._free() : - room = null, - id = null; - - /// A free period. - /// - /// Use this instead of manually constructing a [PeriodData] - /// to keep consistency throughout the code. - static const free = PeriodData._free(); + }) : assert ( + room != null && id != null, + "Room and id must both be non-null." + ); /// Returns a [PeriodData] from a JSON object. /// /// If the JSON object is null, then it is considered a free period. /// Otherwise, both `json ["room"]` and `json ["id"]` must be non-null. - factory PeriodData.fromJson (Map json) => json == null - ? PeriodData.free + factory PeriodData.fromJson(Map json) => json == null + ? null : PeriodData( room: json ["room"], id: json ["id"] @@ -89,14 +77,6 @@ class Period { /// then this will be null. final Range time; - /// The room this period is in. - /// - /// It may be null, indicating that the student is not expected to be in class. - /// - /// Since the room comes from a [PeriodData] object, both the room and [id] - /// must both be null, or both must be non-null. See [PeriodData()] for more. - final String room; - /// A String representation of this period. /// /// Since a period can be a number (like 9), or a word (like "Homeroom"), @@ -104,14 +84,8 @@ class Period { /// care whether a period is a regular class or something like homeroom. final String period; - /// The id of the [Subject] for this period. - /// - /// It may be null, indicating that the student is not expected - /// to be in a class at this time. - /// - /// Since the id comes from a [PeriodData] object, both the id and [room] - /// must both be null, or both must be non-null. See [PeriodData()] for more. - final String id; + /// The section ID and room for this period. + final PeriodData data; /// The activity for this period. /// @@ -119,19 +93,18 @@ class Period { final Activity activity; /// Unpacks a [PeriodData] object and returns a Period. - Period( - PeriodData data, - {@required this.time, @required this.period, @required this.activity} - ) : - room = data.room, - id = data.id; + const Period({ + @required this.data, + @required this.time, + @required this.period, + this.activity + }); /// Returns a period that represents time for Mincha. /// /// Use this constructor to keep a consistent definition of "Mincha". const Period.mincha(this.time, {this.activity}) : - room = null, - id = null, + data = null, period = "Mincha"; /// This is only for debug purposes. Use [getName] for UI labels. @@ -139,48 +112,55 @@ class Period { String toString() => "Period $period"; @override - int get hashCode => "$period-$id".hashCode; + int get hashCode => "$period-${data.id}".hashCode; @override bool operator == (dynamic other) => other is Period && other.time == time && - other.room == room && other.period == period && - other.id == id; + other.data == data; + + /// Whether this is a free period. + bool get isFree => data == null; + + /// The section ID for this period. + /// + /// See [PeriodData.id]. + String get id => data?.id; /// Returns a String representation of this period. /// - /// The expected subject can be retrieved by looking up the [id]. + /// The expected subject can be retrieved by looking up `data.id`. /// - /// If [period] is an integer and [id] is null, then it is a free period. + /// If [period] is an integer and [data] is null, then it is a free period. /// Otherwise, if [period] is not a number, than it is returned instead. - /// Finally, the [Subject] that corresponds to [id] will be returned. + /// Finally, the [Subject] that corresponds to [data] will be returned. /// /// For example: /// - /// 1. A period with [PeriodData.free] will return "Free period" + /// 1. A period with null [data] will return "Free period" /// 2. A period with `period == "Homeroom"` will return "Homeroom" /// 3. A period with `period == "3"` will return the name of the [Subject]. /// - String getName(Subject subject) => int.tryParse(period) != null && id == null + String getName(Subject subject) => int.tryParse(period) != null && isFree ? "Free period" : subject?.name ?? period; /// Returns a list of descriptions for this period. /// - /// The expected subject can be retrieved by looking up the [id]. + /// The expected subject can be retrieved by looking up `data.id`. /// /// Useful throughout the UI. This function will: /// /// 1. Always display the time. /// 2. If [period] is a number, will display the period. - /// 3. If [room] is not null, will display the room. - /// 4. If [id] is valid, will return the name of the [Subject]. + /// 3. If `data.room` is not null, will display the room. + /// 4. If `data.id` is valid, will return the name of the [Subject]. /// List getInfo (Subject subject) => [ if (time != null) "Time: $time", if (int.tryParse(period) != null) "Period: $period", - if (room != null) "Room: $room", + if (data.room != null) "Room: ${data.room}", if (subject != null) "Teacher: ${subject.teacher}", ]; } diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index 940f5bb89..0a2e3428f 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -137,22 +137,22 @@ class User { return [ for (int index = 0; index < periodCount; index++) if (special.homeroom == index) Period( - PeriodData.free, + data: null, period: "Homeroom", time: getTime(index), activity: null, ) else if (special.mincha == index) Period( - PeriodData.free, + data: null, period: "Mincha", time: getTime(index), activity: null, ) else if (special.skip.contains(index)) Period( - PeriodData.free, + data: null, period: "Free period", time: getTime(index), activity: null, ) else Period( - schedule [day.name] [periodIndex] ?? PeriodData.free, + data: schedule [day.name] [periodIndex], period: (++periodIndex).toString(), time: getTime(index), activity: null, From d8e554b0981cbd077ff8294418e8fe17d90a062e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 27 Oct 2020 09:43:53 -0400 Subject: [PATCH 065/251] Documented models --- lib/src/models/data/model.dart | 9 +++++++ lib/src/models/data/schedule.dart | 2 ++ lib/src/models/data/sports.dart | 1 + lib/src/models/data/user.dart | 24 +++++++++++++++++++ .../view/builders/reminder_builder.dart | 1 + .../models/view/builders/special_builder.dart | 2 -- lib/src/models/view/home.dart | 17 ++++++++++++- 7 files changed, 53 insertions(+), 3 deletions(-) diff --git a/lib/src/models/data/model.dart b/lib/src/models/data/model.dart index f4949dea0..efb1854f1 100644 --- a/lib/src/models/data/model.dart +++ b/lib/src/models/data/model.dart @@ -6,6 +6,15 @@ import "package:flutter/foundation.dart"; /// Whereas dataclasses don't care where they get their data from, and services /// don't care what data they get, a data model uses dataclasses to structure /// the data retrieved by a service. +/// +/// A data model should have functions and properties that the app as a whole +/// may need. Any part of the UI may depend on any part of a data model. To +/// update that data, call [notifyListeners], and every UI element that depends +/// on it will update. +/// +/// When implementing a data model, use the constructor for any synchronous +/// work, such as accessing another data model. For any async work, override the +/// [init] function. For cleanup, override the [dispose] function. // ignore: prefer_mixin abstract class Model with ChangeNotifier { /// Gets whatever data is needed by this model from a service. diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index 2fcd8deba..2232d4e82 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -47,6 +47,7 @@ class Schedule extends Model { /// The index that represents [period]'s location in [periods]. int periodIndex; + /// The reminders data model. Reminders reminders; @override @@ -60,6 +61,7 @@ class Schedule extends Model { await initCalendar(); } + /// Initializes the calendar. Future initCalendar() async { calendar = Day.getCalendar(await Services.instance.database.calendar); setToday(); diff --git a/lib/src/models/data/sports.dart b/lib/src/models/data/sports.dart index de3414216..42c4cfdb7 100644 --- a/lib/src/models/data/sports.dart +++ b/lib/src/models/data/sports.dart @@ -17,6 +17,7 @@ class Sports extends Model { /// A timer to refresh [todayGames]. Timer timer; + /// Helps partition [games] by past and future. DateTime now; /// A list of all the games taking place. diff --git a/lib/src/models/data/user.dart b/lib/src/models/data/user.dart index d5395c529..78152cac0 100644 --- a/lib/src/models/data/user.dart +++ b/lib/src/models/data/user.dart @@ -3,11 +3,31 @@ import "package:ramaz/services.dart"; import "model.dart"; +/// A data model to hold [User] and [Admin] objects. +/// +/// This data model doesn't really update, however it's a convenient place to +/// keep the user object. Any functionality relating to the admin is also +/// implemented here, so that the code for updating both the database and the +/// UI is in one place. class UserModel extends Model { + /// The user object. User data; + + /// The admin object. + /// + /// If the user is not an admin ([Auth.isAdmin]) is false, this will be null. Admin admin; + + /// The subjects this user has. + /// + /// For students this will be the courses they attend. For teachers, this + /// will be the courses they teach. Map subjects; + /// Whether this user is an admin. + /// + /// Unlike [Auth.isAdmin], which authenticates with the server, this getter + /// simply checks to see if [admin] was initialized. bool get isAdmin => admin == null; @override @@ -24,11 +44,13 @@ class UserModel extends Model { } } + /// Saves the admin data to the database. Future saveAdmin() async { await Services.instance.database.setAdmin(admin.toJson()); notifyListeners(); } + /// Adds a custom [Special] to the admin's profile. Future addSpecialToAdmin(Special special) async { if (special == null) { return; @@ -37,6 +59,7 @@ class UserModel extends Model { return saveAdmin(); } + /// Replaces the custom [Special] at the given index in the user's profile. Future replaceAdminSpecial(int index, Special special) async { if (special == null) { return; @@ -45,6 +68,7 @@ class UserModel extends Model { return saveAdmin(); } + /// Removes a custom [Special] at a given index from the user's profile. Future removeSpecialFromAdmin(int index) { admin.specials.removeAt(index); return saveAdmin(); diff --git a/lib/src/models/view/builders/reminder_builder.dart b/lib/src/models/view/builders/reminder_builder.dart index 4e2479e89..58a6701fe 100644 --- a/lib/src/models/view/builders/reminder_builder.dart +++ b/lib/src/models/view/builders/reminder_builder.dart @@ -23,6 +23,7 @@ class RemindersBuilderModel with ChangeNotifier { /// being displayed once. bool shouldRepeat = false; + /// The name of the day. String dayName; /// The period this reminder should be displayed. diff --git a/lib/src/models/view/builders/special_builder.dart b/lib/src/models/view/builders/special_builder.dart index 8d4499ae9..01f0787c7 100644 --- a/lib/src/models/view/builders/special_builder.dart +++ b/lib/src/models/view/builders/special_builder.dart @@ -12,8 +12,6 @@ class SpecialBuilderModel with ChangeNotifier { /// /// Regular periods have numbers, others (eg, homeroom and mincha) are null. List periods = []; - final Map activities = {}; - List _times = []; List _skips = []; String _name; diff --git a/lib/src/models/view/home.dart b/lib/src/models/view/home.dart index 704a85668..f60c1de56 100644 --- a/lib/src/models/view/home.dart +++ b/lib/src/models/view/home.dart @@ -2,14 +2,29 @@ import "package:flutter/foundation.dart"; import "package:ramaz/models.dart"; +/// A view model for the home page. +/// +/// This model doesn't actually do much, it just listens to any data models +/// that are relevant to the home page. Because we're using [ChangeNotifier], +/// as its the only [Listenable] with a [dispose] method, we can't simply use +/// [Listenable.merge]. +/// +/// Additionally, the data models being listened to here will be disposed after +/// signing in and will be unusable. That's why we can't simply pass in a data +/// model. Instead, we have to reference it through [Models], which will always +/// have an up-to-date instance. // ignore: prefer_mixin class HomeModel with ChangeNotifier { - // Do NOT use a list here. See null checks in [dispose]. + /// Listens to [Schedule] (and by extension, [Reminders]) and [Sports]. HomeModel() { Models.instance.schedule.addListener(notifyListeners); Models.instance.sports.addListener(notifyListeners); } + // Do not attempt to clean up this code by using a list. + // + // These models may be disposed, and the new instance from [Models] should + // be used instead. @override void dispose() { Models.instance?.schedule?.removeListener(notifyListeners); From 721daf2a3d87a776d54e449150badbbbcd3b7b2b Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 27 Oct 2020 11:27:20 -0400 Subject: [PATCH 066/251] Cleaned up docs for widgets --- lib/src/widgets/ambient/brightness_changer.dart | 3 +++ lib/src/widgets/atomic/admin/period_tile.dart | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/src/widgets/ambient/brightness_changer.dart b/lib/src/widgets/ambient/brightness_changer.dart index a544d1eed..21bffdde0 100644 --- a/lib/src/widgets/ambient/brightness_changer.dart +++ b/lib/src/widgets/ambient/brightness_changer.dart @@ -107,6 +107,9 @@ class BrightnessChanger extends StatelessWidget { ), ); + /// Sets the brightness of the app. + /// + /// Also saves it to [Preferences]. void setBrightness (BuildContext context, {bool value}) { ThemeChanger.of(context).brightness = caseConverter ( value: value, diff --git a/lib/src/widgets/atomic/admin/period_tile.dart b/lib/src/widgets/atomic/admin/period_tile.dart index 78bb649ae..f8cb8a0ce 100644 --- a/lib/src/widgets/atomic/admin/period_tile.dart +++ b/lib/src/widgets/atomic/admin/period_tile.dart @@ -15,6 +15,7 @@ class PeriodTile extends StatelessWidget { /// Allows [range] to be formatted according to the user's locale. final TimeOfDay start, end; + /// The [Activity] for this period. final Activity activity; /// Whether this period is skipped. @@ -30,7 +31,7 @@ class PeriodTile extends StatelessWidget { @required this.index, }) : skipped = model.skips.contains(index), - activity = model.activities [index], + activity = null, start = range.start.asTimeOfDay, end = range.end.asTimeOfDay; From 216d6dc997c330f26b1f45a08d1e9111b9ae9bf2 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 27 Oct 2020 11:57:51 -0400 Subject: [PATCH 067/251] Finished documentation --- lib/main.dart | 3 + lib/models.dart | 18 +++++ lib/services.dart | 23 ++++++ lib/src/models/view/home.dart | 18 +++++ lib/src/pages/home.dart | 141 ++++++++++++++++++---------------- lib/src/pages/login.dart | 7 +- 6 files changed, 139 insertions(+), 71 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 2e3f42684..846114044 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -70,6 +70,9 @@ Future main({bool restart = false}) async { /// The main app widget. class RamazApp extends StatelessWidget { + /// Whether the user is already signed in. + /// + /// This was already determined using [Services] in [main]. final bool isSignedIn; /// The brightness to default to. diff --git a/lib/models.dart b/lib/models.dart index 7e436dee4..1a0c1ee23 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -47,12 +47,30 @@ export "src/models/view/home.dart"; export "src/models/view/schedule.dart"; export "src/models/view/sports.dart"; +/// Bundles all the data models together. +/// +/// Each data model is responsible for different types of data. For example, +/// [Schedule] keeps track of the schedule (as well as associated data such as +/// the current period) and [UserModel] reads the user data. +/// +/// Each data model inherits from [Model], so it has [init] and [dispose] +/// functions. This model serves to bundles those together, so that calling +/// [init] or [dispose] on this model will call the respective functions +/// on all the data models. class Models extends Model { + /// The singleton instance of this class. static Models instance = Models(); + /// The reminders data model. Reminders reminders; + + /// The schedule data model. Schedule schedule; + + /// The sports data model. Sports sports; + + /// The user data model. UserModel user; @override diff --git a/lib/services.dart b/lib/services.dart index 1882412be..a870c0652 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -27,16 +27,39 @@ export "src/services/crashlytics.dart"; export "src/services/notifications.dart"; export "src/services/preferences.dart"; +/// Bundles all the services. +/// +/// A [Service] has an [init] and a [signIn] function. This service serves +/// to bundle them all, so that you only need to call the functions of this +/// service, and they will call all the other services' functions. class Services implements Service { /// The singleton instance of this class. static Services instance = Services(); + /// The Crashlytics interface. final Crashlytics crashlytics = Crashlytics.instance; + + /// The database bundle. final Databases database = Databases(); + + /// The local notifications interface. + /// + /// Local notifications come from the app and not a server. final Notifications notifications = Notifications(); + + /// The push notifications interface. + /// + /// Push notifications come from the server. final PushNotifications pushNotifications = PushNotifications.instance; + + /// The shared preferences interface. + /// + /// Useful for storing small key-value pairs. final Preferences prefs = Preferences(); + /// All the services in a list. + /// + /// The functions of this service operate on these services. List services; /// Bundles services together. diff --git a/lib/src/models/view/home.dart b/lib/src/models/view/home.dart index f60c1de56..7d01424d6 100644 --- a/lib/src/models/view/home.dart +++ b/lib/src/models/view/home.dart @@ -1,6 +1,7 @@ import "package:flutter/foundation.dart"; import "package:ramaz/models.dart"; +import "package:ramaz/services.dart"; /// A view model for the home page. /// @@ -31,4 +32,21 @@ class HomeModel with ChangeNotifier { Models.instance?.sports?.removeListener(notifyListeners); super.dispose(); } + + + /// Refreshes the database. + /// + /// This only updates the calendar and sports games, not the user profile. To + /// update user data, sign out and sign back in. + Future refresh(VoidCallback onFailure) async { + try { + await Services.instance.database.updateCalendar(); + await Services.instance.database.updateSports(); + await Models.instance.schedule.initCalendar(); + } catch (error) { // ignore: avoid_catches_without_on_clauses + // We just want to allow the user to retry. But still rethrow. + onFailure(); + rethrow; + } + } } diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index d805d7c59..433d23c02 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -1,48 +1,51 @@ // ignore_for_file: prefer_const_constructors_in_immutables import "package:flutter/material.dart"; -import "package:flutter/services.dart"; import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; -import "package:ramaz/services.dart"; import "package:ramaz/widgets.dart"; /// The homepage of the app. class HomePage extends StatelessWidget { + /// The schedule data model. final Schedule scheduleModel; + + /// The reminders data model. final Reminders remindersModel; + + /// The sports data model. final Sports sportsModel; + /// The home page. + /// + /// Listens to [Schedule] (and by extension, [Reminders]) and [Sports]. HomePage() : scheduleModel = Models.instance.schedule, remindersModel = Models.instance.reminders, sportsModel = Models.instance.sports; - /// Downloads the calendar again and calls [Schedule.onNewPeriod]. - Future refresh(BuildContext context) async { - try { - await Services.instance.database.updateCalendar(); - await Services.instance.database.updateSports(); - await scheduleModel.initCalendar(); - } on PlatformException catch(error) { - if (error.code == "Error performing get") { - Scaffold.of(context).showSnackBar( - SnackBar( - content: const Text("No Internet"), - action: SnackBarAction( - label: "RETRY", - onPressed: () => refresh(context), - ), - ) - ); - } - } - } + /// Allows the user to refresh data. + /// + /// Updates the calendar and sports games. To update the user profile, + /// log out and log back in. + /// + /// This has to be a separate function since it can recursively call itself. + Future refresh(BuildContext context, HomeModel model) => model.refresh( + () => Scaffold.of(context).showSnackBar( + SnackBar( + content: const Text("No Internet"), + action: SnackBarAction( + label: "RETRY", + onPressed: () => refresh(context, model), + ), + ) + ) + ); @override Widget build (BuildContext context) => ModelListener( model: () => HomeModel(), - builder: (BuildContext context, _, __) => Scaffold ( + builder: (BuildContext context, HomeModel model, __) => Scaffold ( appBar: AppBar ( title: const Text ("Home"), actions: [ @@ -70,53 +73,55 @@ class HomePage extends StatelessWidget { : "Upcoming Classes" ) ), - body: RefreshIndicator ( // so you can refresh the period - onRefresh: () => refresh(context), - child: ListView ( - children: [ - RamazLogos.ramRectangle, - const Divider(), - Text ( - scheduleModel.hasSchool - ? "Today is a${scheduleModel.today.n} " - "${scheduleModel.today.name}" - "\nSchedule: ${scheduleModel.today.special.name}" - : "There is no school today", - textScaleFactor: 2, - textAlign: TextAlign.center - ), - const SizedBox (height: 20), - if (scheduleModel.hasSchool) NextClass( - reminders: remindersModel.currentReminders, - period: scheduleModel.period, - subject: scheduleModel.subjects [scheduleModel.period?.id], - modified: scheduleModel.today.isModified, - ), - // if school won't be over, show the next class - if ( - scheduleModel.nextPeriod != null && - !scheduleModel.today.isModified - ) NextClass ( - next: true, - reminders: remindersModel.nextReminders, - period: scheduleModel.nextPeriod, - subject: scheduleModel.subjects [scheduleModel.nextPeriod?.id], - modified: scheduleModel.today.isModified, - ), - if (sportsModel.todayGames.isNotEmpty) ...[ - const SizedBox(height: 10), - const Center( - child: Text( - "Sports games", - textScaleFactor: 1.5, - style: TextStyle(fontWeight: FontWeight.w300) - ) + body: Builder( + builder: (BuildContext context) => RefreshIndicator( + onRefresh: () => refresh(context, model), + child: ListView ( + children: [ + RamazLogos.ramRectangle, + const Divider(), + Text ( + scheduleModel.hasSchool + ? "Today is a${scheduleModel.today.n} " + "${scheduleModel.today.name}" + "\nSchedule: ${scheduleModel.today.special.name}" + : "There is no school today", + textScaleFactor: 2, + textAlign: TextAlign.center ), - const SizedBox(height: 10), - for (final int index in sportsModel.todayGames) - SportsTile(sportsModel.games [index]) + const SizedBox (height: 20), + if (scheduleModel.hasSchool) NextClass( + reminders: remindersModel.currentReminders, + period: scheduleModel.period, + subject: scheduleModel.subjects [scheduleModel.period?.id], + modified: scheduleModel.today.isModified, + ), + // if school won't be over, show the next class + if ( + scheduleModel.nextPeriod != null && + !scheduleModel.today.isModified + ) NextClass ( + next: true, + reminders: remindersModel.nextReminders, + period: scheduleModel.nextPeriod, + subject: scheduleModel.subjects [scheduleModel.nextPeriod?.id], + modified: scheduleModel.today.isModified, + ), + if (sportsModel.todayGames.isNotEmpty) ...[ + const SizedBox(height: 10), + const Center( + child: Text( + "Sports games", + textScaleFactor: 1.5, + style: TextStyle(fontWeight: FontWeight.w300) + ) + ), + const SizedBox(height: 10), + for (final int index in sportsModel.todayGames) + SportsTile(sportsModel.games [index]) + ] ] - ] + ) ) ) ) diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index eb5f21308..5e440bc8d 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -20,9 +20,6 @@ import "package:ramaz/widgets.dart"; /// This page holds methods that can safely clean the errors away before /// prompting the user to try again. class Login extends StatefulWidget { - /// Creates the login page. - Login(); - @override LoginState createState() => LoginState(); } @@ -30,6 +27,7 @@ class Login extends StatefulWidget { /// /// This state keeps a reference to the [BuildContext]. class LoginState extends State { + /// Whether the page is loading. bool isLoading = false; @override @@ -151,6 +149,9 @@ class LoginState extends State { onSuccess(); } + /// Signs the user in. + /// + /// Calls [Services.signIn] and [Models.init]. Future signIn(BuildContext scaffoldContext) => safely( scaffoldContext: scaffoldContext, function: () async { From c56004cbe23a1c09c6592c716431a670d476494d Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 27 Oct 2020 23:56:48 -0400 Subject: [PATCH 068/251] Fixed some more bugs --- lib/src/data/schedule/period.dart | 2 +- lib/src/data/user.dart | 2 +- lib/src/models/view/schedule.dart | 16 +++++- lib/src/pages/schedule.dart | 94 ++++++++++++++++++------------- 4 files changed, 71 insertions(+), 43 deletions(-) diff --git a/lib/src/data/schedule/period.dart b/lib/src/data/schedule/period.dart index 81bae0547..406d43af7 100644 --- a/lib/src/data/schedule/period.dart +++ b/lib/src/data/schedule/period.dart @@ -160,7 +160,7 @@ class Period { List getInfo (Subject subject) => [ if (time != null) "Time: $time", if (int.tryParse(period) != null) "Period: $period", - if (data.room != null) "Room: ${data.room}", + if (data != null) "Room: ${data.room}", if (subject != null) "Teacher: ${subject.teacher}", ]; } diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index 0a2e3428f..a8208922c 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -146,7 +146,7 @@ class User { period: "Mincha", time: getTime(index), activity: null, - ) else if (special.skip.contains(index)) Period( + ) else if (special.skip?.contains(index) ?? false) Period( data: null, period: "Free period", time: getTime(index), diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index d3c7082d9..9efb27b39 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -66,7 +66,11 @@ class ScheduleModel with ChangeNotifier { /// Updates the UI to a new day given a new dayName or special. /// /// If the dayName is non-null, the special defaults to [defaultSpecial]. - void update({String newName, Special newSpecial}) { + void update({ + String newName, + Special newSpecial, + void Function() onInvalidSchedule, + }) { String name = day.name; if (newName != null) { name = newName; @@ -77,5 +81,15 @@ class ScheduleModel with ChangeNotifier { day = Day (name: name, special: newSpecial); notifyListeners(); } + try { + // Just to see if the computation is possible. + // TODO: Move the logic from ClassList here. + Models.instance.schedule.user.getPeriods(day); + } on RangeError { // ignore: avoid_catching_errors + day = Day(name: day.name, special: defaultSpecial); + if (onInvalidSchedule != null) { + onInvalidSchedule(); + } + } } } diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index 0872e5f38..0b7f82132 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -9,6 +9,12 @@ import "package:ramaz/widgets.dart"; /// A page to allow the user to explore their schedule. class SchedulePage extends StatelessWidget { + /// Lets the user know that they chose an invalid schedule combination. + void handleInvalidSchedule(BuildContext context) => Scaffold.of(context) + .showSnackBar( + const SnackBar(content: Text("Invalid schedule")) + ); + @override Widget build (BuildContext context) => ModelListener( model: () => ScheduleModel(), @@ -37,46 +43,54 @@ class SchedulePage extends StatelessWidget { ) ), drawer: ModalRoute.of(context).isFirst ? NavigationDrawer() : null, - body: Column ( - children: [ - ListTile ( - title: const Text ("Day"), - trailing: DropdownButton ( - value: model.day.name, - onChanged: (String value) => model.update(newName: value), - items: [ - for (final String dayName in Models.instance.schedule.user.dayNames) - DropdownMenuItem( - value: dayName, - child: Text(dayName), - ) - ] - ) - ), - ListTile ( - title: const Text ("Schedule"), - trailing: DropdownButton ( - value: model.day.special, - onChanged: (Special special) => model.update(newSpecial: special), - items: [ - for (final Special special in Special.specials) - DropdownMenuItem( - value: special, - child: Text (special.name), - ), - if (!Special.specials.contains(model.day.special)) - DropdownMenuItem( - value: model.day.special, - child: Text(model.day.special.name) - ) - ] - ) - ), - const SizedBox (height: 20), - const Divider(), - const SizedBox (height: 20), - Expanded (child: ClassList(day: model.day)), - ] + body: Builder( + builder: (BuildContext context) => Column( + children: [ + ListTile ( + title: const Text ("Day"), + trailing: DropdownButton ( + value: model.day.name, + onChanged: (String value) => model.update( + newName: value, + onInvalidSchedule: () => handleInvalidSchedule(context), + ), + items: [ + for (final String dayName in Models.instance.schedule.user.dayNames) + DropdownMenuItem( + value: dayName, + child: Text(dayName), + ) + ] + ) + ), + ListTile ( + title: const Text ("Schedule"), + trailing: DropdownButton ( + value: model.day.special, + onChanged: (Special special) => model.update( + newSpecial: special, + onInvalidSchedule: () => handleInvalidSchedule(context), + ), + items: [ + for (final Special special in Special.specials) + DropdownMenuItem( + value: special, + child: Text (special.name), + ), + if (!Special.specials.contains(model.day.special)) + DropdownMenuItem( + value: model.day.special, + child: Text(model.day.special.name) + ) + ] + ) + ), + const SizedBox (height: 20), + const Divider(), + const SizedBox (height: 20), + Expanded (child: ClassList(day: model.day)), + ] + ) ) ) ); From 492628404c5f38055c6352389485877e481f098c Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 09:52:40 -0400 Subject: [PATCH 069/251] Fixed notifications TZ bug --- lib/src/models/data/schedule.dart | 6 +---- lib/src/services/notifications.dart | 36 +++++++++++++++++++++-------- pubspec.lock | 7 ++++++ pubspec.yaml | 1 + 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index 2232d4e82..b5ae75767 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -121,8 +121,6 @@ class Schedule extends Model { now = newDate; return setToday(); } - - updateReminders(scheduleNotifications: first); // no school today. if (!today.school) { @@ -136,12 +134,12 @@ class Schedule extends Model { // Maybe the day changed if (newIndex != null && newIndex == periodIndex) { - // return notifyListeners(); return; } // period changed since last checked. periodIndex = newIndex; + updateReminders(scheduleNotifications: first); // School ended if (periodIndex == null) { @@ -154,8 +152,6 @@ class Schedule extends Model { nextPeriod = periodIndex < periods.length - 1 ? periods [periodIndex + 1] : null; - - updateReminders(scheduleNotifications: first); } /// Updates the reminders given the current period. diff --git a/lib/src/services/notifications.dart b/lib/src/services/notifications.dart index f9a7ca8c8..a287ba51b 100644 --- a/lib/src/services/notifications.dart +++ b/lib/src/services/notifications.dart @@ -1,5 +1,8 @@ import "package:flutter_local_notifications/flutter_local_notifications.dart"; import "package:flutter/material.dart" show required, immutable; +import "package:timezone/timezone.dart"; +import "package:timezone/data/latest.dart"; +import "package:flutter_native_timezone/flutter_native_timezone.dart"; import "package:ramaz/constants.dart"; @@ -75,16 +78,23 @@ class Notification { /// Currently, Web is not supported. class Notifications extends Service { final _plugin = FlutterLocalNotificationsPlugin(); + String timezoneName; + Location location; @override - Future init() => _plugin.initialize( - const InitializationSettings( - android: AndroidInitializationSettings( - "@mipmap/bright_yellow" // default icon of app - ), - iOS: IOSInitializationSettings(), // defaults are good - ) - ); + Future init() async { + await _plugin.initialize( + const InitializationSettings( + android: AndroidInitializationSettings( + "@mipmap/bright_yellow" // default icon of app + ), + iOS: IOSInitializationSettings(), // defaults are good + ) + ); + initializeTimeZones(); + timezoneName = await FlutterNativeTimezone.getLocalTimezone(); + location = getLocation(timezoneName); + } @override Future signIn() async {} @@ -107,7 +117,7 @@ class Notifications extends Service { notification.id, notification.title, notification.message, - date, + TZDateTime.from(date, location), notification.details, androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: @@ -117,4 +127,12 @@ class Notifications extends Service { /// Cancels all scheduled notifications, as well as /// dismissing all present notifications. void cancelAll() => _plugin.cancelAll(); + + Future> get pendingNotifications async => [ + for ( + final PendingNotificationRequest request in + await _plugin.pendingNotificationRequests() + ) + request.title + ]; } diff --git a/pubspec.lock b/pubspec.lock index a1fc052f4..e727e8431 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -202,6 +202,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + flutter_native_timezone: + dependency: "direct main" + description: + name: flutter_native_timezone + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" flutter_test: dependency: "direct dev" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 5d4c9a86e..ef9f25d8d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,6 +27,7 @@ dependencies: path_provider: ^1.4.4 shared_preferences: ^0.5.4 url_launcher: ^5.2.5 + flutter_native_timezone: ^1.0.4 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From 29d65843966d760fdf4e2f3ab8e33cb12179f925 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 09:53:31 -0400 Subject: [PATCH 070/251] Cleanup --- lib/src/pages/home.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index 433d23c02..34b58c890 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -1,4 +1,3 @@ -// ignore_for_file: prefer_const_constructors_in_immutables import "package:flutter/material.dart"; import "package:ramaz/models.dart"; From 5c808aafa77e730e56b2eaf2cc63472092ffe264 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 10:23:35 -0400 Subject: [PATCH 071/251] Fixed admin bug --- lib/src/models/data/user.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/models/data/user.dart b/lib/src/models/data/user.dart index 78152cac0..b67e8244a 100644 --- a/lib/src/models/data/user.dart +++ b/lib/src/models/data/user.dart @@ -28,7 +28,7 @@ class UserModel extends Model { /// /// Unlike [Auth.isAdmin], which authenticates with the server, this getter /// simply checks to see if [admin] was initialized. - bool get isAdmin => admin == null; + bool get isAdmin => admin != null; @override Future init() async { From dfc53e0b5f3d330cafb2ee04e96d6dc54a79d930 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 10:23:58 -0400 Subject: [PATCH 072/251] Fixed NextClass to use Period.getName --- lib/src/widgets/atomic/next_class.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/widgets/atomic/next_class.dart b/lib/src/widgets/atomic/next_class.dart index 3097dc166..c4de711cc 100644 --- a/lib/src/widgets/atomic/next_class.dart +++ b/lib/src/widgets/atomic/next_class.dart @@ -74,7 +74,7 @@ class NextClass extends StatelessWidget { title: modified ? "Times unavailable" : period == null ? "School is over" - : "${next ? 'Up next' : 'Right now'}: ${subject?.name ?? period.period}", + : "${next ? 'Up next' : 'Right now'}: ${period.getName(subject)}" ), if (period?.activity != null) SpecialTile(child: ActivityTile(period.activity)), From 983b9e9afdd2d16072a410e940701d51cc657582 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 10:54:24 -0400 Subject: [PATCH 073/251] Bumped version to 2.1.1 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index ef9f25d8d..913528637 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ description: A new Flutter project. # Both the version and the builder number may be overridden in flutter # build by specifying --build-name and --build-number, respectively. # Read more about versioning at semver.org. -version: 2.1.0+1 +version: 2.1.1 environment: sdk: ">=2.7.0 <=3.0.0" From 3530c35db85e50fc4323f03ddb60bcfaacb0f7da Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 10:54:24 -0400 Subject: [PATCH 074/251] Bumped version to 2.1.1 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index ef9f25d8d..22d95fb70 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ description: A new Flutter project. # Both the version and the builder number may be overridden in flutter # build by specifying --build-name and --build-number, respectively. # Read more about versioning at semver.org. -version: 2.1.0+1 +version: 2.1.1+1 environment: sdk: ">=2.7.0 <=3.0.0" From c52442905f2c609928f05aa4f24e40ce19f24aa0 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 15:35:23 -0400 Subject: [PATCH 075/251] Cleaned up merge with master into web --- lib/main.dart | 1 + lib/services.dart | 2 +- lib/src/pages/home.dart | 9 +- lib/src/pages/login.dart | 7 +- lib/src/services/notifications.dart | 119 ++----- lib/src/services/notifications/mobile.dart | 345 ++++++--------------- lib/src/services/notifications/stub.dart | 72 ++--- 7 files changed, 167 insertions(+), 388 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 12668146f..97949b558 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import "dart:async" show runZoned; import "package:flutter/material.dart"; +import "package:flutter/foundation.dart" show kDebugMode; import "package:flutter/services.dart"; import "package:ramaz/constants.dart"; // for route keys diff --git a/lib/services.dart b/lib/services.dart index a870c0652..6e0d208e4 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -45,7 +45,7 @@ class Services implements Service { /// The local notifications interface. /// /// Local notifications come from the app and not a server. - final Notifications notifications = Notifications(); + final Notifications notifications = Notifications.instance; /// The push notifications interface. /// diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index f570b48a7..cea0fd346 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -5,13 +5,16 @@ import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; /// The homepage of the app. - +class HomePage extends StatelessWidget { /// The reminders data model. final Reminders remindersModel; /// The sports data model. final Sports sportsModel; + /// The schedule data model. + final Schedule scheduleModel; + /// The home page. /// /// Listens to [Schedule] (and by extension, [Reminders]) and [Sports]. @@ -45,7 +48,7 @@ import "package:ramaz/widgets.dart"; appBarBuilder: (isShowingSchedule) => AppBar ( title: const Text ("Home"), actions: [ - if (model.schedule.hasSchool && !isShowingSchedule) Builder ( + if (scheduleModel.hasSchool && !isShowingSchedule) Builder ( builder: (BuildContext context) => FlatButton( textColor: Colors.white, onPressed: () => Scaffold.of(context).openEndDrawer(), @@ -73,7 +76,7 @@ import "package:ramaz/widgets.dart"; builder: (BuildContext context) => RefreshIndicator( onRefresh: () => refresh(context, model), child: ListView ( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30), + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 20), children: [ RamazLogos.ramRectangle, const Divider(), diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index 1ddf1f712..629055681 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -85,8 +85,6 @@ class LoginState extends State { final Crashlytics crashlytics = Services.instance.crashlytics; await crashlytics.log("Attempted to log in"); await crashlytics.setEmail(Auth.email); - await Services.instance.database.signOut(); - Models.instance.dispose(); // ignore: unawaited_futures showDialog ( context: context, @@ -109,7 +107,10 @@ class LoginState extends State { ) ] ) - ); + ).then((_) async { + await Services.instance.database.signOut(); + Models.instance.dispose(); + }); await crashlytics.recordError(error, stack); } diff --git a/lib/src/services/notifications.dart b/lib/src/services/notifications.dart index a287ba51b..4dc59de79 100644 --- a/lib/src/services/notifications.dart +++ b/lib/src/services/notifications.dart @@ -1,40 +1,12 @@ -import "package:flutter_local_notifications/flutter_local_notifications.dart"; -import "package:flutter/material.dart" show required, immutable; -import "package:timezone/timezone.dart"; -import "package:timezone/data/latest.dart"; -import "package:flutter_native_timezone/flutter_native_timezone.dart"; - -import "package:ramaz/constants.dart"; +import "package:meta/meta.dart"; +import "notifications/stub.dart" + if (dart.library.io) "notifications/mobile.dart"; import "service.dart"; -/// Describes how a reminders notification should look. -NotificationDetails reminderDetails = const NotificationDetails( - android: AndroidNotificationDetails( - "reminders", - "Reminders", - "When reminders are due.", - importance: Importance.high, - priority: Priority.high, - color: RamazColors.blue, - groupKey: "reminders", - playSound: true, - enableVibration: true, - setAsGroupSummary: false, - channelShowBadge: true, - icon: null, - styleInformation: null, - enableLights: true, - ), - iOS: IOSNotificationDetails( - presentBadge: true, - presentSound: true - ) -); - -/// A platform-agnostic notification. +/// A notification. /// -/// Helps creating [NotificationDetails]. +/// The notification has a [title] and a [message]. @immutable class Notification { /// The ID of this notification. @@ -48,24 +20,20 @@ class Notification { /// The body of this notification. final String message; - /// The platform-agnostic [NotificationDetails] for this class. - final NotificationDetails details; - - /// Returns a new [Notification]. + /// Creates a notification. const Notification({ @required this.title, @required this.message, - @required this.details, }); - /// The optimal configuration for a reminder notification. - Notification.reminder({ - @required this.title, - @required this.message, - }) : details = reminderDetails; + /// Creates a notification for a reminder. + factory Notification.reminder({ + @required String title, + @required String message, + }) => getReminderNotification(title: title, message: message); } -/// An abstract wrapper around the notifications plugin. +/// The notifications service. /// /// There are two types of notifications: local notifications, and push /// notifications. Local notifications are sent by the app itself, and @@ -73,66 +41,27 @@ class Notification { /// /// Local notifications can be customized to appear differently depending on /// the type of notification and platform. They can also be scheduled to appear -/// at certain times. This is based on [FlutterLocalNotificationsPlugin]. +/// at certain times. /// /// Currently, Web is not supported. -class Notifications extends Service { - final _plugin = FlutterLocalNotificationsPlugin(); - String timezoneName; - Location location; - - @override - Future init() async { - await _plugin.initialize( - const InitializationSettings( - android: AndroidInitializationSettings( - "@mipmap/bright_yellow" // default icon of app - ), - iOS: IOSInitializationSettings(), // defaults are good - ) - ); - initializeTimeZones(); - timezoneName = await FlutterNativeTimezone.getLocalTimezone(); - location = getLocation(timezoneName); - } - - @override - Future signIn() async {} +abstract class Notifications extends Service { + /// The singleton instance for this service. + static Notifications instance = notifications; /// Sends a notification immediately. - void sendNotification(Notification notification) => _plugin.show( - notification.id, - notification.title, - notification.message, - notification.details, - ); + void sendNotification(Notification notification); /// Schedules a notification for [date]. /// - /// If [date] is in the past, the notification will go off immediately. + /// [date] must not be in the past. void scheduleNotification({ @required Notification notification, - @required DateTime date, - }) => _plugin.zonedSchedule( - notification.id, - notification.title, - notification.message, - TZDateTime.from(date, location), - notification.details, - androidAllowWhileIdle: true, - uiLocalNotificationDateInterpretation: - UILocalNotificationDateInterpretation.wallClockTime, - ); + @required DateTime date + }); - /// Cancels all scheduled notifications, as well as - /// dismissing all present notifications. - void cancelAll() => _plugin.cancelAll(); + /// Cancels all notifications. + void cancelAll(); - Future> get pendingNotifications async => [ - for ( - final PendingNotificationRequest request in - await _plugin.pendingNotificationRequests() - ) - request.title - ]; + /// Notifications that are pending delivery. + Future> get pendingNotifications; } diff --git a/lib/src/services/notifications/mobile.dart b/lib/src/services/notifications/mobile.dart index 9eed17103..35843cd8f 100644 --- a/lib/src/services/notifications/mobile.dart +++ b/lib/src/services/notifications/mobile.dart @@ -1,288 +1,133 @@ import "package:flutter_local_notifications/flutter_local_notifications.dart"; -import "package:flutter/material.dart" show Color, required, immutable; +import "package:meta/meta.dart"; +import "package:timezone/timezone.dart"; +import "package:timezone/data/latest.dart"; +import "package:flutter_native_timezone/flutter_native_timezone.dart"; import "package:ramaz/constants.dart"; -/// The style of the notification. -/// -/// Only applies to Android. -enum AndroidNotificationType { - /// A message notification from another person. - /// - /// This can be used for lost and found notifications. - message, +import "../notifications.dart"; - /// A notification that contains an image. - /// - /// This can be used for the first post of lost and found notifications - /// that contain an image of the lost object. - image, +/// Creates a reminders notification using [MobileNotification.reminder]. +Notification getReminderNotification({ + @required String title, + @required String message, +}) => MobileNotification.reminder(title: title, message: message); - /// A default notification with just text. - normal, -} +/// The mobile implementation of the [Notifications] service. +Notifications get notifications => MobileNotifications(); -/// Maps the abstract [AndroidNotificationType] to [AndroidNotificationStyle]s. +/// The mobile version of a notification. /// -/// This is done so other libraries that import this module do not need to -/// import `flutter_local_notifications`. -const Map< - AndroidNotificationType, - AndroidNotificationStyle -> androidNotificationTypes = { - AndroidNotificationType.message: AndroidNotificationStyle.Messaging, - AndroidNotificationType.image: AndroidNotificationStyle.BigPicture, - AndroidNotificationType.normal: AndroidNotificationStyle.Default, -}; - -/// A notification configuration for Android. -/// -/// This should be used instead of [AndroidNotificationDetails] so that other -/// other libraries can import this module without importing the plugin. -@immutable -class AndroidNotification { - /// The importance of this notification. - /// - /// An importance level for Android 8+ - final Importance importance; - - /// The priority of this notification. - /// - /// An importance level for Android 7.1 and lower. - final Priority priority; - - /// The type of this notification. - final AndroidNotificationType style; - - /// The style of this notification. - /// - /// This can be used to customize notifications about messages - /// and notifications that contain images. - final StyleInformation styleInfo; - - /// The color of this notification. - /// - /// Should relate to the app's branding colors. - final Color color; - - /// The ID of this notification's channel. - final String channelId; - - /// The name of this notification's channel. - final String channelName; - - /// The description of this notification's channel. - final String channelDescription; - - /// The icon for this notification. - /// - /// Defaults to the default app icon, but can be customized. - final String icon; - - /// The group ID for this notification. - /// - /// All notifications with the same group ID are bundled together. - final String groupId; - - /// Whether this notification should play sound. - final bool playSound; - - /// Whether this notification should vibrate the device. - final bool shouldVibrate; - - /// Whether this is the header of a group. - final bool isGroupSummary; - - /// Whether this notification's channel should cause the home screen - /// to show a badge on the app's icon. - final bool showChannelBadge; - - /// Whether this notification should cause the device's LED to blink. - final bool showLight; - - /// A const constructor for this class. - const AndroidNotification({ - @required this.importance, - @required this.priority, - @required this.style, - @required this.color, - @required this.channelId, - @required this.channelName, - @required this.channelDescription, - @required this.groupId, - @required this.playSound, - @required this.shouldVibrate, - @required this.isGroupSummary, - @required this.showChannelBadge, - @required this.showLight, - this.icon, - this.styleInfo, - }); - - /// An optimal Android notification configuration for reminders. - /// - /// If [root] is true, the notification is considered the group - /// "summary", which is like a header for notifications. - const AndroidNotification.reminder({bool root = false}) : - importance = Importance.High, - priority = Priority.High, - style = AndroidNotificationType.normal, - color = RamazColors.blue, - channelId = "reminders", - channelName = "Reminders", - channelDescription = "When reminders are due.", - groupId = "reminders", - playSound = true, - shouldVibrate = true, - isGroupSummary = root, - showChannelBadge = true, - icon = null, - styleInfo = null, - showLight = true; - - /// Exposes the AndroidNotificationDetails for this notification. - AndroidNotificationDetails get details => AndroidNotificationDetails( - channelId, - channelName, - channelDescription, - icon: icon, - importance: importance, - priority: priority, - style: androidNotificationTypes [style], - styleInformation: styleInfo, - playSound: playSound, - enableVibration: shouldVibrate, - groupKey: groupId, - setAsGroupSummary: isGroupSummary, - groupAlertBehavior: GroupAlertBehavior.All, - autoCancel: true, - ongoing: false, - color: color, - onlyAlertOnce: true, - channelShowBadge: showChannelBadge, - enableLights: showLight, - ledColor: color, - ledOnMs: 1000, - ledOffMs: 5000, +/// A [MobileNotification] has a [NotificationDetails] to control how the +/// notification appears on the device. +class MobileNotification extends Notification { + /// Describes how a reminders notification should look. + static NotificationDetails reminderDetails = const NotificationDetails( + android: AndroidNotificationDetails( + "reminders", + "Reminders", + "When reminders are due.", + importance: Importance.high, + priority: Priority.high, + color: RamazColors.blue, + groupKey: "reminders", + playSound: true, + enableVibration: true, + setAsGroupSummary: false, + channelShowBadge: true, + icon: null, + styleInformation: null, + enableLights: true, + ), + iOS: IOSNotificationDetails( + presentBadge: true, + presentSound: true + ) ); -} - -/// A notification configuration for iOS. -/// -/// This should be used instead of [IOSNotificationDetails] so that other -/// other libraries can import this module without importing the plugin. -@immutable -class IOSNotification { - /// An optimal [IOSNotification] for reminders. - static const IOSNotification reminder = IOSNotification( - showBadge: true, - playSound: true - ); - - /// Whether this notification should cause the device's home screen - /// to show a badge on this notification's icon. - final bool showBadge; - - /// Whether this notification should cause the device to play a sound. - final bool playSound; - - /// A const constructor for this class. - const IOSNotification({ - @required this.showBadge, - @required this.playSound - }); - - /// The [IOSNotificationDetails] for this notification. - IOSNotificationDetails get details => IOSNotificationDetails( - presentAlert: true, - presentSound: playSound, - presentBadge: showBadge, - ); -} - -/// A platform-agnostic notification. -/// -/// An [AndroidNotification] and an [IOSNotification] needs to be provided. -@immutable -class Notification { - /// The ID of this notification. - /// - /// The ID is used for cancelling the notifications. - final int id = 0; - - /// The title of this notification. - final String title; - - /// The body of this notification. - final String message; /// The platform-agnostic [NotificationDetails] for this class. final NotificationDetails details; - /// Returns a new [Notification]. - /// - /// [android] and [ios] are used to make [details]. - Notification({ - @required this.title, - @required this.message, - @required AndroidNotification android, - @required IOSNotification ios, - }) : details = NotificationDetails( - android.details, ios.details, - ); + /// Creates a new [Notification]. + const MobileNotification({ + @required String title, + @required String message, + @required this.details, + }) : super(title: title, message: message); /// The optimal configuration for a reminder notification. - Notification.reminder({ - @required this.title, - @required this.message, - bool root = false + MobileNotification.reminder({ + @required String title, + @required String message, }) : - details = NotificationDetails( - AndroidNotification.reminder(root: root).details, - IOSNotification.reminder.details, - ); + details = reminderDetails, + super(title: title, message: message); } -// ignore: avoid_classes_with_only_static_members -/// An abstract wrapper around the notifications plugin. -/// -/// This class uses static methods to send and schedule -/// notifications. -class Notifications { - static final _plugin = FlutterLocalNotificationsPlugin() - ..initialize( +/// The mobile implementation of the notifications service. +class MobileNotifications extends Notifications { + /// The plugin on mobile. + final plugin = FlutterLocalNotificationsPlugin(); + + /// The location this device is in. + String timezoneName; + + /// The location (and timezones) this device is in. + Location location; + + @override + Future init() async { + await plugin.initialize( const InitializationSettings( - AndroidInitializationSettings( + android: AndroidInitializationSettings( "@mipmap/bright_yellow" // default icon of app ), - IOSInitializationSettings(), // defaults are good + iOS: IOSInitializationSettings(), // defaults are good ) ); - - /// Sends a notification immediately. - static void sendNotification(Notification notification) => _plugin.show( + initializeTimeZones(); + timezoneName = await FlutterNativeTimezone.getLocalTimezone(); + location = getLocation(timezoneName); + } + + @override + Future signIn() async {} + + @override + void sendNotification( + covariant MobileNotification notification + ) => plugin.show( notification.id, notification.title, notification.message, notification.details, ); - /// Schedules a notification for [date]. - /// - /// If [date] is in the past, the notification will go off immediately. - static void scheduleNotification({ - @required Notification notification, + @override + void scheduleNotification({ + @required covariant MobileNotification notification, @required DateTime date, - }) => _plugin.schedule( + }) => plugin.zonedSchedule( notification.id, notification.title, notification.message, - date, + TZDateTime.from(date, location), notification.details, androidAllowWhileIdle: true, + uiLocalNotificationDateInterpretation: + UILocalNotificationDateInterpretation.wallClockTime, ); - /// Cancels all scheduled notifications, as well as - /// dismissing all present notifications. - static void cancelAll() => _plugin.cancelAll(); + @override + void cancelAll() => plugin.cancelAll(); + + @override + Future> get pendingNotifications async => [ + for ( + final PendingNotificationRequest request in + await plugin.pendingNotificationRequests() + ) + request.title + ]; } diff --git a/lib/src/services/notifications/stub.dart b/lib/src/services/notifications/stub.dart index bf2489518..80c6dc207 100644 --- a/lib/src/services/notifications/stub.dart +++ b/lib/src/services/notifications/stub.dart @@ -1,39 +1,39 @@ -// ignore_for_file: avoid_unused_constructor_parameters -// ignore_for_file: public_member_api_docs -class Notification { - Notification({ - dynamic title, - dynamic message, - dynamic android, - dynamic ios, - }); - - /// The optimal configuration for a reminder notification. - Notification.reminder({ - dynamic title, - dynamic message, - bool root = false - }); -} +import "package:meta/meta.dart"; + +import "../notifications.dart"; + +/// The web implementation of a reminders notification. +/// +/// Notifications are not yet supported on web. +Notification getReminderNotification({ + @required String title, + @required String message, +}) => null; + +/// The web implementation of the [Notifications] service. +/// +/// Notifications are not yet supported on web. +Notifications get notifications => StubNotifications(); -// ignore: avoid_classes_with_only_static_members -/// An abstract wrapper around the notifications plugin. +/// The notifications service for the web. /// -/// This class uses static methods to send and schedule -/// notifications. -class Notifications { - /// Sends a notification immediately. - static void sendNotification(Notification notification) {} - - /// Schedules a notification for [date]. - /// - /// If [date] is in the past, the notification will go off immediately. - static void scheduleNotification({ - Notification notification, - DateTime date, - }) {} - - /// Cancels all scheduled notifications, as well as - /// dismissing all present notifications. - static void cancelAll() {} +/// Notifications are not yet supported on web. +class StubNotifications extends Notifications { + @override + Future init() async {} + + @override + Future signIn() async {} + + @override + void sendNotification(Notification notification) {} + + @override + void scheduleNotification({Notification notification, DateTime date}) {} + + @override + void cancelAll() {} + + @override + Future> get pendingNotifications async => []; } From bea4180b8244a2c51aa8c39a475fa4659f6d1e73 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 16:16:13 -0400 Subject: [PATCH 076/251] Config iOS version to be dependent on pubspec.yaml --- ios/Runner/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 31c71b3b5..03394fc14 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.2 + $(FLUTTER_BUILD_NAME) CFBundleSignature ???? CFBundleURLTypes @@ -30,7 +30,7 @@ CFBundleVersion - 19 + $(FLUTTER_BUILD_NUMBER) ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS From cfaa369a0240007f90c63b54f68d62aab5fdab9f Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 16:34:59 -0400 Subject: [PATCH 077/251] Fixed some bugs on the web app --- lib/src/models/data/schedule.dart | 4 +--- lib/src/services/local_db.dart | 11 ++++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index b5ae75767..a3f1c10ed 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -55,9 +55,7 @@ class Schedule extends Model { reminders = Models.instance.reminders ..addListener(remindersListener); user = Models.instance.user.data; - subjects = Subject.getSubjects( - await Services.instance.database.getSections(user.sectionIDs) - ); + subjects = Models.instance.user.subjects; await initCalendar(); } diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index 9188bd9a6..725c3b1f8 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -11,7 +11,8 @@ extension ObjectStoreExtension on idb.ObjectStore { /// Gets the data at the key in this object store. /// /// This extension provides type safety. - Future get(dynamic key) async => await getObject(key) as T; + Future> get(dynamic key) async => + Map.from(await getObject(key)); } /// Provides convenience methods on a [Database]. @@ -19,10 +20,10 @@ extension DatabaseExtension on idb.Database { /// Gets data at a key in an object store. /// /// This code handles transactions so other code doesn't have to. - Future get(String storeName, dynamic key) => + Future> get(String storeName, dynamic key) => transaction(storeName, idb.idbModeReadOnly) .objectStore(storeName) - .get(key); + .get(key); /// Adds data at a key to an object store. /// @@ -176,8 +177,8 @@ class LocalDatabase extends Database { } @override - Future> getCalendarMonth(int month) => - database.get(calendarStoreName, month); + Future> getCalendarMonth(int month) async => + Map.from(await database.get(calendarStoreName, month)); @override Future setCalendar(int month, Map json) async { From 4829eac1f6aa5d45f9ec0ca0378fd005dad9ec91 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 17:25:27 -0400 Subject: [PATCH 078/251] Converted ObjectStoreExtension.get to Map get isSignedIn async => Auth.isSignedIn; + bool get isSignedIn => Auth.isSignedIn; @override Future signOut() => Auth.signOut(); diff --git a/lib/src/services/database.dart b/lib/src/services/database.dart index 53d5b7190..7e4e61594 100644 --- a/lib/src/services/database.dart +++ b/lib/src/services/database.dart @@ -25,9 +25,8 @@ abstract class Database extends Service { /// Determines whether the user is signed in. /// /// From all the services, a [Database] is the only one that can, and is - /// expected to, know whether the user is signed in. The implementation - /// is up to the database itself, but it's allowed to be asynchronous. - Future get isSignedIn; + /// expected to, know whether the user is signed in. + bool get isSignedIn; /// Signs the user out of the app. /// diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart index 1705236f5..223b83caa 100644 --- a/lib/src/services/databases.dart +++ b/lib/src/services/databases.dart @@ -56,8 +56,8 @@ class Databases extends Database { } @override - Future get isSignedIn async => - (await cloudDatabase.isSignedIn) && (await localDatabase.isSignedIn); + bool get isSignedIn => + cloudDatabase.isSignedIn && localDatabase.isSignedIn; @override Future signOut() async { diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index 725c3b1f8..2f688348a 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -146,7 +146,7 @@ class LocalDatabase extends Database { Future signIn() async {} @override - Future get isSignedIn async => true; + bool get isSignedIn => true; @override Future signOut() async { From 6085a104837e96ba545c0fb9f68755bfca4bbd71 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 28 Oct 2020 17:25:44 -0400 Subject: [PATCH 079/251] Refactored main to rely on SplashPage --- lib/main.dart | 90 ++++++++++++--------------------------- lib/src/pages/splash.dart | 89 +++++++++++++++++++++++++++++--------- 2 files changed, 97 insertions(+), 82 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 97949b558..70b35a240 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,71 +1,37 @@ -import "dart:async" show runZoned; - import "package:flutter/material.dart"; -import "package:flutter/foundation.dart" show kDebugMode; import "package:flutter/services.dart"; import "package:ramaz/constants.dart"; // for route keys -import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/services.dart"; import "package:ramaz/widgets.dart" show ThemeChanger; -Future main({bool restart = false}) async { - // This shows a splash screen but secretly - // determines the desired `platformBrightness` - Brightness brightness; - runApp( - SplashScreen( - setBrightness: - (Brightness platform) => brightness = platform - ) - ); - await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); +void main({bool restart = false}) => runApp(const RamazApp()); - // This initializes services -- it is always safe. - await Services.instance.init(); - final Crashlytics crashlytics = Services.instance.crashlytics; - final bool isSignedIn = await Services.instance.database.isSignedIn; - try { - if (isSignedIn) { - // This initializes data models -- it may error. - await Models.instance.init(); - } - // We want to at least try again on ANY error. - // ignore: avoid_catches_without_on_clauses - } catch (_) { - debugPrint("Error on main."); - if (!restart) { - debugPrint("Trying again..."); - await Services.instance.database.signOut(); - return main(restart: true); - } else { - rethrow; - } - } +class ErrorPage extends StatelessWidget { + final dynamic error; + final VoidCallback restart; - // Determine the appropriate brightness. - final bool savedBrightness = Services.instance.prefs.brightness; - if (savedBrightness != null) { - brightness = savedBrightness - ? Brightness.light - : Brightness.dark; - } + const ErrorPage(this.error, this.restart); - // Turns Crashlyitcs off in debug mode. - await crashlytics.toggle(!kDebugMode); - - // Now we are ready to run the app (with error catching) - FlutterError.onError = crashlytics.recordFlutterError; - runZoned( - () => runApp ( - RamazApp ( - isSignedIn: isSignedIn, - brightness: brightness, + @override + Widget build(BuildContext context) { + Future(() => throw error); + return MaterialApp( + home: Scaffold( + appBar: AppBar(title: const Text("Error")), + body: Center( + child: Text( + "The app is corrupted and cannot start. Make sure your app " + "is updated and try again.\n\nThe error is: $error\n${error.stackTrace}" + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: restart, + child: const Icon(Icons.refresh), ) - ), - onError: crashlytics.recordError, - ); + ) + );} } /// The main app widget. @@ -75,18 +41,14 @@ class RamazApp extends StatelessWidget { /// This was already determined using [Services] in [main]. final bool isSignedIn; - /// The brightness to default to. - final Brightness brightness; - /// Creates the main app widget. const RamazApp ({ - @required this.brightness, - @required this.isSignedIn, + this.isSignedIn, }); @override Widget build (BuildContext context) => ThemeChanger( - defaultBrightness: brightness, + defaultBrightness: null, light: ThemeData ( brightness: Brightness.light, primarySwatch: Colors.blue, @@ -133,7 +95,9 @@ class RamazApp extends StatelessWidget { ), ), builder: (BuildContext context, ThemeData theme) => MaterialApp ( - home: isSignedIn ? HomePage() : Login(), + home: isSignedIn == null + ? SplashScreen() + : isSignedIn ? HomePage() : Login(), title: "Ram Life", color: RamazColors.blue, theme: theme, diff --git a/lib/src/pages/splash.dart b/lib/src/pages/splash.dart index adad8e20f..82913fd45 100644 --- a/lib/src/pages/splash.dart +++ b/lib/src/pages/splash.dart @@ -1,29 +1,80 @@ // ignore_for_file: prefer_const_constructors_in_immutables +import "dart:async"; import "package:flutter/material.dart"; +import "package:flutter/foundation.dart" show kDebugMode; +import "package:flutter/services.dart"; +import "package:ramaz/services.dart"; +import "package:ramaz/models.dart"; import "package:ramaz/widgets.dart"; +import "package:ramaz/main.dart"; /// A splash screen that discreetly loads the device's brightness. -class SplashScreen extends StatelessWidget { - /// A callback for when the device's brightness is determined. - final void Function(Brightness) setBrightness; - - /// Creates a splash screen. - const SplashScreen({this.setBrightness}); - - @override Widget build (BuildContext context) => MaterialApp ( - home: Scaffold ( - body: Builder ( - builder: (BuildContext context) { - Future ( - () => setBrightness( - MediaQuery.of(context).platformBrightness - ) - ); - return const Center(child: RamazLogos.ramSquareWords); +class SplashScreen extends StatefulWidget { + @override + SplashScreenState createState() => SplashScreenState(); +} + +class SplashScreenState extends State { + Brightness brightness; + bool isSignedIn; + bool firstTry = true; + + @override + void initState() { + super.initState(); + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + init(); + } + + Future init() async { + await initServices(); + if (isSignedIn) { + try { + await Models.instance.init(); + } catch(error) { // ignore: avoid_catches_without_on_clauses + debugPrint("[SplashScreenState.init]: Error loading data"); + if (!firstTry && !kDebugMode) { + debugPrint(" Wiping data and trying again"); + await Services.instance.database.signOut(); + firstTry = false; + return init(); + } else { + // TODO: open error page. } - ) - ) + } + } + await launchApp(); + } + + Future initServices() async { + // This initializes services -- it is always safe. + await Services.instance.init(); + isSignedIn = Services.instance.database.isSignedIn; + } + + Future launchApp() async { + final bool isLightMode = Services.instance.prefs.brightness; + final Brightness brightness = isLightMode == null + ? MediaQuery.of(context).platformBrightness + : isLightMode ? Brightness.light : Brightness.dark; + final Crashlytics crashlytics = Services.instance.crashlytics; + await crashlytics.toggle(!kDebugMode); + FlutterError.onError = crashlytics.recordFlutterError; + ThemeChanger.of(context).brightness = brightness; + runZonedGuarded( + () => runApp( + RamazApp( + isSignedIn: isSignedIn, + ) + ), + crashlytics.recordError, + ); + } + + @override + Widget build (BuildContext context) => const Scaffold( + body: Center(child: RamazLogos.ramSquareWords) ); } \ No newline at end of file From 96a9880b0df5868156c643ae27697e4ae909faf1 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 29 Oct 2020 15:41:04 -0400 Subject: [PATCH 080/251] Prioritized brightness in SplashScreen --- lib/src/pages/splash.dart | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/src/pages/splash.dart b/lib/src/pages/splash.dart index 82913fd45..c12ba2da3 100644 --- a/lib/src/pages/splash.dart +++ b/lib/src/pages/splash.dart @@ -30,6 +30,7 @@ class SplashScreenState extends State { Future init() async { await initServices(); + initBrightness(); if (isSignedIn) { try { await Models.instance.init(); @@ -48,6 +49,14 @@ class SplashScreenState extends State { await launchApp(); } + void initBrightness() { + final bool isLightMode = Services.instance.prefs.brightness; + final Brightness brightness = isLightMode == null + ? MediaQuery.of(context).platformBrightness + : isLightMode ? Brightness.light : Brightness.dark; + ThemeChanger.of(context).brightness = brightness; + } + Future initServices() async { // This initializes services -- it is always safe. await Services.instance.init(); @@ -55,14 +64,9 @@ class SplashScreenState extends State { } Future launchApp() async { - final bool isLightMode = Services.instance.prefs.brightness; - final Brightness brightness = isLightMode == null - ? MediaQuery.of(context).platformBrightness - : isLightMode ? Brightness.light : Brightness.dark; final Crashlytics crashlytics = Services.instance.crashlytics; await crashlytics.toggle(!kDebugMode); FlutterError.onError = crashlytics.recordFlutterError; - ThemeChanger.of(context).brightness = brightness; runZonedGuarded( () => runApp( RamazApp( From 2b61d466a9c4a9eab168e3b567b6a90b155aa277 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 29 Oct 2020 15:41:30 -0400 Subject: [PATCH 081/251] Fixed bug where LocalDatabase fails on null value --- lib/src/services/local_db.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index 2f688348a..90ee975f9 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -11,8 +11,11 @@ extension ObjectStoreExtension on idb.ObjectStore { /// Gets the data at the key in this object store. /// /// This extension provides type safety. - Future> get(dynamic key) async => - Map.from(await getObject(key)); + Future> get(dynamic key) async { + final dynamic result = await getObject(key); + return result == null ? null : + Map.from(result); + } } /// Provides convenience methods on a [Database]. From 2c7013c049f26f15d29c10778a017af46a703247 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 29 Oct 2020 17:25:23 -0400 Subject: [PATCH 082/251] Refactored SplashPage --- lib/app.dart | 85 ++++++++++++++++++++++++++++ lib/main.dart | 116 +------------------------------------- lib/src/pages/splash.dart | 67 +++++++++++++++++++--- 3 files changed, 147 insertions(+), 121 deletions(-) create mode 100644 lib/app.dart diff --git a/lib/app.dart b/lib/app.dart new file mode 100644 index 000000000..067b7c5f6 --- /dev/null +++ b/lib/app.dart @@ -0,0 +1,85 @@ +import "package:flutter/material.dart"; + +import "package:ramaz/constants.dart"; +import "package:ramaz/pages.dart"; +import "package:ramaz/widgets.dart"; + +/// The main app widget. +class RamazApp extends StatelessWidget { + /// Whether the user is already signed in. + final bool isSignedIn; + + /// Creates the main app widget. + const RamazApp ({ + this.isSignedIn, + }); + + @override + Widget build (BuildContext context) => ThemeChanger( + defaultBrightness: null, + light: ThemeData ( + brightness: Brightness.light, + primarySwatch: Colors.blue, + primaryColor: RamazColors.blue, + primaryColorBrightness: Brightness.dark, + primaryColorLight: RamazColors.blueLight, + primaryColorDark: RamazColors.blueDark, + accentColor: RamazColors.gold, + accentColorBrightness: Brightness.light, + cursorColor: RamazColors.blueLight, + textSelectionHandleColor: RamazColors.blueLight, + buttonColor: RamazColors.gold, + buttonTheme: const ButtonThemeData ( + buttonColor: RamazColors.gold, + textTheme: ButtonTextTheme.normal, + ), + ), + dark: ThemeData( + brightness: Brightness.dark, + scaffoldBackgroundColor: Colors.grey[850], + primarySwatch: Colors.blue, + primaryColorBrightness: Brightness.dark, + primaryColorLight: RamazColors.blueLight, + primaryColorDark: RamazColors.blueDark, + accentColor: RamazColors.goldDark, + accentColorBrightness: Brightness.light, + iconTheme: const IconThemeData (color: RamazColors.goldDark), + primaryIconTheme: const IconThemeData (color: RamazColors.goldDark), + accentIconTheme: const IconThemeData (color: RamazColors.goldDark), + floatingActionButtonTheme: const FloatingActionButtonThemeData( + backgroundColor: RamazColors.goldDark, + foregroundColor: RamazColors.blue + ), + cursorColor: RamazColors.blueLight, + textSelectionHandleColor: RamazColors.blueLight, + cardTheme: CardTheme ( + color: Colors.grey[820] + ), + toggleableActiveColor: RamazColors.blueLight, + buttonColor: RamazColors.blueDark, + buttonTheme: const ButtonThemeData ( + buttonColor: RamazColors.blueDark, + textTheme: ButtonTextTheme.accent, + ), + ), + builder: (BuildContext context, ThemeData theme) => MaterialApp ( + home: isSignedIn == null + ? SplashScreen() + : isSignedIn ? HomePage() : Login(), + title: "Ram Life", + color: RamazColors.blue, + theme: theme, + routes: { + Routes.login: (_) => Login(), + Routes.home: (_) => HomePage(), + Routes.schedule: (_) => SchedulePage(), + Routes.reminders: (_) => RemindersPage(), + Routes.feedback: (_) => FeedbackPage(), + Routes.calendar: (_) => CalendarPage(), + Routes.specials: (_) => SpecialPage(), + Routes.admin: (_) => AdminHomePage(), + Routes.sports: (_) => SportsPage(), + } + ) + ); +} diff --git a/lib/main.dart b/lib/main.dart index 70b35a240..264f74573 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,117 +1,5 @@ import "package:flutter/material.dart"; -import "package:flutter/services.dart"; -import "package:ramaz/constants.dart"; // for route keys -import "package:ramaz/pages.dart"; -import "package:ramaz/services.dart"; -import "package:ramaz/widgets.dart" show ThemeChanger; +import "app.dart"; -void main({bool restart = false}) => runApp(const RamazApp()); - -class ErrorPage extends StatelessWidget { - final dynamic error; - final VoidCallback restart; - - const ErrorPage(this.error, this.restart); - - @override - Widget build(BuildContext context) { - Future(() => throw error); - return MaterialApp( - home: Scaffold( - appBar: AppBar(title: const Text("Error")), - body: Center( - child: Text( - "The app is corrupted and cannot start. Make sure your app " - "is updated and try again.\n\nThe error is: $error\n${error.stackTrace}" - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: restart, - child: const Icon(Icons.refresh), - ) - ) - );} -} - -/// The main app widget. -class RamazApp extends StatelessWidget { - /// Whether the user is already signed in. - /// - /// This was already determined using [Services] in [main]. - final bool isSignedIn; - - /// Creates the main app widget. - const RamazApp ({ - this.isSignedIn, - }); - - @override - Widget build (BuildContext context) => ThemeChanger( - defaultBrightness: null, - light: ThemeData ( - brightness: Brightness.light, - primarySwatch: Colors.blue, - primaryColor: RamazColors.blue, - primaryColorBrightness: Brightness.dark, - primaryColorLight: RamazColors.blueLight, - primaryColorDark: RamazColors.blueDark, - accentColor: RamazColors.gold, - accentColorBrightness: Brightness.light, - cursorColor: RamazColors.blueLight, - textSelectionHandleColor: RamazColors.blueLight, - buttonColor: RamazColors.gold, - buttonTheme: const ButtonThemeData ( - buttonColor: RamazColors.gold, - textTheme: ButtonTextTheme.normal, - ), - ), - dark: ThemeData( - brightness: Brightness.dark, - scaffoldBackgroundColor: Colors.grey[850], - primarySwatch: Colors.blue, - primaryColorBrightness: Brightness.dark, - primaryColorLight: RamazColors.blueLight, - primaryColorDark: RamazColors.blueDark, - accentColor: RamazColors.goldDark, - accentColorBrightness: Brightness.light, - iconTheme: const IconThemeData (color: RamazColors.goldDark), - primaryIconTheme: const IconThemeData (color: RamazColors.goldDark), - accentIconTheme: const IconThemeData (color: RamazColors.goldDark), - floatingActionButtonTheme: const FloatingActionButtonThemeData( - backgroundColor: RamazColors.goldDark, - foregroundColor: RamazColors.blue - ), - cursorColor: RamazColors.blueLight, - textSelectionHandleColor: RamazColors.blueLight, - cardTheme: CardTheme ( - color: Colors.grey[820] - ), - toggleableActiveColor: RamazColors.blueLight, - buttonColor: RamazColors.blueDark, - buttonTheme: const ButtonThemeData ( - buttonColor: RamazColors.blueDark, - textTheme: ButtonTextTheme.accent, - ), - ), - builder: (BuildContext context, ThemeData theme) => MaterialApp ( - home: isSignedIn == null - ? SplashScreen() - : isSignedIn ? HomePage() : Login(), - title: "Ram Life", - color: RamazColors.blue, - theme: theme, - routes: { - Routes.login: (_) => Login(), - Routes.home: (_) => HomePage(), - Routes.schedule: (_) => SchedulePage(), - Routes.reminders: (_) => RemindersPage(), - Routes.feedback: (_) => FeedbackPage(), - Routes.calendar: (_) => CalendarPage(), - Routes.specials: (_) => SpecialPage(), - Routes.admin: (_) => AdminHomePage(), - Routes.sports: (_) => SportsPage(), - } - ) - ); -} +void main() => runApp(const RamazApp()); diff --git a/lib/src/pages/splash.dart b/lib/src/pages/splash.dart index c12ba2da3..9d81fa86f 100644 --- a/lib/src/pages/splash.dart +++ b/lib/src/pages/splash.dart @@ -5,10 +5,10 @@ import "package:flutter/material.dart"; import "package:flutter/foundation.dart" show kDebugMode; import "package:flutter/services.dart"; -import "package:ramaz/services.dart"; +import "package:ramaz/app.dart"; import "package:ramaz/models.dart"; +import "package:ramaz/services.dart"; import "package:ramaz/widgets.dart"; -import "package:ramaz/main.dart"; /// A splash screen that discreetly loads the device's brightness. class SplashScreen extends StatefulWidget { @@ -17,9 +17,13 @@ class SplashScreen extends StatefulWidget { } class SplashScreenState extends State { + bool firstTry = true; + bool hasError = false; + Brightness brightness; bool isSignedIn; - bool firstTry = true; + bool isLoading = false; + String error; @override void initState() { @@ -34,7 +38,7 @@ class SplashScreenState extends State { if (isSignedIn) { try { await Models.instance.init(); - } catch(error) { // ignore: avoid_catches_without_on_clauses + } catch (code, stack) { // ignore: avoid_catches_without_on_clauses debugPrint("[SplashScreenState.init]: Error loading data"); if (!firstTry && !kDebugMode) { debugPrint(" Wiping data and trying again"); @@ -42,7 +46,12 @@ class SplashScreenState extends State { firstTry = false; return init(); } else { - // TODO: open error page. + setState(() { + isLoading = false; + hasError = true; + error = "$code\n$stack"; + }); + rethrow; } } } @@ -78,7 +87,51 @@ class SplashScreenState extends State { } @override - Widget build (BuildContext context) => const Scaffold( - body: Center(child: RamazLogos.ramSquareWords) + Widget build (BuildContext context) => Scaffold( + body: !hasError + ? const Center(child: RamazLogos.ramSquareWords) + : Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + children: [ + if (isLoading) + const LinearProgressIndicator(), + const Spacer(flex: 5), + Text( + "RamLife is having difficulties starting. Make sure your app " + "is updated and try again.", + style: Theme.of(context).textTheme.headline4, + textAlign: TextAlign.center, + ), + const Spacer(flex: 2), + OutlineButton( + onPressed: () async { + setState(() => isLoading = true); + await Services.instance.database.signOut(); + await init(); + }, + child: const Text("Reset"), + ), + const Spacer(flex: 1), + Text( + "The exact error is below", + style: Theme.of(context).textTheme.subtitle1, + ), + const SizedBox(height: 30), + SizedBox( + height: 200, + child: SingleChildScrollView( + child: Text( + error, + style: Theme.of(context).textTheme.caption.copyWith( + color: Theme.of(context).colorScheme.error, + ), + ), + ), + ), + const Spacer(flex: 3), + ] + ) + ) ); } \ No newline at end of file From 210b60969f3fc40075c8cf1303417a3f3cde96b2 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 29 Oct 2020 17:25:58 -0400 Subject: [PATCH 083/251] Detect downgrades in LocalDatabase --- lib/src/services/local_db.dart | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index 90ee975f9..f28629739 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -133,17 +133,24 @@ class LocalDatabase extends Database { ..createObjectStore(sportsStoreName, autoIncrement: true); @override - Future init() async => database = await (await idbFactory).open( - "ramaz.db", - version: 1, - onUpgradeNeeded: (idb.VersionChangeEvent event) { - switch (event.oldVersion) { - case 0: // fresh install - createObjectStores(event.database); - break; - } + Future init() async { + try { + database = await (await idbFactory).open( + "ramaz.db", + version: 1, + onUpgradeNeeded: (idb.VersionChangeEvent event) { + switch (event.oldVersion) { + case 0: // fresh install + createObjectStores(event.database); + break; + } + } + ); + } on StateError { // ignore: avoid_catching_errors + await (await idbFactory).deleteDatabase("ramaz.db"); + await init(); } - ); + } @override Future signIn() async {} From 3007d1197b097790b90f087de94dd8f7c8c17ea6 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 2 Nov 2020 12:25:34 -0500 Subject: [PATCH 084/251] Organized reminders dataclasses into different files --- lib/src/data/reminder.dart | 214 +----------------- .../data/reminders/period_reminder_time.dart | 55 +++++ lib/src/data/reminders/reminder_time.dart | 117 ++++++++++ .../data/reminders/subject_reminder_time.dart | 45 ++++ 4 files changed, 224 insertions(+), 207 deletions(-) create mode 100644 lib/src/data/reminders/period_reminder_time.dart create mode 100644 lib/src/data/reminders/reminder_time.dart create mode 100644 lib/src/data/reminders/subject_reminder_time.dart diff --git a/lib/src/data/reminder.dart b/lib/src/data/reminder.dart index 58ca691f7..28e9c199f 100644 --- a/lib/src/data/reminder.dart +++ b/lib/src/data/reminder.dart @@ -1,213 +1,10 @@ -/// This library handles serialization and deserialization of reminders. -/// -/// Each reminder has a [Reminder.time] property, which is a [ReminderTime], -/// describing when said reminder should be displayed. Since reminders could -/// be shown on a specific class or period, the classes [PeriodReminderTime] -/// and [SubjectReminderTime] are used. -library reminder_dataclasses; - -import "dart:convert" show JsonUnsupportedObjectError; import "package:meta/meta.dart"; -/// An enum to decide when the reminder should appear. -/// -/// `period` means the reminder needs a Day name and a period (as [String]) -/// `subject` means the reminder needs a name of a class. -enum ReminderTimeType { - /// Whether the reminder should be displayed on a specific period. - period, - - /// Whether the reminder should be displayed on a specific subject. - subject -} - -/// Used to convert [ReminderTimeType] to JSON. -const Map reminderTimeToString = { - ReminderTimeType.period: "period", - ReminderTimeType.subject: "subject", -}; - -/// Used to convert JSON to [ReminderTimeType]. -const Map stringToReminderTime = { - "period": ReminderTimeType.period, - "subject": ReminderTimeType.subject, -}; - -/// A time that a reminder should show. -/// -/// Should be used for [Reminder.time]. -@immutable -abstract class ReminderTime { - /// The type of reminder. - /// - /// This field is here for other objects to use. - final ReminderTimeType type; - - /// Whether the reminder should repeat. - final bool repeats; - - /// Allows its subclasses to be `const`. - const ReminderTime({ - @required this.repeats, - @required this.type - }); - - /// Initializes a new instance from JSON. - /// - /// Mainly looks at `json ["type"]` to choose which type of - /// [ReminderTime] it should instantiate, and then leaves the - /// work to that subclass' `.fromJson` method. - /// - /// Example JSON: - /// ``` - /// { - /// "type": "period", - /// "repeats": false, - /// "period": "9", - /// "name": "Monday", - /// } - /// ``` - factory ReminderTime.fromJson(Map json) { - switch (stringToReminderTime [json ["type"]]) { - case ReminderTimeType.period: return PeriodReminderTime.fromJson(json); - case ReminderTimeType.subject: return SubjectReminderTime.fromJson(json); - default: throw JsonUnsupportedObjectError( - json, - cause: "Invalid time for reminder: $json" - ); - } - } - - /// Instantiates new [ReminderTime] with all possible parameters. - /// - /// Used for cases where the caller doesn't care about the [ReminderTimeType], - /// such as a UI reminder builder. - factory ReminderTime.fromType({ - @required ReminderTimeType type, - @required String dayName, - @required String period, - @required String name, - @required bool repeats, - }) { - switch (type) { - case ReminderTimeType.period: return PeriodReminderTime( - period: period, - dayName: dayName, - repeats: repeats, - ); case ReminderTimeType.subject: return SubjectReminderTime( - name: name, - repeats: repeats, - ); default: throw ArgumentError.notNull("type"); - } - } - - /// Returns this [ReminderTime] as JSON. - Map toJson(); +import "reminders/reminder_time.dart"; - /// Checks if the [Reminder] should be displayed. - /// - /// All possible parameters are required. - bool doesApply({ - @required String dayName, - @required String subject, - @required String period, - }); - - /// Returns a String representation of this [ReminderTime]. - /// - /// Used for debugging and throughout the UI. - @override - String toString(); -} - -/// A [ReminderTime] that depends on a name and period. -@immutable -class PeriodReminderTime extends ReminderTime { - /// The day for when this [Reminder] should be displayed. - final String dayName; - - /// The period when this [Reminder] should be displayed. - final String period; - - /// Returns a new [PeriodReminderTime]. - /// - /// All parameters must be non-null. - const PeriodReminderTime({ - @required this.dayName, - @required this.period, - @required bool repeats - }) : super (repeats: repeats, type: ReminderTimeType.period); - - /// Creates a new [ReminderTime] from JSON. - /// - /// `json ["dayName"]` should be one of the valid names. - /// - /// `json ["period"]` should be a valid period for that day, - /// notwithstanding any schedule changes (like an "early dismissal"). - PeriodReminderTime.fromJson(Map json) : - dayName = json ["dayName"], - period = json ["period"], - super (repeats: json ["repeats"], type: ReminderTimeType.period); - - @override - String toString() => - "${repeats ? 'Repeats every ' : ''}$dayName-$period"; - - @override - Map toJson() => { - "name": dayName, - "period": period, - "repeats": repeats, - "type": reminderTimeToString [type], - }; - - /// Returns true if [dayName] and [period] match this instance's fields. - @override - bool doesApply({ - @required String dayName, - @required String subject, - @required String period, - }) => dayName == this.dayName && period == this.period; -} - -/// A [ReminderTime] that depends on a subject. -@immutable -class SubjectReminderTime extends ReminderTime { - /// The name of the subject this [ReminderTime] depends on. - final String name; - - /// Returns a new [SubjectReminderTime]. All parameters must be non-null. - const SubjectReminderTime({ - @required this.name, - @required bool repeats, - }) : super (repeats: repeats, type: ReminderTimeType.subject); - - /// Returns a new [SubjectReminderTime] from a JSON object. - /// - /// The fields `repeats` and `name` must not be null. - SubjectReminderTime.fromJson(Map json) : - name = json ["name"], - super (repeats: json ["repeats"], type: ReminderTimeType.subject); - - @override - String toString() => (repeats ? "Repeats every " : "") + name; - - @override - Map toJson() => { - "name": name, - "repeats": repeats, - "type": reminderTimeToString [type], - }; - - /// Returns true if this instance's [subject] field - /// matches the `subject` parameter. - @override - bool doesApply({ - @required String dayName, - @required String subject, - @required String period, - }) => subject == name; -} +export "reminders/period_reminder_time.dart"; +export "reminders/reminder_time.dart"; +export "reminders/subject_reminder_time.dart"; /// A user-generated reminder. @immutable @@ -264,5 +61,8 @@ class Reminder { Map toJson() => { "message": message, "time": time.toJson(), + "hash": hash, }; + + String get hash => "$message-${time.hash}"; } diff --git a/lib/src/data/reminders/period_reminder_time.dart b/lib/src/data/reminders/period_reminder_time.dart new file mode 100644 index 000000000..b814e160e --- /dev/null +++ b/lib/src/data/reminders/period_reminder_time.dart @@ -0,0 +1,55 @@ +import "package:meta/meta.dart"; + +import "reminder_time.dart"; + +/// A [ReminderTime] that depends on a name and period. +class PeriodReminderTime extends ReminderTime { + /// The day for when this reminder should be displayed. + final String dayName; + + /// The period when this reminder should be displayed. + final String period; + + /// Returns a new [PeriodReminderTime]. + /// + /// All parameters must be non-null. + const PeriodReminderTime({ + @required this.dayName, + @required this.period, + @required bool repeats + }) : super (repeats: repeats, type: ReminderTimeType.period); + + /// Creates a new [ReminderTime] from JSON. + /// + /// `json ["dayName"]` should be one of the valid names. + /// + /// `json ["period"]` should be a valid period for that day, + /// notwithstanding any schedule changes (like an "early dismissal"). + PeriodReminderTime.fromJson(Map json) : + dayName = json ["dayName"], + period = json ["period"], + super (repeats: json ["repeats"], type: ReminderTimeType.period); + + @override + String toString() => + "${repeats ? 'Repeats every ' : ''}$dayName-$period"; + + @override + Map toJson() => { + "dayName": dayName, + "period": period, + "repeats": repeats, + "type": reminderTimeToString [type], + }; + + /// Returns true if [dayName] and [period] match this instance's fields. + @override + bool doesApply({ + @required String dayName, + @required String subject, + @required String period, + }) => dayName == this.dayName && period == this.period; + + @override + String get hash => "$dayName-$period-$repeats"; +} diff --git a/lib/src/data/reminders/reminder_time.dart b/lib/src/data/reminders/reminder_time.dart new file mode 100644 index 000000000..791ecc197 --- /dev/null +++ b/lib/src/data/reminders/reminder_time.dart @@ -0,0 +1,117 @@ +import "dart:convert"; + +import "package:meta/meta.dart"; + +import "period_reminder_time.dart"; +import "subject_reminder_time.dart"; + +/// An enum to decide when the reminder should appear. +/// +/// `period` means the reminder needs a Day name and a period (as [String]) +/// `subject` means the reminder needs a name of a class. +enum ReminderTimeType { + /// Whether the reminder should be displayed on a specific period. + period, + + /// Whether the reminder should be displayed on a specific subject. + subject +} + +/// Used to convert [ReminderTimeType] to JSON. +const Map reminderTimeToString = { + ReminderTimeType.period: "period", + ReminderTimeType.subject: "subject", +}; + +/// Used to convert JSON to [ReminderTimeType]. +const Map stringToReminderTime = { + "period": ReminderTimeType.period, + "subject": ReminderTimeType.subject, +}; + +/// A time that a reminder should show. +@immutable +abstract class ReminderTime { + /// The type of reminder. + /// + /// This field is here for other objects to use. + final ReminderTimeType type; + + /// Whether the reminder should repeat. + final bool repeats; + + /// Allows its subclasses to be `const`. + const ReminderTime({ + @required this.repeats, + @required this.type + }); + + /// Initializes a new instance from JSON. + /// + /// Mainly looks at `json ["type"]` to choose which type of + /// [ReminderTime] it should instantiate, and then leaves the + /// work to that subclass' `.fromJson` method. + /// + /// Example JSON: + /// ``` + /// { + /// "type": "period", + /// "repeats": false, + /// "period": "9", + /// "name": "Monday", + /// } + /// ``` + factory ReminderTime.fromJson(Map json) { + switch (stringToReminderTime [json ["type"]]) { + case ReminderTimeType.period: return PeriodReminderTime.fromJson(json); + case ReminderTimeType.subject: return SubjectReminderTime.fromJson(json); + default: throw JsonUnsupportedObjectError( + json, + cause: "Invalid time for reminder: $json" + ); + } + } + + /// Instantiates new [ReminderTime] with all possible parameters. + /// + /// Used for cases where the caller doesn't care about the [ReminderTimeType], + /// such as a UI reminder builder. + factory ReminderTime.fromType({ + @required ReminderTimeType type, + @required String dayName, + @required String period, + @required String name, + @required bool repeats, + }) { + switch (type) { + case ReminderTimeType.period: return PeriodReminderTime( + period: period, + dayName: dayName, + repeats: repeats, + ); case ReminderTimeType.subject: return SubjectReminderTime( + name: name, + repeats: repeats, + ); default: throw ArgumentError.notNull("type"); + } + } + + /// Returns this [ReminderTime] as JSON. + Map toJson(); + + /// Checks if the reminder should be displayed. + /// + /// All possible parameters are required. + bool doesApply({ + @required String dayName, + @required String subject, + @required String period, + }); + + /// Returns a String representation of this [ReminderTime]. + /// + /// Used for debugging and throughout the UI. + @override + String toString(); + + String get hash; +} diff --git a/lib/src/data/reminders/subject_reminder_time.dart b/lib/src/data/reminders/subject_reminder_time.dart new file mode 100644 index 000000000..ed77568da --- /dev/null +++ b/lib/src/data/reminders/subject_reminder_time.dart @@ -0,0 +1,45 @@ +import "package:meta/meta.dart"; + +import "reminder_time.dart"; + +/// A [ReminderTime] that depends on a subject. +class SubjectReminderTime extends ReminderTime { + /// The name of the subject this [ReminderTime] depends on. + final String name; + + /// Returns a new [SubjectReminderTime]. All parameters must be non-null. + const SubjectReminderTime({ + @required this.name, + @required bool repeats, + }) : super (repeats: repeats, type: ReminderTimeType.subject); + + /// Returns a new [SubjectReminderTime] from a JSON object. + /// + /// The fields `repeats` and `name` must not be null. + SubjectReminderTime.fromJson(Map json) : + name = json ["name"], + super (repeats: json ["repeats"], type: ReminderTimeType.subject); + + @override + String toString() => (repeats ? "Repeats every " : "") + name; + + @override + Map toJson() => { + "name": name, + "repeats": repeats, + "type": reminderTimeToString [type], + }; + + /// Returns true if this instance's [subject] field + /// matches the `subject` parameter. + @override + bool doesApply({ + @required String dayName, + @required String subject, + @required String period, + }) => subject == name; + + @override + String get hash => "$name-$repeats"; +} + From ae10bc78387bcc32d23f0d127070c69129035ad0 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 2 Nov 2020 12:29:15 -0500 Subject: [PATCH 085/251] Refactored Database.reminders Along with Database.updateReminder and Datbase.deleteReminder --- lib/src/models/data/reminders.dart | 50 +++++------------- lib/src/services/cloud_db.dart | 54 ++++++++++--------- lib/src/services/database.dart | 13 ++++- lib/src/services/databases.dart | 19 +++++-- lib/src/services/local_db.dart | 85 +++++++++++++++++++++--------- 5 files changed, 128 insertions(+), 93 deletions(-) diff --git a/lib/src/models/data/reminders.dart b/lib/src/models/data/reminders.dart index 7012a9b86..fc46a916c 100644 --- a/lib/src/models/data/reminders.dart +++ b/lib/src/models/data/reminders.dart @@ -58,7 +58,6 @@ class Reminders extends Model { } readReminders.add(index); cleanReminders(); - updateReminders(); } /// Gets all reminders that apply to the a given period. @@ -76,15 +75,6 @@ class Reminders extends Model { period: period, ).toList(); - /// Saves all reminders to the device and the cloud. - Future saveReminders() async { - final List> json = [ - for (final Reminder reminder in reminders) - reminder.toJson() - ]; - await Services.instance.database.setReminders(json); - } - /// Checks if any reminders have been modified and removes them. /// /// This makes sure that any reminders in [currentReminders], @@ -109,51 +99,35 @@ class Reminders extends Model { } } - /// Runs errands whenever reminders have changed. - /// - /// Does the following: - /// - /// 1. Runs [verifyReminders] (if a reminder has changed and not simply added). - /// 2. Runs [saveReminders]. - /// 3. Calls [notifyListeners]. - void updateReminders([int changedIndex]) { - if (changedIndex != null) { - verifyReminders(changedIndex); - } - saveReminders(); - notifyListeners(); - } - /// Replaces a reminder at a given index. void replaceReminder(int index, Reminder reminder) { if (reminder == null) { return; } - reminders - ..removeAt(index) - ..insert(index, reminder); - updateReminders(index); + final String oldHash = reminders [index].hash; + reminders [index] = reminder; + Services.instance.database.updateReminder(oldHash, reminder.toJson()); + verifyReminders(index); + notifyListeners(); } - /// Adds a reminder to the reminders list. - /// - /// Use this method instead of simply `reminders.add` to - /// ensure that [updateReminders] is called. + /// Creates a new reminder. void addReminder(Reminder reminder) { if (reminder == null) { return; } reminders.add(reminder); - updateReminders(); + Services.instance.database.updateReminder(null, reminder.toJson()); + notifyListeners(); } /// Deletes the reminder at a given index. - /// - /// Use this instead of `reminders.removeAt` to ensure that - /// [updateReminders] is called. void deleteReminder(int index) { + final String oldHash = reminders [index].hash; reminders.removeAt(index); - updateReminders(index); + Services.instance.database.deleteReminder(oldHash); + verifyReminders(index); // remove the reminder from the schedule + notifyListeners(); } /// Deletes expired reminders. diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index edadfa137..9a19d645d 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -4,6 +4,17 @@ import "auth.dart"; import "database.dart"; import "firebase_core.dart"; +/// Convenience methods on [CollectionReference]. +extension DocumentFinder on CollectionReference { + /// Returns a [DocumentReference] by querying a field. + Future findDocument(String field, String value) async { + final Query query = where(field, isEqualTo: value); + final QueryDocumentSnapshot snapshot = (await query.get()).docs.first; + final DocumentReference document = snapshot.reference; + return document; + } +} + /// A wrapper around Cloud Firestore. class CloudDatabase extends Database { static final DateTime _now = DateTime.now(); @@ -69,17 +80,6 @@ class CloudDatabase extends Database { static final CollectionReference feedbackCollection = firestore.collection("feedback"); - /// The reminders collection. - /// - /// Each user has their own document here that holds just their reminders. - /// The decision to separate reminders from the rest of the user data was - /// made to minimize the amount of processing time, since the student document - /// contains other irrelevant data. - /// - /// To access a document in this collection, use [remindersDocument]. - static final CollectionReference remindersCollection = - firestore.collection("reminders"); - /// The sports collection. /// /// Each academic year has its own document, with all the games for that year @@ -95,11 +95,12 @@ class CloudDatabase extends Database { DocumentReference get userDocument => userCollection.doc(Auth.email); - /// The document for this user's reminders. + /// The reminders collection. /// - /// The collection is indexed by email. - DocumentReference get remindersDocument => - remindersCollection.doc(Auth.email); + /// Each user document has a sub-collection that has their a document for each + /// reminder. + CollectionReference get remindersCollection => + userDocument.collection("reminders"); /// The document for this user's admin profile. /// @@ -126,10 +127,6 @@ class CloudDatabase extends Database { @override Future signIn() async { await Auth.signIn(); - final DocumentSnapshot remindersSnapshot = await remindersDocument.get(); - if (!remindersSnapshot.exists) { - await remindersDocument.set({remindersKey: []}); - } } // Database methods. @@ -181,17 +178,24 @@ class CloudDatabase extends Database { @override Future>> get reminders async { - final DocumentSnapshot snapshot = await remindersDocument.get(); - final Map data = snapshot.data(); + final QuerySnapshot snapshot = + await remindersCollection.orderBy(FieldPath.documentId).get(); + final List documents = snapshot.docs; return [ - for (final dynamic json in data [remindersKey]) - Map.from(json) + for (final QueryDocumentSnapshot document in documents) + document.data() ]; } @override - Future setReminders(List> json) => - remindersDocument.set({remindersKey: json}); + Future updateReminder(String oldHash, Map json) async => + oldHash == null + ? remindersCollection.add(json) + : (await remindersCollection.findDocument("hash", oldHash)).set(json); + + @override + Future deleteReminder(String oldHash) async => + (await remindersCollection.findDocument("hash", oldHash)).delete(); @override Future> get admin async => diff --git a/lib/src/services/database.dart b/lib/src/services/database.dart index 7e4e61594..f143c3785 100644 --- a/lib/src/services/database.dart +++ b/lib/src/services/database.dart @@ -91,8 +91,17 @@ abstract class Database extends Service { /// The user's reminders. Future>> get reminders; - /// Sets the user's reminders. - Future setReminders(List> json); + /// Updates a reminder, creating it if necessary. + /// + /// This function queries the database for a reminder with the same hash and + /// updates it. + Future updateReminder(String oldHash, Map json); + + /// Deletes a reminder at the given index. + /// + /// This function queries the database for a reminder with the same hash and + /// deletes it. + Future deleteReminder(String oldHash); /// The admin object (or null). Future> get admin; diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart index 223b83caa..299c43a55 100644 --- a/lib/src/services/databases.dart +++ b/lib/src/services/databases.dart @@ -32,9 +32,14 @@ class Databases extends Database { await localDatabase.signIn(); await localDatabase.setUser(await cloudDatabase.user); - await localDatabase.setReminders(await cloudDatabase.reminders); await updateCalendar(); + final List> cloudReminders = + await cloudDatabase.reminders; + for (int index = 0; index < cloudReminders.length; index++) { + await localDatabase.updateReminder(index.toString(), cloudReminders [index]); + } + if (await Auth.isAdmin) { await localDatabase.setAdmin(await cloudDatabase.admin); } @@ -116,9 +121,15 @@ class Databases extends Database { Future>> get reminders => localDatabase.reminders; @override - Future setReminders(List> json) async { - await cloudDatabase.setReminders(json); - await localDatabase.setReminders(json); + Future updateReminder(dynamic oldHash, Map json) async { + await cloudDatabase.updateReminder(oldHash, json); + await localDatabase.updateReminder(oldHash, json); + } + + @override + Future deleteReminder(dynamic oldHash) async { + await cloudDatabase.deleteReminder(oldHash); + await localDatabase.deleteReminder(oldHash); } @override diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index f28629739..caf7b0065 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -1,4 +1,5 @@ import "package:idb_shim/idb_shim.dart" as idb; +import "package:meta/meta.dart"; import "auth.dart"; import "database.dart"; @@ -45,10 +46,10 @@ extension DatabaseExtension on idb.Database { /// have a key. /// /// This code handles transactions so other code doesn't have to. - Future update(String storeName, T value) => + Future update(String storeName, T value, [dynamic key]) => transaction(storeName, idb.idbModeReadWrite) .objectStore(storeName) - .put(value); + .put(value, key); /// Gets all the data in an object store. /// @@ -61,6 +62,28 @@ extension DatabaseExtension on idb.Database { .objectStore(storeName).getAll() ) Map.from(entry) ]; + + /// Deletes a data from an object store. + /// + /// This code handles transactions so other code doesn't have to. + Future delete(String storeName, dynamic key) async => + transaction(storeName, idb.idbModeReadWrite) + .objectStore(storeName) + .delete(key); + + /// Finds an entry in an object store by a field and value. + Future findEntry({ + @required String storeName, + @required String key, + @required String path + }) async => key == null ? null : transaction(storeName, idb.idbModeReadWrite) + .objectStore(storeName) + .index(path) + .openCursor(range: idb.KeyRange.only(key), autoAdvance: true) + .firstWhere( + (idb.CursorWithValue cursor) => cursor.key == key, + orElse: () => null + ); } /// A database that's hosted on the user's device. @@ -79,8 +102,7 @@ extension DatabaseExtension on idb.Database { /// Another quirk of idb is that object stores can only be created on startup. /// One way this is relevant is in [isSignedIn]. If it turns out that the user /// is not signed in, it would be too late to create new object stores. That's -/// why the function that creates new object stores ([createObjectStores]) is -/// called in [init], so that it runs right away. +/// why [init] creates new object stores, so that it runs right away. /// /// Another consequence of having to consolidate object store creation in the /// very beginning is that there is a strict way of migrating from one database @@ -123,28 +145,28 @@ class LocalDatabase extends Database { /// Not to be confused with a RamLife [Database]. idb.Database database; - /// Creates all the object stores from scratch, specifying their keys. - Future createObjectStores(idb.Database database) async => database - ..createObjectStore(userStoreName, keyPath: "email") - ..createObjectStore(sectionStoreName, keyPath: "id") - ..createObjectStore(calendarStoreName, keyPath: "month") - ..createObjectStore(reminderStoreName, autoIncrement: true) - ..createObjectStore(adminStoreName, keyPath: "email") - ..createObjectStore(sportsStoreName, autoIncrement: true); - @override Future init() async { try { database = await (await idbFactory).open( "ramaz.db", - version: 1, + version: 2, onUpgradeNeeded: (idb.VersionChangeEvent event) { - switch (event.oldVersion) { - case 0: // fresh install - createObjectStores(event.database); - break; + switch(event.oldVersion) { + case 0: event.database + ..createObjectStore(userStoreName, keyPath: "email") + ..createObjectStore(sectionStoreName, keyPath: "id") + ..createObjectStore(calendarStoreName, keyPath: "month") + ..createObjectStore(reminderStoreName, autoIncrement: true) + ..createObjectStore(adminStoreName, keyPath: "email") + ..createObjectStore(sportsStoreName, autoIncrement: true); + continue one; + one: case 1: event.database + ..deleteObjectStore(reminderStoreName) + ..createObjectStore(reminderStoreName, autoIncrement: true) + .createIndex("hash", "hash", unique: true); } - } + }, ); } on StateError { // ignore: avoid_catching_errors await (await idbFactory).deleteDatabase("ramaz.db"); @@ -199,13 +221,28 @@ class LocalDatabase extends Database { Future>> get reminders => database.getAll(reminderStoreName); - @override - Future setReminders(List> json) async { - for (final Map entry in json) { - await database.update(reminderStoreName, entry); - } + @override + Future updateReminder(String oldHash, Map json) async { + final idb.CursorWithValue cursor = await database.findEntry( + storeName: reminderStoreName, + key: oldHash, + path: "hash" + ); + return cursor?.update(json) ?? database + .transaction(reminderStoreName, idb.idbModeReadWrite) + .objectStore(reminderStoreName) + .put(json); } + @override + Future deleteReminder(dynamic oldHash) async => ( + await database.findEntry( + storeName: reminderStoreName, + key: oldHash, + path: "hash", + ) + )?.delete(); + @override Future> get admin async => Map.from(await database.get(adminStoreName, Auth.email)); From 2c874b87f7fec986cc0106fa2b70c3a654fce82d Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 2 Nov 2020 15:14:26 -0500 Subject: [PATCH 086/251] Refactored page refresh logic for web Now, refreshing the page will prompt for login if needed, instead of crashing the page. --- lib/app.dart | 45 ++++++++++++++++++++++++++------------- lib/main.dart | 2 +- lib/src/pages/login.dart | 12 ++++++++++- lib/src/pages/splash.dart | 6 +----- 4 files changed, 43 insertions(+), 22 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 067b7c5f6..0fcfdc8e2 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -3,17 +3,21 @@ import "package:flutter/material.dart"; import "package:ramaz/constants.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; +import "package:ramaz/services.dart"; /// The main app widget. -class RamazApp extends StatelessWidget { +class RamLife extends StatefulWidget { /// Whether the user is already signed in. final bool isSignedIn; /// Creates the main app widget. - const RamazApp ({ - this.isSignedIn, - }); + const RamLife ({this.isSignedIn}); + @override + RamLifeState createState() => RamLifeState(); +} + +class RamLifeState extends State { @override Widget build (BuildContext context) => ThemeChanger( defaultBrightness: null, @@ -63,23 +67,34 @@ class RamazApp extends StatelessWidget { ), ), builder: (BuildContext context, ThemeData theme) => MaterialApp ( - home: isSignedIn == null + home: widget.isSignedIn == null ? SplashScreen() - : isSignedIn ? HomePage() : Login(), + : widget.isSignedIn ? HomePage() : const Login(), title: "Ram Life", color: RamazColors.blue, theme: theme, routes: { - Routes.login: (_) => Login(), - Routes.home: (_) => HomePage(), - Routes.schedule: (_) => SchedulePage(), - Routes.reminders: (_) => RemindersPage(), - Routes.feedback: (_) => FeedbackPage(), - Routes.calendar: (_) => CalendarPage(), - Routes.specials: (_) => SpecialPage(), - Routes.admin: (_) => AdminHomePage(), - Routes.sports: (_) => SportsPage(), + Routes.login: enforceLogin((_) => const Login()), + Routes.home: enforceLogin((_) => HomePage()), + Routes.schedule: enforceLogin((_) => SchedulePage()), + Routes.reminders: enforceLogin((_) => RemindersPage()), + Routes.feedback: enforceLogin((_) => FeedbackPage()), + Routes.calendar: enforceLogin((_) => CalendarPage()), + Routes.specials: enforceLogin((_) => SpecialPage()), + Routes.admin: enforceLogin((_) => AdminHomePage()), + Routes.sports: enforceLogin((_) => SportsPage()), } ) ); + + WidgetBuilder enforceLogin(WidgetBuilder builder) => + (_) { + if (widget.isSignedIn == null) { + return SplashScreen(); + } else if (!Services.instance.database.isSignedIn) { + return Login(builder); + } else { + return builder(_); + } + }; } diff --git a/lib/main.dart b/lib/main.dart index 264f74573..3e889b2da 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,4 +2,4 @@ import "package:flutter/material.dart"; import "app.dart"; -void main() => runApp(const RamazApp()); +void main() => runApp(const RamLife()); diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index 629055681..a73c559a9 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -20,6 +20,10 @@ import "package:ramaz/widgets.dart"; /// This page holds methods that can safely clean the errors away before /// prompting the user to try again. class Login extends StatefulWidget { + final WidgetBuilder destinationPage; + + const Login([this.destinationPage]); + @override LoginState createState() => LoginState(); } @@ -154,7 +158,13 @@ class LoginState extends State { }, onSuccess: () { setState(() => isLoading = false); - Navigator.of(context).pushReplacementNamed(Routes.home); + if (widget.destinationPage == null) { + Navigator.of(context).pushReplacementNamed(Routes.home); + } else { + Navigator.of(context).pushReplacement(MaterialPageRoute( + builder: widget.destinationPage + )); + } }, ); } diff --git a/lib/src/pages/splash.dart b/lib/src/pages/splash.dart index 9d81fa86f..953635daa 100644 --- a/lib/src/pages/splash.dart +++ b/lib/src/pages/splash.dart @@ -77,11 +77,7 @@ class SplashScreenState extends State { await crashlytics.toggle(!kDebugMode); FlutterError.onError = crashlytics.recordFlutterError; runZonedGuarded( - () => runApp( - RamazApp( - isSignedIn: isSignedIn, - ) - ), + () => runApp(RamLife(isSignedIn: isSignedIn)), crashlytics.recordError, ); } From 90ac0b57f97508045948fc114a57023a8fa4b3e5 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 2 Nov 2020 15:15:01 -0500 Subject: [PATCH 087/251] Redesigned AdminPage to be more responsive --- lib/src/pages/admin.dart | 96 ++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 59 deletions(-) diff --git a/lib/src/pages/admin.dart b/lib/src/pages/admin.dart index 7ca7e05f3..96cfe5d1e 100644 --- a/lib/src/pages/admin.dart +++ b/lib/src/pages/admin.dart @@ -64,27 +64,26 @@ class AdminMenuItem extends StatelessWidget { /// The label to display. final String label; + /// A description of what this admin option does. + final String description; + /// The name of the route to push when tapped. final String routeName; - + /// Creates a menu item for the admin console. const AdminMenuItem({ @required this.icon, @required this.label, + @required this.description, @required this.routeName }); @override - Widget build(BuildContext context) => InkWell( + Widget build(BuildContext context) => ListTile( + title: Text(label), + subtitle: Text(description), + leading: Icon(icon), onTap: () => Navigator.of(context).pushNamed(routeName), - child: Column( - children: [ - const SizedBox(height: 10), - Text(label, textScaleFactor: 1.25), - const SizedBox(height: 25), - Icon(icon, size: 100), - ] - ) ); } @@ -130,54 +129,33 @@ class AdminHomePageState extends State { ) ] ), - // body: Column( - // children: [ - // const SizedBox(height: 10), - // const Text("Select an option", textScaleFactor: 2), - // const SizedBox(height: 25), - // body: Expanded( - body: SizedBox( - width: 150, - height: 150, - child: GridView.extent( - maxCrossAxisExtent: 200, - children: [ - Container( - color: const Color(0x88000000), - ) - ] - // child: Row( - // children: [ - // if (_isCalendarAdmin ?? false) const AdminMenuItem( - // icon: Icons.schedule, - // label: "Manage schedules", - // routeName: Routes.specials, - // ), - // ] - // ) - // child: GridView.count( - // shrinkWrap: true, - // crossAxisCount: 2, - // childAspectRatio: 0.5, - // children: [ - // if (_isCalendarAdmin ?? false) const AdminMenuItem( - // icon: Icons.schedule, - // label: "Manage schedules", - // routeName: Routes.specials, - // ), - // // if (_isCalendarAdmin ?? false) const AdminMenuItem( - // // icon: Icons.today, - // // label: "Edit calendar", - // // routeName: Routes.calendar, - // // ), - // // if (_isSportsAdmin ?? false) const AdminMenuItem( - // // icon: Icons.directions_run, - // // label: "Manage games", - // // routeName: Routes.sports, - // // ) - // ] - // ) - ) - ), + body: ListView( + padding: const EdgeInsets.all(20), + children: [ + Text( + "Choose an admin option", + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox(height: 20), + if (_isCalendarAdmin ?? false) const AdminMenuItem( + label: "Calendar", + icon: Icons.today, + description: "Modify the calendar", + routeName: Routes.calendar, + ), + if (_isCalendarAdmin ?? false) const AdminMenuItem( + label: "Schedules", + icon: Icons.schedule, + description: "Manage your custom schedules", + routeName: Routes.specials, + ), + if (_isSportsAdmin ?? false) const AdminMenuItem( + icon: Icons.directions_run, + label: "Sports", + description: "Add new sports games and record scores", + routeName: Routes.sports, + ) + ] + ) ); } From b222d849d9a9bec67d34e7ac0e0b50044063407e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 4 Nov 2020 02:38:36 -0500 Subject: [PATCH 088/251] Changed admin page icon in the drawer --- lib/src/pages/drawer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index 6f87b1359..aefed5628 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -49,7 +49,7 @@ class NavigationDrawer extends StatelessWidget { if (Models.instance.user.isAdmin) ListTile( title: const Text("Admin console"), - leading: Icon(Icons.verified_user), + leading: Icon(Icons.admin_panel_settings), onTap: pushRoute(context, Routes.admin), ), BrightnessChanger.dropdown(prefs: Services.instance.prefs), From 70ea63cd73f6be14a4ae031a0d2027cdcfe33707 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 22 Mar 2021 03:06:29 -0400 Subject: [PATCH 089/251] Moved routing logic to RouteInitializer --- analysis_options.yaml | 2 +- lib/app.dart | 59 ++++++++++++++++++++------ lib/constants.dart | 32 -------------- lib/pages.dart | 36 +++++++++++++++- lib/src/pages/drawer.dart | 1 + lib/src/pages/login.dart | 2 +- lib/src/pages/route_initializer.dart | 57 +++++++++++++++++++++++++ lib/src/widgets/atomic/next_class.dart | 2 +- lib/src/widgets/generic/footer.dart | 2 +- 9 files changed, 143 insertions(+), 50 deletions(-) create mode 100644 lib/src/pages/route_initializer.dart diff --git a/analysis_options.yaml b/analysis_options.yaml index 7024ef9a2..78e05b676 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -14,7 +14,7 @@ linter: # - avoid_annotating_with_dynamic # - avoid_as # dart 1 only - avoid_bool_literals_in_conditional_expressions - - avoid_catches_without_on_clauses + # - avoid_catches_without_on_clauses - avoid_catching_errors - avoid_double_and_int_checks - avoid_empty_else diff --git a/lib/app.dart b/lib/app.dart index 0fcfdc8e2..fdd14b4b3 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -65,16 +65,23 @@ class RamLifeState extends State { buttonColor: RamazColors.blueDark, textTheme: ButtonTextTheme.accent, ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(RamazColors.blueDark) + ) + ), ), builder: (BuildContext context, ThemeData theme) => MaterialApp ( - home: widget.isSignedIn == null - ? SplashScreen() - : widget.isSignedIn ? HomePage() : const Login(), + initialRoute: Routes.home, title: "Ram Life", color: RamazColors.blue, theme: theme, routes: { - Routes.login: enforceLogin((_) => const Login()), + Routes.splash: (_) => RouteInitializer( + isAllowed: () => Auth.isSignedIn, + builder: (_) => HomePage(), + ), + Routes.login: (_) => const Login(), Routes.home: enforceLogin((_) => HomePage()), Routes.schedule: enforceLogin((_) => SchedulePage()), Routes.reminders: enforceLogin((_) => RemindersPage()), @@ -88,13 +95,39 @@ class RamLifeState extends State { ); WidgetBuilder enforceLogin(WidgetBuilder builder) => - (_) { - if (widget.isSignedIn == null) { - return SplashScreen(); - } else if (!Services.instance.database.isSignedIn) { - return Login(builder); - } else { - return builder(_); - } - }; + (_) => RouteInitializer( + isAllowed: () => Auth.isSignedIn, + builder: builder, + ); + + // WidgetBuilder enforceLogin(WidgetBuilder builder) => + // (_) { + // if (widget.isSignedIn == null) { + // return SplashScreen(); + // } else if (!Services.instance.database.isSignedIn) { + // return Login(builder); + // } else { + // return builder(_); + // } + // }; } + + + +// logic +// initialRoute => route with/out login +// routes: map with custom RouteInitializer +// routeInitializer: +// - Route onSuccess +// - Route onDeny +// - Route onError +// onGenerateRoute: for complex URL logic (not needed yet) + + +/// Some routeInitializers: +/// - home: RouteInitializer( +/// - isAllowed: isSignedIn +/// - onSuccess: Routes.home +/// - onDeny: Routes.login +/// - onError: reset(); Routes.login +/// ) \ No newline at end of file diff --git a/lib/constants.dart b/lib/constants.dart index 322fb96fd..42d0b97e3 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -30,38 +30,6 @@ class RamazColors { static const Color goldLight = Color (0xfffff552); } -/// Route names for each page in the app. -/// -/// These would be enums, but Flutter requires Strings. -class Routes { - /// The route name for the home page. - static const String home = "home"; - - /// The route name for the schedule page. - static const String schedule = "schedule"; - - /// The route name for the reminders page. - static const String reminders = "reminders"; - - /// The route name for the login page. - static const String login = "login"; - - /// The route name for the feedback page. - static const String feedback = "feedback"; - - /// The route name for the calendar page. - static const String calendar = "calendar"; - - /// The route name for the specials manager page. - static const String specials = "specials"; - - /// The route name for the admin home page. - static const String admin = "admin"; - - /// The route name for the sports games page. - static const String sports = "sports"; -} - /// A collection of URLs used throughout the app class Urls { /// The URL for schoology. diff --git a/lib/pages.dart b/lib/pages.dart index 7bc0b0ee8..1b17efcfc 100644 --- a/lib/pages.dart +++ b/lib/pages.dart @@ -1,6 +1,5 @@ library pages; - export "src/pages/admin.dart"; export "src/pages/builders/day_builder.dart"; export "src/pages/builders/reminder_builder.dart"; @@ -12,7 +11,42 @@ export "src/pages/feedback.dart"; export "src/pages/home.dart"; export "src/pages/login.dart"; export "src/pages/reminders.dart"; +export "src/pages/route_initializer.dart"; export "src/pages/schedule.dart"; export "src/pages/specials.dart"; export "src/pages/splash.dart"; export "src/pages/sports.dart"; + +/// Route names for each page in the app. +/// +/// These would be enums, but Flutter requires Strings. +class Routes { + /// The route name for the home page. + static const String home = "home"; + + /// The route name for the schedule page. + static const String schedule = "schedule"; + + /// The route name for the reminders page. + static const String reminders = "reminders"; + + /// The route name for the login page. + static const String login = "login"; + + /// The route name for the feedback page. + static const String feedback = "feedback"; + + /// The route name for the calendar page. + static const String calendar = "calendar"; + + /// The route name for the specials manager page. + static const String specials = "specials"; + + /// The route name for the admin home page. + static const String admin = "admin"; + + /// The route name for the sports games page. + static const String sports = "sports"; + + static const String splash = "splash"; +} diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index aefed5628..e0ecb7da2 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -1,6 +1,7 @@ // ignore_for_file: prefer_const_constructors import "package:flutter/material.dart"; +import "package:ramaz/pages.dart"; import "package:ramaz/constants.dart"; // for route names import "package:ramaz/models.dart"; import "package:ramaz/services.dart"; diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index a73c559a9..84f3f5283 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -4,7 +4,7 @@ import "package:flutter/services.dart" show PlatformException; import "package:url_launcher/url_launcher.dart"; -import "package:ramaz/constants.dart"; +import "package:ramaz/pages.dart"; import "package:ramaz/models.dart"; import "package:ramaz/services.dart"; import "package:ramaz/widgets.dart"; diff --git a/lib/src/pages/route_initializer.dart b/lib/src/pages/route_initializer.dart new file mode 100644 index 000000000..332fdb89e --- /dev/null +++ b/lib/src/pages/route_initializer.dart @@ -0,0 +1,57 @@ +import "package:flutter/material.dart"; +import "package:ramaz/pages.dart"; +import "package:ramaz/models.dart"; +import "package:ramaz/services.dart"; + +class RouteInitializer extends StatefulWidget { + static bool alwaysTrue () => true; + + final bool Function() isAllowed; + final WidgetBuilder builder; + final String onFailure; + final String onError; + + const RouteInitializer({ + @required this.builder, + this.onFailure = Routes.login, + this.onError = Routes.login, + this.isAllowed = alwaysTrue, + }); + + @override + RouteInitializerState createState() => RouteInitializerState(); +} + +class RouteInitializerState extends State { + Future initFuture; + + @override + void initState() { + super.initState(); + initFuture = init(); + } + + Future init() async { + final NavigatorState nav = Navigator.of(context); + try { + await Services.instance.init(); + if (Auth.isSignedIn) { + await Models.instance.init(); + } + } catch (error) { // + await nav.pushReplacementNamed(widget.onError); + } + if (!widget.isAllowed()) { + await nav.pushReplacementNamed(widget.onFailure); + } + } + + @override + Widget build(BuildContext context) => FutureBuilder( + future: initFuture, + builder: (_, AsyncSnapshot snapshot) => + snapshot.connectionState == ConnectionState.done + ? widget.builder(context) + : const Center(child: CircularProgressIndicator()) + ); +} \ No newline at end of file diff --git a/lib/src/widgets/atomic/next_class.dart b/lib/src/widgets/atomic/next_class.dart index c4de711cc..9d1f4b342 100644 --- a/lib/src/widgets/atomic/next_class.dart +++ b/lib/src/widgets/atomic/next_class.dart @@ -1,6 +1,6 @@ import "package:flutter/material.dart"; -import "package:ramaz/constants.dart"; +import "package:ramaz/pages.dart"; import "package:ramaz/data.dart"; import "package:ramaz/widgets.dart"; diff --git a/lib/src/widgets/generic/footer.dart b/lib/src/widgets/generic/footer.dart index 9bd438003..d5002fccb 100644 --- a/lib/src/widgets/generic/footer.dart +++ b/lib/src/widgets/generic/footer.dart @@ -1,6 +1,6 @@ import "package:flutter/material.dart"; -import "package:ramaz/constants.dart"; +import "package:ramaz/pages.dart"; import "package:ramaz/models.dart"; import "package:ramaz/widgets.dart"; From 7637767d04a55ca091393a6fba6d4e21d87fee61 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 22 Mar 2021 03:07:33 -0400 Subject: [PATCH 090/251] Fixed some web issues Bumped path_provider and shared_preferences Moved Google Sign in logo to AssetImage due to CORS conflict --- images/logos/google_sign_in.png | Bin 0 -> 1771 bytes ios/Flutter/Flutter.podspec | 18 ------ lib/src/widgets/generic/icons.dart | 4 +- pubspec.lock | 96 +++++++++++++++++++---------- pubspec.yaml | 5 +- 5 files changed, 67 insertions(+), 56 deletions(-) create mode 100644 images/logos/google_sign_in.png delete mode 100644 ios/Flutter/Flutter.podspec diff --git a/images/logos/google_sign_in.png b/images/logos/google_sign_in.png new file mode 100644 index 0000000000000000000000000000000000000000..3f52a66ae9619e0bb383d220a449a327560d6135 GIT binary patch literal 1771 zcmV;P)`k0=zBfB zkn`M?`8j|fxCf@%+vGftwhhaK7Gne>{zi-5z}97RWX_k##(G@`1A@Tfqv4ShjOlj= zphhI~r^tOhfI^{jV1Q#XcL$;QC}b6l2+c-HubidYT6F>pC`u8`hnFI{1d(k#Oy=nf z2%sEvXhSsJ#(oz_YD$zwS~C=f)gv(~{{UAocEa z?)X43@~=l}TUX8p0B{uyZ~+ni%za=O`K8x{#=kx6((O;w)o{2GPc>YDyoUzoJujL3 zJ<`d{0Wg_k^(ZimGW6;8HJ{$r!qx{+C^!rT6hTD224SirJAQM->O6gz+s~FjXFl}M z3Fh{a$o3Dip^n>Ns>uanXhxYlNS!}?Ivm$@E=J>BfXT9T^uc8L26e#0cS^MoISy2U zvrOoNDN&g2gUg#KRbV2eFMTi|rMeG}Ehbcg6TYVlj(!UP*L`5$bfrpg%m;MA3Ey)9 z?3#qD1V_9`7o0Yj6W}W`tbqq{0t^SIo^?u}i&PCx_<=4s>P=379pdqxH7t3gD0^1n z;h&`%T((eqTRe)eXAbawgVY-t<~2z{VA=%d z)R6Sg=N&wST1~vB(3hrp4u#IUb0*hCo8Z&o7=185L&>~Nn-cWiXg7oVv@reLZE89i zwWDp50fYSrcdRM_#jp{7h5ub2S2M_aXy!$2)lMV+R2ahHwK^&T03bhVX$yURxpzOP zQk~P9Ke6k@)R;X8hxcR{hVU>=5&J3BmIS|H<~{~`=p?8*R&!bz2Bw~sA&tPrjU>Y3 zQbF+sfB(-0ULSjCroX#wY(ttRv;cth?g}LBq|-9A=fhI0eU#5s$Uw?JZdP7pA?#{# z0_@NjN;ELsd@CZLfk6&tUdBkA6|JCynsZT(sxibo6+(gHtg-pej1JI@YZ;@It-^+^5sS*AMWpQ}yF6 z)&r08yVS0ARj}}KsZcH%!<&vSWIz4R9~!nx@+htOVJW=Hu>gi!wy>zLyNxcG|GBzk z=-!HlPJJ`0NH$*(hlLazX1m`E<1}H=;n@4YE{Qn%O8_G3lKQw=>x9|GqW|g3w?`~E zsnFCSkNAcRSVHQ6`NoK~Vd(D0qrsSFm+_=F=fXyZj+pl)^3hkdpl?l50USuWmpa0G za(rWk_Lkz26bYL<=ye!7nHsjXNha)u#g-W@1=fK}w5&axb%mhFZd*=E0g7K4d8Z!K zWM+hK$QPCB#DZyz#2t!!MkRQ6#R= z^$$I0!#dncgO+aCO|l%uDdd&x+V+6SP#% zcP5-0!J=)b*Tk{B85RKx=S6LS!b=5Suq)PzwfBB-NiVn;+zWo>_8%1)ADpoFWwrnS N002ovPDHLkV1fkhT8IDu literal 0 HcmV?d00001 diff --git a/ios/Flutter/Flutter.podspec b/ios/Flutter/Flutter.podspec deleted file mode 100644 index 5ca30416b..000000000 --- a/ios/Flutter/Flutter.podspec +++ /dev/null @@ -1,18 +0,0 @@ -# -# NOTE: This podspec is NOT to be published. It is only used as a local source! -# - -Pod::Spec.new do |s| - s.name = 'Flutter' - s.version = '1.0.0' - s.summary = 'High-performance, high-fidelity mobile apps.' - s.description = <<-DESC -Flutter provides an easy and productive way to build and deploy high-performance mobile apps for Android and iOS. - DESC - s.homepage = 'https://flutter.io' - s.license = { :type => 'MIT' } - s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } - s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } - s.ios.deployment_target = '8.0' - s.vendored_frameworks = 'Flutter.framework' -end diff --git a/lib/src/widgets/generic/icons.dart b/lib/src/widgets/generic/icons.dart index 6476289c1..92a898438 100644 --- a/lib/src/widgets/generic/icons.dart +++ b/lib/src/widgets/generic/icons.dart @@ -37,8 +37,8 @@ class Logos { /// The Google logo. static const Widget google = CircleAvatar ( backgroundColor: Colors.transparent, - backgroundImage: NetworkImage( - "https://developers.google.com/identity/images/g-logo.png" + backgroundImage: AssetImage( + "images/logos/google_sign_in.png", ), ); diff --git a/pubspec.lock b/pubspec.lock index e727e8431..94b64c10f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,35 +21,35 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.5.0-nullsafety.1" + version: "2.5.0" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.1" + version: "2.1.0" characters: dependency: transitive description: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.3" + version: "1.1.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.1" + version: "1.1.0" cloud_firestore: dependency: "direct main" description: @@ -77,7 +77,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0-nullsafety.3" + version: "1.15.0" convert: dependency: transitive description: @@ -98,14 +98,21 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" file: dependency: transitive description: name: file url: "https://pub.dartlang.org" source: hosted - version: "5.2.1" + version: "6.1.0" firebase: dependency: transitive description: @@ -281,56 +288,63 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.2" + version: "0.6.3" matcher: dependency: "direct dev" description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10-nullsafety.1" + version: "0.12.10" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.3" + version: "1.3.0" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.1" + version: "1.8.0" path_provider: dependency: "direct main" description: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "1.6.14" + version: "2.0.1" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "0.0.1+2" + version: "2.0.0" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "0.0.4+3" + version: "2.0.0" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "2.0.0" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" pedantic: dependency: transitive description: @@ -351,7 +365,7 @@ packages: name: platform url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "3.0.0" platform_detect: dependency: transitive description: @@ -372,7 +386,7 @@ packages: name: process url: "https://pub.dartlang.org" source: hosted - version: "3.0.13" + version: "4.1.1" pub_semver: dependency: transitive description: @@ -400,35 +414,42 @@ packages: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "0.5.10" + version: "2.0.5" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux url: "https://pub.dartlang.org" source: hosted - version: "0.0.2+2" + version: "2.0.0" shared_preferences_macos: dependency: transitive description: name: shared_preferences_macos url: "https://pub.dartlang.org" source: hosted - version: "0.0.1+10" + version: "2.0.0" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.0" shared_preferences_web: dependency: transitive description: name: shared_preferences_web url: "https://pub.dartlang.org" source: hosted - version: "0.1.2+7" + version: "2.0.0" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" sky_engine: dependency: transitive description: flutter @@ -440,28 +461,28 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.2" + version: "1.8.0" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.10.0-nullsafety.1" + version: "1.10.0" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.1" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.1" + version: "1.1.0" synchronized: dependency: transitive description: @@ -475,14 +496,14 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.19-nullsafety.2" + version: "0.2.19" timezone: dependency: transitive description: @@ -496,7 +517,7 @@ packages: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.3" + version: "1.3.0" url_launcher: dependency: "direct main" description: @@ -538,14 +559,21 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.3" + version: "2.1.0" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" xdg_directories: dependency: transitive description: name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "0.1.0" + version: "0.2.0" xml: dependency: transitive description: @@ -561,5 +589,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.10.0-110 <2.11.0" - flutter: ">=1.12.13+hotfix.5 <2.0.0" + dart: ">=2.12.0 <3.0.0" + flutter: ">=1.20.0" diff --git a/pubspec.yaml b/pubspec.yaml index 22d95fb70..9c00af91b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,8 +24,8 @@ dependencies: # Misc flutter_local_notifications: ^2.0.0 idb_shim: ^1.12.0 - path_provider: ^1.4.4 - shared_preferences: ^0.5.4 + path_provider: ^2.0.1 + shared_preferences: ^2.0.5 url_launcher: ^5.2.5 flutter_native_timezone: ^1.0.4 @@ -75,6 +75,7 @@ flutter: - images/icons/volleyball.png - images/logos/drive.png - images/logos/google.png + - images/logos/google_sign_in.png - images/logos/outlook.jpg - images/logos/schoology.png - images/logos/senior_systems.png From 1f82bb450ec601a0aea54a9244127723d086cc5e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 22 Mar 2021 03:08:27 -0400 Subject: [PATCH 091/251] Fixed some ReminderPage deprecations --- lib/app.dart | 5 + lib/src/pages/builders/reminder_builder.dart | 163 +++++++++---------- 2 files changed, 83 insertions(+), 85 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index fdd14b4b3..580f3411d 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -37,6 +37,11 @@ class RamLifeState extends State { buttonColor: RamazColors.gold, textTheme: ButtonTextTheme.normal, ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(RamazColors.gold) + ) + ) ), dark: ThemeData( brightness: Brightness.dark, diff --git a/lib/src/pages/builders/reminder_builder.dart b/lib/src/pages/builders/reminder_builder.dart index b24dab70a..680eecc48 100644 --- a/lib/src/pages/builders/reminder_builder.dart +++ b/lib/src/pages/builders/reminder_builder.dart @@ -86,7 +86,7 @@ class ReminderBuilderState extends State { Widget build(BuildContext context) => ModelListener( model: () => RemindersBuilderModel(widget.reminder), // ignore: sort_child_properties_last - child: FlatButton( + child: TextButton( onPressed: Navigator.of(context).pop, child: Text ( "Cancel", @@ -104,8 +104,7 @@ class ReminderBuilderState extends State { title: Text (widget.reminder == null ? "Create reminder" : "Edit reminder"), actions: [ back, - RaisedButton( - color: Theme.of(context).buttonColor, + ElevatedButton( onPressed: model.ready ? () => Navigator.of(context).pop(model.build()) : null, @@ -123,93 +122,87 @@ class ReminderBuilderState extends State { ), ) ], - content: SingleChildScrollView( - child: Column ( - mainAxisSize: MainAxisSize.min, - children: [ - TextField ( - controller: controller, - onChanged: model.onMessageChanged, - textCapitalization: TextCapitalization.sentences, + content: Column ( + mainAxisSize: MainAxisSize.min, + children: [ + TextField ( + controller: controller, + onChanged: model.onMessageChanged, + textCapitalization: TextCapitalization.sentences, + ), + const SizedBox (height: 20), + RadioListTile ( + value: ReminderTimeType.period, + groupValue: model.type, + onChanged: model.toggleRepeatType, + title: Text ( + "${model.shouldRepeat ? 'Repeats every' : 'On'} period" ), - const SizedBox (height: 20), - Wrap( - children: [ - RadioListTile ( - value: ReminderTimeType.period, - groupValue: model.type, - onChanged: model.toggleRepeatType, - title: Text ( - "${model.shouldRepeat ? 'Repeats every' : 'On'} period" - ), - ), - RadioListTile ( - value: ReminderTimeType.subject, - groupValue: model.type, - onChanged: model.toggleRepeatType, - title: Text ( - "${model.shouldRepeat ? 'Repeats every' : 'On'} subject" - ), - ), - ] + ), + RadioListTile ( + value: ReminderTimeType.subject, + groupValue: model.type, + onChanged: model.toggleRepeatType, + title: Text ( + "${model.shouldRepeat ? 'Repeats every' : 'On'} subject" ), - const SizedBox (height: 20), - if (model.type == ReminderTimeType.period) ...[ - ListTile ( - title: const Text ("Day"), - trailing: DropdownButton( - items: [ - for (final String dayName in Models.instance.schedule.user.dayNames) - DropdownMenuItem( - value: dayName, - child: Text(dayName), - ), - ], - onChanged: model.changeDay, - value: model.dayName, - hint: const Text("Day"), - ), + ), + const SizedBox (height: 20), + if (model.type == ReminderTimeType.period) ...[ + ListTile ( + title: const Text ("Day"), + trailing: DropdownButton( + items: [ + for (final String dayName in Models.instance.schedule.user.dayNames) + DropdownMenuItem( + value: dayName, + child: Text(dayName), + ), + ], + onChanged: model.changeDay, + value: model.dayName, + hint: const Text("Day"), ), - ListTile ( - title: const Text ("Period"), - trailing: DropdownButton ( - items: [ - for (final String period in model.periods ?? []) - DropdownMenuItem( - value: period, - child: Text (period), - ) - ], - onChanged: model.changePeriod, - value: model.period, - hint: const Text ("Period"), - ) + ), + ListTile ( + title: const Text ("Period"), + trailing: DropdownButton ( + items: [ + for (final String period in model.periods ?? []) + DropdownMenuItem( + value: period, + child: Text (period), + ) + ], + onChanged: model.changePeriod, + value: model.period, + hint: const Text ("Period"), + ) + ) + ] else if (model.type == ReminderTimeType.subject) + ListTile ( + title: const Text ("Class"), + trailing: DropdownButton( + items: [ + for (final String course in model.courses) + DropdownMenuItem( + value: course, + child: Text("${ReminderBuilder.trimString(course, 14)}..."), + ) + ], + onChanged: model.changeCourse, + value: model.course, + isDense: true, + hint: const Text ("Class"), ) - ] else if (model.type == ReminderTimeType.subject) - ListTile ( - title: const Text ("Class"), - trailing: DropdownButton( - items: [ - for (final String course in model.courses) - DropdownMenuItem( - value: course, - child: Text("${ReminderBuilder.trimString(course, 14)}..."), - ) - ], - onChanged: model.changeCourse, - value: model.course, - isDense: true, - hint: const Text ("Class"), - ) - ), - SwitchListTile ( - value: model.shouldRepeat, - onChanged: model.toggleRepeat, - title: const Text ("Repeat"), - secondary: const Icon (Icons.repeat), ), - ] - ) + SwitchListTile ( + value: model.shouldRepeat, + onChanged: model.toggleRepeat, + title: const Text ("Repeat"), + secondary: const Icon (Icons.repeat), + ), + ] ) ) ); From 1b46c66bcd2788cbce77e78563ecf8f70b38c28d Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 24 Mar 2021 18:42:24 -0400 Subject: [PATCH 092/251] Moved HomePage to custom ResponsiveScaffold --- lib/src/pages/home.dart | 129 ++++++++++++++++++++++++++-------------- pubspec.lock | 30 +++++++++- pubspec.yaml | 2 + 3 files changed, 117 insertions(+), 44 deletions(-) diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index cea0fd346..5d100ce95 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -1,5 +1,8 @@ import "package:flutter/material.dart"; +import "package:adaptive_components/adaptive_components.dart"; +import "package:breakpoint_scaffold/breakpoint_scaffold.dart"; + import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; @@ -44,21 +47,32 @@ class HomePage extends StatelessWidget { @override Widget build (BuildContext context) => ModelListener( model: () => HomeModel(), - builder: (BuildContext context, HomeModel model, _) => AdaptiveScaffold ( - appBarBuilder: (isShowingSchedule) => AppBar ( + builder: (_, HomeModel model, __) => ResponsiveScaffold.navBar( + // appBarBuilder: (isShowingSchedule) => AppBar( + appBar: AppBar( title: const Text ("Home"), actions: [ - if (scheduleModel.hasSchool && !isShowingSchedule) Builder ( - builder: (BuildContext context) => FlatButton( - textColor: Colors.white, - onPressed: () => Scaffold.of(context).openEndDrawer(), - child: const Text ("Tap for schedule"), - ) + // if (scheduleModel.hasSchool && !isShowingSchedule) Builder( + if (scheduleModel.hasSchool) ResponsiveBuilder( + builder: (BuildContext context, LayoutInfo info, __) => + info.hasStandardSideSheet ? Container() : FlatButton( + textColor: Colors.white, + onPressed: () => Scaffold.of(context).openEndDrawer(), + child: const Text ("Tap for schedule"), + ) ) ], ), - drawer: NavigationDrawer(), - endDrawer: !scheduleModel.hasSchool ? null : Drawer ( + drawer: ResponsiveBuilder( + builder: (BuildContext context, LayoutInfo info, Widget drawer) => + info.hasStandardDrawer ? SizedBox(width: 256, child: drawer) : drawer, + child: NavigationDrawer(), + ), + // SizedBox(width: 256, child: NavigationDrawer()), + sideSheet: ResponsiveBuilder( + builder: (BuildContext context, LayoutInfo info, Widget schedule) => + !scheduleModel.hasSchool ? null : info.hasStandardSideSheet + ? SizedBox(width: 320, child: schedule) : Drawer(child: schedule), child: ClassList( day: scheduleModel.today, periods: scheduleModel.nextPeriod == null @@ -70,51 +84,62 @@ class HomePage extends StatelessWidget { headerText: scheduleModel.period == null ? "Today's Schedule" : "Upcoming Classes" - ) + ), ), + navItems: const [ + NavigationItem(icon: Icon(Icons.calendar_today), label: "Today"), + NavigationItem(icon: Icon(Icons.schedule), label: "Schedule"), + NavigationItem(icon: Icon(Icons.notifications), label: "Reminders"), + ], + secondaryDrawer: NavigationDrawer(), + navIndex: 0, + onNavIndexChanged: (int value) {}, body: Builder( builder: (BuildContext context) => RefreshIndicator( onRefresh: () => refresh(context, model), - child: ListView ( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 20), + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20), children: [ - RamazLogos.ramRectangle, - const Divider(), Text ( - scheduleModel.hasSchool - ? "Today is a${scheduleModel.today.n} " - "${scheduleModel.today.name}" - "\nSchedule: ${scheduleModel.today.special.name}" - : "There is no school today", - textScaleFactor: 2, + "Today is XXX", + style: Theme.of(context).textTheme.headline3, textAlign: TextAlign.center ), - const SizedBox (height: 30), - if (scheduleModel.hasSchool) NextClass( - reminders: remindersModel.currentReminders, - period: scheduleModel.period, - subject: scheduleModel.subjects [scheduleModel.period?.id], - modified: scheduleModel.today.isModified, + const SizedBox (height: 20), + Text( + scheduleModel.hasSchool + ? "Schedule: ${scheduleModel.today.special.name}" + : "There is no school today", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline5, ), - // if school won't be over, show the next class - if ( - scheduleModel.nextPeriod != null && - !scheduleModel.today.isModified - ) NextClass ( - next: true, - reminders: remindersModel.nextReminders, - period: scheduleModel.nextPeriod, - subject: scheduleModel.subjects [scheduleModel.nextPeriod?.id], - modified: scheduleModel.today.isModified, + const SizedBox (height: 10), + ScheduleSlot( + children: [ + if (scheduleModel.hasSchool) NextClass( + reminders: remindersModel.currentReminders, + period: scheduleModel.period, + subject: scheduleModel.subjects [scheduleModel.period?.id], + modified: scheduleModel.today.isModified, + ), + if ( + scheduleModel.nextPeriod != null && + !scheduleModel.today.isModified + ) NextClass ( + next: true, + reminders: remindersModel.nextReminders, + period: scheduleModel.nextPeriod, + subject: scheduleModel.subjects [scheduleModel.nextPeriod?.id], + modified: scheduleModel.today.isModified, + ), + ] ), if (sportsModel.todayGames.isNotEmpty) ...[ const SizedBox(height: 10), - const Center( - child: Text( - "Sports games", - textScaleFactor: 1.5, - style: TextStyle(fontWeight: FontWeight.w300) - ) + Text( + "Sports games", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline5, ), const SizedBox(height: 10), for (final int index in sportsModel.todayGames) @@ -127,3 +152,21 @@ class HomePage extends StatelessWidget { ) ); } + + +class ScheduleSlot extends StatelessWidget { + final List children; + const ScheduleSlot({@required this.children}); + + @override + Widget build(BuildContext context) => ResponsiveBuilder( + builder: (_, LayoutInfo layout, __) => + layout.isDesktop && children.length > 1 + ? GridView.count( + shrinkWrap: true, + crossAxisCount: layout.isDesktop ? children.length : 1, + children: children + ) + : Column(children: children) + ); +} diff --git a/pubspec.lock b/pubspec.lock index 94b64c10f..03e70fdc3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,27 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + adaptive_breakpoints: + dependency: transitive + description: + name: adaptive_breakpoints + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4" + adaptive_components: + dependency: "direct main" + description: + name: adaptive_components + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1" + adaptive_navigation: + dependency: transitive + description: + name: adaptive_navigation + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.3" archive: dependency: transitive description: @@ -29,6 +50,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + breakpoint_scaffold: + dependency: "direct main" + description: + name: breakpoint_scaffold + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.2" characters: dependency: transitive description: @@ -590,4 +618,4 @@ packages: version: "2.2.1" sdks: dart: ">=2.12.0 <3.0.0" - flutter: ">=1.20.0" + flutter: ">=2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9c00af91b..77425a01e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,6 +28,8 @@ dependencies: shared_preferences: ^2.0.5 url_launcher: ^5.2.5 flutter_native_timezone: ^1.0.4 + breakpoint_scaffold: ^0.0.2 + adaptive_components: any # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From 8793245831afe1e57719d80cdce2d1d974c6951a Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 24 Mar 2021 18:46:34 -0400 Subject: [PATCH 093/251] Added null safety (Dart 2.12) to pubspec.yaml --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 77425a01e..6b430c7a9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,7 +10,7 @@ description: A new Flutter project. version: 2.1.1+1 environment: - sdk: ">=2.7.0 <=3.0.0" + sdk: ">=2.12.0 <=3.0.0" dependencies: flutter: From 6b873ed1bfd385a3ceb1d9148d52789b47048301 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 24 Mar 2021 18:46:55 -0400 Subject: [PATCH 094/251] Converted club data to nnbd --- lib/src/data/clubs/club.dart | 18 ++++++++---------- lib/src/data/clubs/message.dart | 8 +++----- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/lib/src/data/clubs/club.dart b/lib/src/data/clubs/club.dart index c7a416773..c378771ad 100644 --- a/lib/src/data/clubs/club.dart +++ b/lib/src/data/clubs/club.dart @@ -1,5 +1,3 @@ -import "package:meta/meta.dart"; - import "../contact_info.dart"; import "message.dart"; @@ -12,18 +10,18 @@ class Club { final String image; final List members; final List messages; - final String formUrl; + final String? formUrl; final bool phoneNumberRequested; final Map attendance; Club({ - @required this.name, - @required this.shortDescription, - @required this.description, - @required this.phoneNumberRequested, - @required this.captains, - @required this.facultyAdvisor, - @required this.image, + required this.name, + required this.shortDescription, + required this.description, + required this.phoneNumberRequested, + required this.captains, + required this.facultyAdvisor, + required this.image, this.formUrl, }) : members = [], diff --git a/lib/src/data/clubs/message.dart b/lib/src/data/clubs/message.dart index ae539516e..cf615ad4f 100644 --- a/lib/src/data/clubs/message.dart +++ b/lib/src/data/clubs/message.dart @@ -1,5 +1,3 @@ -import "package:meta/meta.dart"; - import "../contact_info.dart"; class Message { @@ -8,8 +6,8 @@ class Message { String body; Message({ - @required this.sender, - @required this.timestamp, - @required this.body, + required this.sender, + required this.timestamp, + required this.body, }); } From 60fb236fda36217c3ab13937ebd4143a080785a0 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 24 Mar 2021 18:51:49 -0400 Subject: [PATCH 095/251] Converted reminder data to nnbd --- .../data/reminders/period_reminder_time.dart | 14 ++++++------- lib/src/data/reminders/reminder_time.dart | 20 +++++++++---------- .../data/reminders/subject_reminder_time.dart | 12 +++++------ 3 files changed, 21 insertions(+), 25 deletions(-) diff --git a/lib/src/data/reminders/period_reminder_time.dart b/lib/src/data/reminders/period_reminder_time.dart index b814e160e..253b2b24d 100644 --- a/lib/src/data/reminders/period_reminder_time.dart +++ b/lib/src/data/reminders/period_reminder_time.dart @@ -1,5 +1,3 @@ -import "package:meta/meta.dart"; - import "reminder_time.dart"; /// A [ReminderTime] that depends on a name and period. @@ -14,9 +12,9 @@ class PeriodReminderTime extends ReminderTime { /// /// All parameters must be non-null. const PeriodReminderTime({ - @required this.dayName, - @required this.period, - @required bool repeats + required this.dayName, + required this.period, + required bool repeats }) : super (repeats: repeats, type: ReminderTimeType.period); /// Creates a new [ReminderTime] from JSON. @@ -45,9 +43,9 @@ class PeriodReminderTime extends ReminderTime { /// Returns true if [dayName] and [period] match this instance's fields. @override bool doesApply({ - @required String dayName, - @required String subject, - @required String period, + required String dayName, + required String subject, + required String period, }) => dayName == this.dayName && period == this.period; @override diff --git a/lib/src/data/reminders/reminder_time.dart b/lib/src/data/reminders/reminder_time.dart index 791ecc197..171a62de2 100644 --- a/lib/src/data/reminders/reminder_time.dart +++ b/lib/src/data/reminders/reminder_time.dart @@ -42,8 +42,8 @@ abstract class ReminderTime { /// Allows its subclasses to be `const`. const ReminderTime({ - @required this.repeats, - @required this.type + required this.repeats, + required this.type }); /// Initializes a new instance from JSON. @@ -77,11 +77,11 @@ abstract class ReminderTime { /// Used for cases where the caller doesn't care about the [ReminderTimeType], /// such as a UI reminder builder. factory ReminderTime.fromType({ - @required ReminderTimeType type, - @required String dayName, - @required String period, - @required String name, - @required bool repeats, + required ReminderTimeType type, + required String dayName, + required String period, + required String name, + required bool repeats, }) { switch (type) { case ReminderTimeType.period: return PeriodReminderTime( @@ -102,9 +102,9 @@ abstract class ReminderTime { /// /// All possible parameters are required. bool doesApply({ - @required String dayName, - @required String subject, - @required String period, + required String dayName, + required String subject, + required String period, }); /// Returns a String representation of this [ReminderTime]. diff --git a/lib/src/data/reminders/subject_reminder_time.dart b/lib/src/data/reminders/subject_reminder_time.dart index ed77568da..5580f27f1 100644 --- a/lib/src/data/reminders/subject_reminder_time.dart +++ b/lib/src/data/reminders/subject_reminder_time.dart @@ -1,5 +1,3 @@ -import "package:meta/meta.dart"; - import "reminder_time.dart"; /// A [ReminderTime] that depends on a subject. @@ -9,8 +7,8 @@ class SubjectReminderTime extends ReminderTime { /// Returns a new [SubjectReminderTime]. All parameters must be non-null. const SubjectReminderTime({ - @required this.name, - @required bool repeats, + required this.name, + required bool repeats, }) : super (repeats: repeats, type: ReminderTimeType.subject); /// Returns a new [SubjectReminderTime] from a JSON object. @@ -34,9 +32,9 @@ class SubjectReminderTime extends ReminderTime { /// matches the `subject` parameter. @override bool doesApply({ - @required String dayName, - @required String subject, - @required String period, + required String dayName, + required String subject, + required String period, }) => subject == name; @override From 5a71e81e3fbbe2092b23c639fcafcee28f5f7675 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 24 Mar 2021 22:07:29 -0400 Subject: [PATCH 096/251] Migrated schedule data to nnbd --- lib/src/data/schedule/activity.dart | 29 +++++++--------- lib/src/data/schedule/advisory.dart | 4 +-- lib/src/data/schedule/day.dart | 24 ++++--------- lib/src/data/schedule/period.dart | 54 ++++++++++++----------------- lib/src/data/schedule/special.dart | 44 +++++++++-------------- lib/src/data/schedule/subject.dart | 18 ++-------- lib/src/data/schedule/time.dart | 4 +-- 7 files changed, 67 insertions(+), 110 deletions(-) diff --git a/lib/src/data/schedule/activity.dart b/lib/src/data/schedule/activity.dart index 88c34fcbd..5f659d24d 100644 --- a/lib/src/data/schedule/activity.dart +++ b/lib/src/data/schedule/activity.dart @@ -4,23 +4,23 @@ import "package:meta/meta.dart"; @immutable class GradeActivity { /// The activity for freshmen. - final Activity freshmen; + final Activity? freshmen; /// The activity for sophomores. - final Activity sophomores; + final Activity? sophomores; /// The activity for juniors. - final Activity juniors; + final Activity? juniors; /// The activity for seniors. - final Activity seniors; + final Activity? seniors; /// Creates a container for activities by grade. const GradeActivity({ - @required this.freshmen, - @required this.sophomores, - @required this.juniors, - @required this.seniors, + required this.freshmen, + required this.sophomores, + required this.juniors, + required this.seniors, }); /// Creates a container for activities from a JSON object. @@ -100,10 +100,9 @@ class Activity { /// Creates an activity. const Activity({ - @required this.type, - @required this.message, - }) : - assert(type != null, "Type cannot be null"); + required this.type, + required this.message, + }); /// Creates an activity for each grade Activity.grade(GradeActivity gradeActivty) : @@ -116,7 +115,7 @@ class Activity { GradeActivity.fromJson(Map.from(json ["message"])) ) : Activity( - type: stringToActivityType[json ["type"]], + type: stringToActivityType[json ["type"]!]!, message: json ["message"] ); @@ -124,11 +123,9 @@ class Activity { String toString() { switch (type) { case ActivityType.misc: return message; - case ActivityType.advisory: - return "Advisory${message != null ? ' -- $message' : ''}"; + case ActivityType.advisory: return "Advisory -- $message"; case ActivityType.room: return message; default: return "Activity"; } } } - diff --git a/lib/src/data/schedule/advisory.dart b/lib/src/data/schedule/advisory.dart index 8a9d94031..f46ec551f 100644 --- a/lib/src/data/schedule/advisory.dart +++ b/lib/src/data/schedule/advisory.dart @@ -14,8 +14,8 @@ class Advisory { /// Holds advisory data. const Advisory({ - @required this.id, - @required this.room, + required this.id, + required this.room, }); /// Creates an advisory object from JSON. diff --git a/lib/src/data/schedule/day.dart b/lib/src/data/schedule/day.dart index fe40b45d9..db45b0b97 100644 --- a/lib/src/data/schedule/day.dart +++ b/lib/src/data/schedule/day.dart @@ -53,8 +53,8 @@ class Day { /// Returns a new Day from a [name] and [Special]. const Day({ - @required this.name, - @required this.special + required this.name, + required this.special }); /// Returns a Day from a JSON object. @@ -105,35 +105,25 @@ class Day { /// If [name] is null, returns null. /// Otherwise, returns [name] and [special]. /// If [special] was left as the default, will only return the [name]. - String get displayName => name == null - ? "No School" - : "$name${ - special == Special.regular || special == Special.rotate - ? '' : ' ${special.name}' - }"; + String get displayName => "$name ${special.name}"; /// Whether to say "a" or "an". /// /// Remember, [name] can be a letter and not a word. /// So a letter like "R" might need "an" while "B" would need "a". - String get n => {"A", "E", "I", "O", "U"}.contains(name [0]) + String get n => + {"A", "E", "I", "O", "U"}.contains(name [0]) || {"A", "M", "R", "E", "F"}.contains(name) ? "n" : ""; - /// Whether there is school on this day. - bool get school => name != null; - - /// Whether the times for this day are known. - bool get isModified => special == Special.modified; - /// The period right now. /// /// Uses [special] to calculate the time slots for all the different periods, /// and uses [DateTime.now()] to look up what period it is right now. /// /// See [Time] and [Range] for implementation details. - int get period { + int? get period { final Time time = Time.fromDateTime (DateTime.now()); - for (int index = 0; index < (special.periods?.length ?? 0); index++) { + for (int index = 0; index < (special.periods.length); index++) { final Range range = special.periods [index]; if ( range.contains(time) || // during class diff --git a/lib/src/data/schedule/period.dart b/lib/src/data/schedule/period.dart index 406d43af7..18902faca 100644 --- a/lib/src/data/schedule/period.dart +++ b/lib/src/data/schedule/period.dart @@ -16,7 +16,7 @@ class PeriodData { /// Note that some entries in the list may be null. /// They represent a free period in the schedule. /// See [PeriodData.fromJson] for more details. - static List getList(List json) => [ + static List getList(List json) => [ for (final dynamic periodJson in json) periodJson == null ? null : PeriodData.fromJson(Map.from(periodJson)) @@ -32,26 +32,19 @@ class PeriodData { /// A const constructor for a [PeriodData]. /// - /// It is an error to have a null [room] or [id]. Free periods should not be - /// represented by [PeriodData]s, instead use null. + /// Free periods should be represented by null and not [PeriodData]. const PeriodData ({ - @required this.room, - @required this.id - }) : assert ( - room != null && id != null, - "Room and id must both be non-null." - ); + required this.room, + required this.id + }); /// Returns a [PeriodData] from a JSON object. /// - /// If the JSON object is null, then it is considered a free period. - /// Otherwise, both `json ["room"]` and `json ["id"]` must be non-null. - factory PeriodData.fromJson(Map json) => json == null - ? null - : PeriodData( - room: json ["room"], - id: json ["id"] - ); + /// Both `json ["room"]` and `json ["id"]` must be non-null. + factory PeriodData.fromJson(Map json) => PeriodData( + room: json ["room"], + id: json ["id"] + ); @override String toString() => "PeriodData ($id, $room)"; @@ -75,7 +68,7 @@ class Period { /// /// If the time is not known (ie, the schedule is [Special.modified]), /// then this will be null. - final Range time; + final Range? time; /// A String representation of this period. /// @@ -85,18 +78,20 @@ class Period { final String period; /// The section ID and room for this period. - final PeriodData data; + /// + /// If null, it's a free period. + final PeriodData? data; /// The activity for this period. /// /// This is set in [Special.activities]. - final Activity activity; + final Activity? activity; /// Unpacks a [PeriodData] object and returns a Period. const Period({ - @required this.data, - @required this.time, - @required this.period, + required this.data, + required this.time, + required this.period, this.activity }); @@ -112,7 +107,7 @@ class Period { String toString() => "Period $period"; @override - int get hashCode => "$period-${data.id}".hashCode; + int get hashCode => "$period-${data?.id ?? ''}".hashCode; @override bool operator == (dynamic other) => other is Period && @@ -126,7 +121,7 @@ class Period { /// The section ID for this period. /// /// See [PeriodData.id]. - String get id => data?.id; + String? get id => data?.id; /// Returns a String representation of this period. /// @@ -141,8 +136,7 @@ class Period { /// 1. A period with null [data] will return "Free period" /// 2. A period with `period == "Homeroom"` will return "Homeroom" /// 3. A period with `period == "3"` will return the name of the [Subject]. - /// - String getName(Subject subject) => int.tryParse(period) != null && isFree + String getName(Subject? subject) => int.tryParse(period) != null && isFree ? "Free period" : subject?.name ?? period; @@ -156,12 +150,10 @@ class Period { /// 2. If [period] is a number, will display the period. /// 3. If `data.room` is not null, will display the room. /// 4. If `data.id` is valid, will return the name of the [Subject]. - /// - List getInfo (Subject subject) => [ + List getInfo (Subject? subject) => [ if (time != null) "Time: $time", if (int.tryParse(period) != null) "Period: $period", - if (data != null) "Room: ${data.room}", + if (data != null) "Room: ${data!.room}", if (subject != null) "Teacher: ${subject.teacher}", ]; } - diff --git a/lib/src/data/schedule/special.dart b/lib/src/data/schedule/special.dart index 58d5b4bc3..3a914ea5b 100644 --- a/lib/src/data/schedule/special.dart +++ b/lib/src/data/schedule/special.dart @@ -16,7 +16,7 @@ class Special { final String name; /// The time allotments for the periods. - final List periods; + final List periods; /// The indices of periods to skip. /// @@ -25,23 +25,23 @@ class Special { final List skip; /// The index in [periods] that represents Mincha. - final int mincha; + final int? mincha; /// The index in [periods] that represents homeroom. - final int homeroom; + final int? homeroom; /// Maps activities to the periods. final Map activities; /// A const constructor. const Special ( - this.name, + this.name, this.periods, { this.homeroom, this.mincha, - this.skip, - this.activities, + this.skip = const [], + this.activities = const {} } ); @@ -49,25 +49,23 @@ class Special { /// /// The value must either be: /// - /// - `null`, in which case, `null` will be returned. /// - a string, in which case it should be in the [specials] list, or /// - a map, in which case it will be interpreted as JSON. The JSON must have: /// - a "name" field, which should be a string. See [name]. /// - a "periods" field, which should be a list of [Range] JSON objects. /// - a "homeroom" field, which should be an integer. See [homeroom]. /// - a "skip" field, which should be a list of integers. See [skip]. - factory Special.fromJson(dynamic value) { - if (value == null) { - return null; - } else if (value is String) { - if (!stringToSpecial.containsKey(value)) { + factory Special.fromJson(Object value) { + if (value is String) { + final Special? builtInSpecial = stringToSpecial [value]; + if (builtInSpecial != null) { + return builtInSpecial; + } else { throw ArgumentError.value( value, "Special.fromJson: value", "'$value' needs to be one of ${stringToSpecial.keys.join(", ")}" - ); - } else { - return stringToSpecial [value]; + ); } } else if (value is Map) { final Map json = Map.from(value); @@ -96,7 +94,7 @@ class Special { /// Determines whether to use a Winter Friday or regular Friday schedule. /// /// Winter Fridays mean shorter periods, with an ultimately shorter dismissal. - static Special getWinterFriday([DateTime today]) { + static Special getWinterFriday([DateTime? today]) { final DateTime date = today ?? DateTime.now(); final int month = date.month, day = date.day; if (month >= Times.schoolStart && month < Times.winterFridayMonthStart) { @@ -124,10 +122,9 @@ class Special { /// /// This function is used to compare the [periods] property of two Specials. static bool deepEquals(List a, List b) => - (a == null) == (b == null) && - a?.length == b?.length && + a.length == b.length && [ - for (int index = 0; index < (a?.length ?? 0); index++) + for (int index = 0; index < (a.length); index++) index ].every( (int index) => a [index] == b [index] @@ -143,7 +140,7 @@ class Special { bool operator == (dynamic other) => other is Special && other.name == name && deepEquals(other.periods, periods) && - deepEquals(other.skip ?? const [], skip ?? const []) && + deepEquals(other.skip, skip) && other.mincha == mincha && other.homeroom == homeroom; @@ -391,12 +388,6 @@ class Special { mincha: 10 ); - /// A day where the schedule is not known. - static const Special modified = Special ( - "Modified", - null, - ); - /// A collection of all the [Special]s /// /// Used in the UI @@ -412,7 +403,6 @@ class Special { pmAssembly, rotate, early, - modified, covid, ]; diff --git a/lib/src/data/schedule/subject.dart b/lib/src/data/schedule/subject.dart index ad1743b50..c01ab7d67 100644 --- a/lib/src/data/schedule/subject.dart +++ b/lib/src/data/schedule/subject.dart @@ -1,10 +1,3 @@ -/// This library holds data classes for various schedule-related data. -/// -/// Classes here are used to abstract the weird schedule details -/// to make the code a whole lot simpler. -library schedule_dataclasses; - -import "dart:convert" show JsonUnsupportedObjectError; import "package:flutter/foundation.dart"; /// A subject, or class, that a student can take. @@ -37,8 +30,8 @@ class Subject { /// A const constructor for a [Subject]. const Subject ({ - @required this.name, - @required this.teacher + required this.name, + required this.teacher }); /// Returns a [Subject] instance from a JSON object. @@ -46,12 +39,7 @@ class Subject { /// The JSON map must have a `teacher` and `name` field. Subject.fromJson(Map json) : name = json ["name"], - teacher = json ["teacher"] - { - if (name == null || teacher == null) { - throw JsonUnsupportedObjectError (json.toString()); - } - } + teacher = json ["teacher"]; @override String toString() => "$name ($teacher)"; diff --git a/lib/src/data/schedule/time.dart b/lib/src/data/schedule/time.dart index cd9dda9ed..93794d8e8 100644 --- a/lib/src/data/schedule/time.dart +++ b/lib/src/data/schedule/time.dart @@ -13,7 +13,7 @@ class Time { final int minutes; /// A const constructor. - const Time (this.hour, this.minutes); + const Time(this.hour, this.minutes); /// Simplifies a [DateTime] object to a [Time]. Time.fromDateTime (DateTime date) : @@ -100,7 +100,7 @@ class Range { /// Returns whether [other] is in this range. bool contains (Time other) => start <= other && other <= end; - @override String toString() => "${start ?? ''}-${end ?? ''}"; + @override String toString() => "$start-$end"; @override bool operator == (dynamic other) => other is Range && other.start == start && other.end == end; From eccef88e36c95bf1a7b28a7aab1193bf0bd72edc Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 24 Mar 2021 22:07:39 -0400 Subject: [PATCH 097/251] Migrated the whole data library to nnbd --- lib/src/data/admin.dart | 8 ++--- lib/src/data/contact_info.dart | 8 ++--- lib/src/data/feedback.dart | 24 ++++++--------- lib/src/data/reminder.dart | 12 ++++---- lib/src/data/sports.dart | 45 ++++++++++++++++------------- lib/src/data/user.dart | 53 +++++++++++++--------------------- 6 files changed, 67 insertions(+), 83 deletions(-) diff --git a/lib/src/data/admin.dart b/lib/src/data/admin.dart index 48b35e287..c58193523 100644 --- a/lib/src/data/admin.dart +++ b/lib/src/data/admin.dart @@ -47,16 +47,16 @@ class Admin { /// Creates a user with administrative privileges. const Admin ({ - this.scopes, - this.specials, - this.email, + required this.scopes, + required this.specials, + required this.email, }); /// Creates an admin from a JSON entry. Admin.fromJson(Map json, List _scopes) : scopes = [ for (String scope in _scopes) - stringToScope [scope] + stringToScope [scope]! ], email = json ["email"], specials = [ diff --git a/lib/src/data/contact_info.dart b/lib/src/data/contact_info.dart index f24604997..cc385bd27 100644 --- a/lib/src/data/contact_info.dart +++ b/lib/src/data/contact_info.dart @@ -1,5 +1,3 @@ -import "package:meta/meta.dart"; - /// Holds personal information about the user. /// /// While [name] and [email] can be read from the authentication service, @@ -21,9 +19,9 @@ class ContactInfo { /// Bundles personal info about the user. ContactInfo({ - @required this.name, - @required this.email, - @required this.phoneNumber, + required this.name, + required this.email, + required this.phoneNumber, }); /// Creates a contact from JSON. diff --git a/lib/src/data/feedback.dart b/lib/src/data/feedback.dart index b63455d9b..0e6c7a9d8 100644 --- a/lib/src/data/feedback.dart +++ b/lib/src/data/feedback.dart @@ -1,16 +1,13 @@ -import "package:meta/meta.dart"; - /// Feedback from the user. -@immutable class Feedback { /// The message to the developer. final String message; /// The user's email - final String email; + final String? email; /// The user's name - final String name; + final String? name; /// If the feedback should be anonymized. final bool anonymous; @@ -23,17 +20,14 @@ class Feedback { /// If [anonymous] is true, [email] and [name] must be null. /// This is for privacy reasons. const Feedback({ - @required this.message, - @required this.email, - @required this.name, - @required this.anonymous, - @required this.timestamp + required this.message, + required this.anonymous, + required this.timestamp, + String? email, + String? name, }) : - assert( - !anonymous || (name == null && email == null), - "If the user does not consent to a follow up response, " - "their name and email must not be submitted." - ); + email = anonymous ? null : email, + name = anonymous ? null : name; /// A JSON representation of this feedback. Map toJson() => { diff --git a/lib/src/data/reminder.dart b/lib/src/data/reminder.dart index 28e9c199f..e7fb3be0b 100644 --- a/lib/src/data/reminder.dart +++ b/lib/src/data/reminder.dart @@ -14,10 +14,10 @@ class Reminder { /// All possible parameters are required. /// This function delegates logic to [ReminderTime.doesApply] static List getReminders({ - @required List reminders, - @required String dayName, - @required String period, - @required String subject, + required List reminders, + required String dayName, + required String period, + required String subject, }) => [ for (int index = 0; index < reminders.length; index++) if (reminders [index].time.doesApply( @@ -43,8 +43,8 @@ class Reminder { /// Creates a new reminder. const Reminder({ - @required this.message, - this.time, + required this.message, + required this.time, }); /// Creates a new [Reminder] from a JSON object. diff --git a/lib/src/data/sports.dart b/lib/src/data/sports.dart index b023d6c05..ee68555fa 100644 --- a/lib/src/data/sports.dart +++ b/lib/src/data/sports.dart @@ -65,7 +65,11 @@ class Scores { final bool isHome; /// Holds the scores for a [SportsGame]. - const Scores(this.ramazScore, this.otherScore, {@required this.isHome}); + const Scores({ + required this.ramazScore, + required this.otherScore, + required this.isHome + }); /// Creates a [Scores] object from a JSON entry. /// @@ -99,7 +103,7 @@ class Scores { bool get didWin => ramazScore > otherScore; /// Gets the score for either the home team or the away team. - int getScore({bool home}) => home == isHome + int getScore({required bool home}) => home == isHome ? ramazScore : otherScore; } @@ -110,7 +114,8 @@ class SportsGame { /// /// Useful for the [Sport] enum. static String capitalize(Sport sport) => - sportToString [sport] [0].toUpperCase() + sportToString [sport].substring(1); + sportToString [sport]! [0].toUpperCase() + + sportToString [sport]!.substring(1); /// Converts a list of JSON entries into a list of [SportsGame]s. /// @@ -151,22 +156,22 @@ class SportsGame { /// Whether the game is being played at home or somewhere else. /// /// This affects the UI representation of the game, as well as [Scores.isHome]. - final bool home; + final bool isHome; /// The scores for this game. /// /// The [Scores] dataclass holds helper methods to simplify logic about who - /// won, and which score to get depending on [home]. - final Scores scores; + /// won, and which score to get depending on [isHome]. + final Scores? scores; /// Creates a game dataclass. const SportsGame({ - @required this.sport, - @required this.date, - @required this.times, - @required this.team, - @required this.opponent, - @required this.home, + required this.sport, + required this.date, + required this.times, + required this.team, + required this.opponent, + required this.isHome, this.scores, }); @@ -182,11 +187,11 @@ class SportsGame { /// - an "opponent" field (String) /// - a "scores" field. See [Scores.fromJson] for format. SportsGame.fromJson(Map json) : - sport = stringToSport [json ["sport"]], + sport = stringToSport [json ["sport"]]!, date = DateTime.parse(json ["date"]), times = Range.fromJson(json ["times"]), team = json ["team"], - home = json ["home"], + isHome = json ["isHome"], opponent = json ["opponent"], scores = json ["scores"] == null ? null : Scores.fromJson( Map.from(json ["scores"]) @@ -198,13 +203,13 @@ class SportsGame { bool operator == (dynamic other) => other is SportsGame && other.sport == sport && other.opponent == opponent && - other.home == home && + other.isHome == isHome && other.team == team && other.date.isSameDay(date) && other.times == times; @override - int get hashCode => "$home-$opponent-$sport-$team-$date-$times".hashCode; + int get hashCode => "$isHome-$opponent-$sport-$team-$date-$times".hashCode; /// Converts this game to JSON. /// @@ -215,7 +220,7 @@ class SportsGame { "date": date.toString(), "times": times.toJson(), "team": team, - "home": home, + "isHome": isHome, "opponent": opponent, "scores": scores?.toJson(), }; @@ -237,7 +242,7 @@ class SportsGame { SportsGame replaceScores(Scores newScores) => SportsGame( sport: sport, team: team, - home: home, + isHome: isHome, date: date, opponent: opponent, times: times, @@ -245,10 +250,10 @@ class SportsGame { ); /// The name of the home team. - String get homeTeam => home ? "Ramaz" : opponent; + String get homeTeam => isHome ? "Ramaz" : opponent; /// The name of the away team. - String get awayTeam => home ? opponent : "Ramaz"; + String get awayTeam => isHome ? opponent : "Ramaz"; /// Specifies which team is away and which team is home. String get description => "$awayTeam @ $homeTeam"; diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index a8208922c..40da7ee31 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -49,10 +49,10 @@ class User { /// /// Periods may be null to indicate free periods (or, in the case of faculty, /// periods where they don't teach). - final Map> schedule; + final Map> schedule; /// The advisory for this user. - final Advisory advisory; + final Advisory? advisory; /// This user's contact information. final ContactInfo contactInfo; @@ -60,7 +60,7 @@ class User { /// The grade this user is in. /// /// This property is null for faculty. - final Grade grade; + final Grade? grade; /// The IDs of the clubs this user attends. /// @@ -74,12 +74,12 @@ class User { /// Creates a new user. const User({ - @required this.schedule, - @required this.advisory, - @required this.contactInfo, - @required this.grade, - @required this.registeredClubs, - @required this.dayNames, + required this.schedule, + required this.contactInfo, + required this.registeredClubs, + required this.dayNames, + this.grade, + this.advisory, }); /// Creates a new user from JSON. @@ -97,15 +97,15 @@ class User { ), grade = intToGrade [json ["grade"]], registeredClubs = json ["registeredClubs"] == null - ? null : List.from(json ["registeredClubs"]); + ? [] : List.from(json ["registeredClubs"]); /// Gets the unique section IDs for the courses this user is enrolled in. /// /// For teachers, these will be the courses they teach. Set get sectionIDs => { - for (final List daySchedule in schedule.values) - for (final PeriodData period in daySchedule) - if (period?.id != null) + for (final List daySchedule in schedule.values) + for (final PeriodData? period in daySchedule) + if (period != null) period.id }; @@ -117,44 +117,31 @@ class User { /// /// See [Special] for an explanation of the different factors this method /// takes into account. - /// - /// TODO: consolidate behavior on no school. List getPeriods(Day day) { - if (!day.school) { - return []; - } - final Special special = day.special; + final int periodCount = special.periods.length; int periodIndex = 0; - - Range getTime(int index) => day.isModified - ? null : special.periods [index]; - - final int periodCount = day.isModified - ? schedule [day.name].length - : special.periods.length; - return [ for (int index = 0; index < periodCount; index++) if (special.homeroom == index) Period( data: null, period: "Homeroom", - time: getTime(index), + time: special.periods [index], activity: null, ) else if (special.mincha == index) Period( data: null, period: "Mincha", - time: getTime(index), + time: special.periods [index], activity: null, - ) else if (special.skip?.contains(index) ?? false) Period( + ) else if (special.skip.contains(index)) Period( data: null, period: "Free period", - time: getTime(index), + time: special.periods [index], activity: null, ) else Period( - data: schedule [day.name] [periodIndex], + data: schedule [day.name]! [periodIndex], period: (++periodIndex).toString(), - time: getTime(index), + time: special.periods [index], activity: null, ) ]; From d9b4afad9fc825889eae8aaf01a548d5b15b20df Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 24 Mar 2021 23:12:09 -0400 Subject: [PATCH 098/251] Migrated data models to NNBD --- lib/src/data/reminder.dart | 6 +- .../data/reminders/period_reminder_time.dart | 6 +- lib/src/data/reminders/reminder_time.dart | 6 +- .../data/reminders/subject_reminder_time.dart | 6 +- lib/src/data/schedule/day.dart | 11 +-- lib/src/data/schedule/period.dart | 7 +- lib/src/models/data/reminders.dart | 33 ++++----- lib/src/models/data/schedule.dart | 69 +++++++++---------- lib/src/models/data/sports.dart | 12 ++-- lib/src/models/data/user.dart | 18 ++--- 10 files changed, 81 insertions(+), 93 deletions(-) diff --git a/lib/src/data/reminder.dart b/lib/src/data/reminder.dart index e7fb3be0b..e323f80cf 100644 --- a/lib/src/data/reminder.dart +++ b/lib/src/data/reminder.dart @@ -15,9 +15,9 @@ class Reminder { /// This function delegates logic to [ReminderTime.doesApply] static List getReminders({ required List reminders, - required String dayName, - required String period, - required String subject, + required String? dayName, + required String? period, + required String? subject, }) => [ for (int index = 0; index < reminders.length; index++) if (reminders [index].time.doesApply( diff --git a/lib/src/data/reminders/period_reminder_time.dart b/lib/src/data/reminders/period_reminder_time.dart index 253b2b24d..402701425 100644 --- a/lib/src/data/reminders/period_reminder_time.dart +++ b/lib/src/data/reminders/period_reminder_time.dart @@ -43,9 +43,9 @@ class PeriodReminderTime extends ReminderTime { /// Returns true if [dayName] and [period] match this instance's fields. @override bool doesApply({ - required String dayName, - required String subject, - required String period, + required String? dayName, + required String? subject, + required String? period, }) => dayName == this.dayName && period == this.period; @override diff --git a/lib/src/data/reminders/reminder_time.dart b/lib/src/data/reminders/reminder_time.dart index 171a62de2..2dd667f93 100644 --- a/lib/src/data/reminders/reminder_time.dart +++ b/lib/src/data/reminders/reminder_time.dart @@ -102,9 +102,9 @@ abstract class ReminderTime { /// /// All possible parameters are required. bool doesApply({ - required String dayName, - required String subject, - required String period, + required String? dayName, + required String? subject, + required String? period, }); /// Returns a String representation of this [ReminderTime]. diff --git a/lib/src/data/reminders/subject_reminder_time.dart b/lib/src/data/reminders/subject_reminder_time.dart index 5580f27f1..e16712328 100644 --- a/lib/src/data/reminders/subject_reminder_time.dart +++ b/lib/src/data/reminders/subject_reminder_time.dart @@ -32,9 +32,9 @@ class SubjectReminderTime extends ReminderTime { /// matches the `subject` parameter. @override bool doesApply({ - required String dayName, - required String subject, - required String period, + required String? dayName, + required String? subject, + required String? period, }) => subject == name; @override diff --git a/lib/src/data/schedule/day.dart b/lib/src/data/schedule/day.dart index db45b0b97..d47b9904f 100644 --- a/lib/src/data/schedule/day.dart +++ b/lib/src/data/schedule/day.dart @@ -16,7 +16,7 @@ class Day { /// /// Each element of [data]'s months should be a JSON representation of a [Day]. /// See [Day.fromJson] for how to represent a Day in JSON. - static List> getCalendar(List>> data) => [ + static List> getCalendar(List>> data) => [ for (final List> month in data) getMonth(month) ]; @@ -24,9 +24,10 @@ class Day { /// Parses a particular month from JSON. /// /// See [Day.getCalendar] for details. - static List getMonth(List> data) => [ - for (final Map json in data) - Day.fromJson(json) + static List getMonth(List?> data) => [ + for (final Map? json in data) + if (json == null) null + else Day.fromJson(json) ]; /// Converts a month in the calendar to JSON. @@ -38,7 +39,7 @@ class Day { ]; /// Gets the Day for [date] in the [calendar]. - static Day getDate(List> calendar, DateTime date) => + static Day? getDate(List> calendar, DateTime date) => calendar [date.month - 1] [date.day - 1]; /// The name of this day. diff --git a/lib/src/data/schedule/period.dart b/lib/src/data/schedule/period.dart index 18902faca..a92061a19 100644 --- a/lib/src/data/schedule/period.dart +++ b/lib/src/data/schedule/period.dart @@ -65,10 +65,7 @@ class PeriodData { @immutable class Period { /// The time this period takes place. - /// - /// If the time is not known (ie, the schedule is [Special.modified]), - /// then this will be null. - final Range? time; + final Range time; /// A String representation of this period. /// @@ -151,7 +148,7 @@ class Period { /// 3. If `data.room` is not null, will display the room. /// 4. If `data.id` is valid, will return the name of the [Subject]. List getInfo (Subject? subject) => [ - if (time != null) "Time: $time", + "Time: $time", if (int.tryParse(period) != null) "Period: $period", if (data != null) "Room: ${data!.room}", if (subject != null) "Teacher: ${subject.teacher}", diff --git a/lib/src/models/data/reminders.dart b/lib/src/models/data/reminders.dart index fc46a916c..b50393c2b 100644 --- a/lib/src/models/data/reminders.dart +++ b/lib/src/models/data/reminders.dart @@ -1,5 +1,3 @@ -import "package:meta/meta.dart"; - import "package:ramaz/data.dart"; import "package:ramaz/services.dart"; @@ -13,22 +11,22 @@ import "model.dart"; // ignore: prefer_mixin class Reminders extends Model { /// The reminders for the user. - List reminders; + late final List reminders; /// The reminders that apply for this period. /// /// This is managed by the Schedule data model. - List currentReminders; + List currentReminders = []; /// The reminders that apply for next period. /// /// This is managed by the Schedule data model. - List nextReminders; + List nextReminders = []; /// Reminders that applied for previous periods. /// /// These reminders will be marked for deletion if they do not repeat. - List readReminders; + final List readReminders = []; @override Future init() async { @@ -39,7 +37,6 @@ class Reminders extends Model { ) Reminder.fromJson(json) ]; - readReminders = []; } /// Whether any reminder applies to the current period. @@ -65,9 +62,9 @@ class Reminders extends Model { /// This method is a wrapper around [Reminder.getReminders], and should only /// be called by an object with access to the relevant period. List getReminders({ - @required String subject, - @required String period, - @required String dayName, + required String? subject, + required String? period, + required String? dayName, }) => Reminder.getReminders( reminders: reminders, subject: subject, @@ -86,21 +83,15 @@ class Reminders extends Model { readReminders ]; for (final List remindersList in reminderLists) { - int toRemove; - for (final int index in remindersList ?? []) { - if (index == changedIndex) { - toRemove = index; - break; - } - } - if (toRemove != null) { - remindersList.remove(toRemove); + final int removeIndex = remindersList.indexOf(changedIndex); + if (removeIndex != -1) { + remindersList.removeAt(removeIndex); } } } /// Replaces a reminder at a given index. - void replaceReminder(int index, Reminder reminder) { + void replaceReminder(int index, Reminder? reminder) { if (reminder == null) { return; } @@ -112,7 +103,7 @@ class Reminders extends Model { } /// Creates a new reminder. - void addReminder(Reminder reminder) { + void addReminder(Reminder? reminder) { if (reminder == null) { return; } diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index a3f1c10ed..2b8cd49e9 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -18,37 +18,37 @@ class Schedule extends Model { static const timerInterval = Duration (minutes: 1); /// The current user. - User user; + late User user; /// The subjects this user has. - Map subjects; + late Map subjects; /// The calendar for the month. - List> calendar; + late List> calendar; /// A timer that updates the period. /// /// This timer fires once every [timerInterval], and calls [onNewPeriod] /// when it does. - Timer timer; + late Timer? timer; /// The [Day] that represents today. - Day today; + Day? today; /// The current period. - Period period; + Period? period; /// The next period. - Period nextPeriod; + Period? nextPeriod; /// A list of today's periods. - List periods; + List? periods; /// The index that represents [period]'s location in [periods]. - int periodIndex; + int? periodIndex; /// The reminders data model. - Reminders reminders; + late Reminders reminders; @override Future init() async { @@ -68,7 +68,7 @@ class Schedule extends Model { @override void dispose() { - Models.instance.reminders?.removeListener(remindersListener); + Models.instance.reminders.removeListener(remindersListener); timer?.cancel(); super.dispose(); } @@ -79,13 +79,13 @@ class Schedule extends Model { void remindersListener() => updateReminders(scheduleNotifications: true); /// The current subject. - Subject get subject => subjects [period?.id]; + Subject? get subject => subjects [period?.id]; /// The next subject. - Subject get nextSubject => subjects [nextPeriod?.id]; + Subject? get nextSubject => subjects [nextPeriod?.id]; /// Whether there is school today. - bool get hasSchool => today.school; + bool get hasSchool => today != null; /// Changes the current day. /// @@ -97,9 +97,9 @@ class Schedule extends Model { // initialize today today = Day.getDate(calendar, now); timer?.cancel(); - if (today.school) { + if (hasSchool) { // initialize periods. - periods = user.getPeriods(today); + periods = user.getPeriods(today!); // initialize the current period. onNewPeriod(first: true); // initialize the timer. See comments for [timer]. @@ -121,14 +121,13 @@ class Schedule extends Model { } // no school today. - if (!today.school) { + if (!hasSchool) { period = nextPeriod = periods = null; return; } // So we have school today... - final int newIndex = today.period; - + final int? newIndex = today?.period; // Maybe the day changed if (newIndex != null && newIndex == periodIndex) { @@ -140,15 +139,15 @@ class Schedule extends Model { updateReminders(scheduleNotifications: first); // School ended - if (periodIndex == null) { + if (newIndex == null) { period = nextPeriod = null; return; } // Period changed and there is still school. - period = periods [periodIndex]; - nextPeriod = periodIndex < periods.length - 1 - ? periods [periodIndex + 1] + period = periods! [newIndex]; + nextPeriod = newIndex < periods!.length - 1 + ? periods! [newIndex + 1] : null; } @@ -164,15 +163,15 @@ class Schedule extends Model { ..currentReminders = reminders.getReminders( period: period?.period, subject: subjects [period?.id]?.name, - dayName: today.name, + dayName: today?.name, ) ..nextReminders = reminders.getReminders( period: nextPeriod?.period, subject: subjects [nextPeriod?.id]?.name, - dayName: today.name, + dayName: today?.name, ); - (reminders.currentReminders ?? []).forEach(reminders.markShown); + reminders.currentReminders.forEach(reminders.markShown); if (scheduleNotifications) { Future(scheduleReminders); @@ -189,17 +188,17 @@ class Schedule extends Model { final DateTime now = DateTime.now(); // No school today/right now - if (!today.school || periodIndex == null || periods == null) { + if (!hasSchool || periodIndex == null || periods == null) { return; } // For all periods starting from periodIndex, schedule applicable reminders. - for (int index = periodIndex; index < periods.length; index++) { - final Period period = periods [index]; + for (int index = periodIndex!; index < periods!.length; index++) { + final Period period = periods! [index]; for (final int reminderIndex in reminders.getReminders( - period: period?.period, - subject: subjects [period?.id]?.name, - dayName: today.name, + period: period.period, + subject: subjects [period.id]?.name, + dayName: today?.name, )) { Services.instance.notifications.scheduleNotification( date: DateTime( @@ -227,12 +226,12 @@ class Schedule extends Model { bool isValidReminder(Reminder reminder) { switch(reminder.time.type) { case ReminderTimeType.period: - final PeriodReminderTime time = reminder.time; + final PeriodReminderTime time = reminder.time as PeriodReminderTime; final Iterable dayNames = user.schedule.keys; return dayNames.contains(time.dayName) - && int.parse(time.period) <= user.schedule [time.dayName].length; + && int.parse(time.period) <= user.schedule [time.dayName]!.length; case ReminderTimeType.subject: - final SubjectReminderTime time = reminder.time; + final SubjectReminderTime time = reminder.time as SubjectReminderTime; return subjects.values.any((Subject subject) => subject.name == time.name); default: throw StateError("Reminder <$reminder> has invalid ReminderTime"); } diff --git a/lib/src/models/data/sports.dart b/lib/src/models/data/sports.dart index 42c4cfdb7..35f2ea261 100644 --- a/lib/src/models/data/sports.dart +++ b/lib/src/models/data/sports.dart @@ -15,16 +15,16 @@ class Sports extends Model { static const Duration _minute = Duration(minutes: 1); /// A timer to refresh [todayGames]. - Timer timer; + late Timer timer; /// Helps partition [games] by past and future. - DateTime now; + DateTime now = DateTime.now(); /// A list of all the games taking place. - List games; + List games = []; /// A list of games being played today to be showed on the home screen. - List todayGames; + List todayGames = []; /// Loads data from the device and @override @@ -54,7 +54,7 @@ class Sports extends Model { ]; /// Adds a game to the database. - Future addGame(SportsGame game) async { + Future addGame(SportsGame? game) async { if (game == null) { return; } @@ -66,7 +66,7 @@ class Sports extends Model { /// /// Since [SportsGame] objects are immutable, they cannot be changed in place. /// Instead, they are replaced with a new one. - Future replace(int index, SportsGame newGame) async { + Future replace(int index, SportsGame? newGame) async { if (newGame == null) { return; } diff --git a/lib/src/models/data/user.dart b/lib/src/models/data/user.dart index b67e8244a..246756114 100644 --- a/lib/src/models/data/user.dart +++ b/lib/src/models/data/user.dart @@ -11,18 +11,18 @@ import "model.dart"; /// UI is in one place. class UserModel extends Model { /// The user object. - User data; + late User data; /// The admin object. /// /// If the user is not an admin ([Auth.isAdmin]) is false, this will be null. - Admin admin; + Admin? admin; /// The subjects this user has. /// /// For students this will be the courses they attend. For teachers, this /// will be the courses they teach. - Map subjects; + late Map subjects; /// Whether this user is an admin. /// @@ -46,31 +46,31 @@ class UserModel extends Model { /// Saves the admin data to the database. Future saveAdmin() async { - await Services.instance.database.setAdmin(admin.toJson()); + await Services.instance.database.setAdmin(admin!.toJson()); notifyListeners(); } /// Adds a custom [Special] to the admin's profile. - Future addSpecialToAdmin(Special special) async { + Future addSpecialToAdmin(Special? special) async { if (special == null) { return; } - admin.specials.add(special); + admin!.specials.add(special); return saveAdmin(); } /// Replaces the custom [Special] at the given index in the user's profile. - Future replaceAdminSpecial(int index, Special special) async { + Future replaceAdminSpecial(int index, Special? special) async { if (special == null) { return; } - admin.specials [index] = special; + admin?.specials [index] = special; return saveAdmin(); } /// Removes a custom [Special] at a given index from the user's profile. Future removeSpecialFromAdmin(int index) { - admin.specials.removeAt(index); + admin!.specials.removeAt(index); return saveAdmin(); } } From e6ef78b6322c420011581065be9b3b764c4e85ef Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 25 Mar 2021 15:01:53 -0400 Subject: [PATCH 099/251] Migrated view models to nnbd --- lib/models.dart | 31 +++++----- lib/src/data/reminders/reminder_time.dart | 12 ++-- lib/src/data/schedule/day.dart | 6 +- lib/src/models/view/builders/day_builder.dart | 32 +++++------ .../view/builders/reminder_builder.dart | 47 ++++++++------- .../models/view/builders/special_builder.dart | 36 ++++++------ .../models/view/builders/sports_builder.dart | 57 +++++++++---------- lib/src/models/view/calendar_editor.dart | 14 ++--- lib/src/models/view/feedback.dart | 10 ++-- lib/src/models/view/home.dart | 4 +- lib/src/models/view/schedule.dart | 38 ++++++------- lib/src/models/view/sports.dart | 10 ++-- 12 files changed, 143 insertions(+), 154 deletions(-) diff --git a/lib/models.dart b/lib/models.dart index 337553f5d..9340ead9c 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -62,42 +62,37 @@ class Models extends Model { static Models instance = Models(); /// The reminders data model. - Reminders reminders; + Reminders reminders = Reminders(); /// The schedule data model. - Schedule schedule; + Schedule schedule = Schedule(); /// The sports data model. - Sports sports; + Sports sports = Sports(); /// The user data model. - UserModel user; + UserModel user = UserModel(); + + /// Whether the data models have been initialized. + bool isReady = false; @override Future init() async { - user = UserModel(); - reminders = Reminders(); - schedule = Schedule(); - sports = Sports(); - await user.init(); await reminders.init(); await schedule.init(); await sports.init(refresh: true); + isReady = true; } @override // This object can be revived using [init]. // ignore: must_call_super void dispose() { - schedule?.dispose(); - reminders?.dispose(); - sports?.dispose(); - user?.dispose(); - - reminders = null; - schedule = null; - sports = null; - user = null; + schedule.dispose(); + reminders.dispose(); + sports.dispose(); + user.dispose(); + isReady = false; } } diff --git a/lib/src/data/reminders/reminder_time.dart b/lib/src/data/reminders/reminder_time.dart index 2dd667f93..9cdc6e34f 100644 --- a/lib/src/data/reminders/reminder_time.dart +++ b/lib/src/data/reminders/reminder_time.dart @@ -78,18 +78,18 @@ abstract class ReminderTime { /// such as a UI reminder builder. factory ReminderTime.fromType({ required ReminderTimeType type, - required String dayName, - required String period, - required String name, + required String? dayName, + required String? period, + required String? name, required bool repeats, }) { switch (type) { case ReminderTimeType.period: return PeriodReminderTime( - period: period, - dayName: dayName, + period: period!, + dayName: dayName!, repeats: repeats, ); case ReminderTimeType.subject: return SubjectReminderTime( - name: name, + name: name!, repeats: repeats, ); default: throw ArgumentError.notNull("type"); } diff --git a/lib/src/data/schedule/day.dart b/lib/src/data/schedule/day.dart index d47b9904f..9eec997af 100644 --- a/lib/src/data/schedule/day.dart +++ b/lib/src/data/schedule/day.dart @@ -33,9 +33,9 @@ class Day { /// Converts a month in the calendar to JSON. /// /// This is how it is currently stored in the database. - static List> monthToJson(List month) => [ - for (final Day day in month) - day.toJson() + static List?> monthToJson(List month) => [ + for (final Day? day in month) + day?.toJson() ]; /// Gets the Day for [date] in the [calendar]. diff --git a/lib/src/models/view/builders/day_builder.dart b/lib/src/models/view/builders/day_builder.dart index a8c927178..8824936e2 100644 --- a/lib/src/models/view/builders/day_builder.dart +++ b/lib/src/models/view/builders/day_builder.dart @@ -11,16 +11,18 @@ class DayBuilderModel with ChangeNotifier { /// This is used to create [userSpecials]. final UserModel admin; - String _name; - Special _special; bool _hasSchool; + String? _name; + Special? _special; /// Creates a view model for modifying a [Day]. - DayBuilderModel(Day day) : admin = Models.instance.user { + DayBuilderModel(Day? day) : + admin = Models.instance.user, + _name = day?.name, + _special = day?.special, + _hasSchool = day == null + { admin.addListener(notifyListeners); - _name = day?.name; - _special = day?.special; - _hasSchool = day?.school; } @override @@ -30,15 +32,15 @@ class DayBuilderModel with ChangeNotifier { } /// The name for this day. - String get name => _name; - set name (String value) { + String? get name => _name; + set name (String? value) { _name = value; notifyListeners(); } /// The special for this day. - Special get special => _special; - set special (Special value) { + Special? get special => _special; + set special (Special? value) { if (value == null) { return; } @@ -57,9 +59,6 @@ class DayBuilderModel with ChangeNotifier { } /// If this day has school. - /// - /// This is different than [Day.school] because it doesn't belong to [day], - /// it dictates whether [name] and [special] is used in [day]. bool get hasSchool => _hasSchool; set hasSchool(bool value) { _hasSchool = value; @@ -69,15 +68,14 @@ class DayBuilderModel with ChangeNotifier { /// The day being created (in present state). /// /// The model uses [name] and [special]. - Day get day => hasSchool - ? Day(name: name, special: special) - : Day(name: null, special: presetSpecials [0]); + Day? get day => !hasSchool ? null : + Day(name: name ?? "", special: presetSpecials.first); /// The built-in specials. List get presetSpecials => Special.specials; /// Custom user-created specials. - List get userSpecials => admin.admin.specials; + List get userSpecials => admin.admin!.specials; /// Whether this day is ready to be created. bool get ready => name != null && special != null; diff --git a/lib/src/models/view/builders/reminder_builder.dart b/lib/src/models/view/builders/reminder_builder.dart index 58a6701fe..3952ee796 100644 --- a/lib/src/models/view/builders/reminder_builder.dart +++ b/lib/src/models/view/builders/reminder_builder.dart @@ -9,10 +9,10 @@ class RemindersBuilderModel with ChangeNotifier { final Schedule _schedule; /// The type of reminder the user is building. - ReminderTimeType type; + ReminderTimeType? type; /// The time this reminder will be displayed. - ReminderTime time; + ReminderTime? time; /// The message for this reminder. String message = ""; @@ -24,17 +24,17 @@ class RemindersBuilderModel with ChangeNotifier { bool shouldRepeat = false; /// The name of the day. - String dayName; + String? dayName; /// The period this reminder should be displayed. /// /// Only relevant for [PeriodReminderTime]. - String period; + String? period; /// The name of the class this reminder should be displayed. /// /// Only relevant for [SubjectReminderTime]. - String course; + String? course; /// All the names of the user's courses. final List courses; @@ -43,7 +43,7 @@ class RemindersBuilderModel with ChangeNotifier { /// /// If [reminder] is not null, then the relevant fields of this /// class are filled in with the corresponding fields of the reminder. - RemindersBuilderModel(Reminder reminder) : + RemindersBuilderModel([Reminder? reminder]) : _schedule = Models.instance.schedule, courses = [ for (final Subject subject in Models.instance.schedule.subjects.values) @@ -56,17 +56,16 @@ class RemindersBuilderModel with ChangeNotifier { message = reminder.message; time = reminder.time; - - shouldRepeat = time.repeats; - type = time.type; + shouldRepeat = time!.repeats; + type = time!.type; switch (type) { case ReminderTimeType.period: - final PeriodReminderTime reminderTime = time; + final PeriodReminderTime reminderTime = time as PeriodReminderTime; period = reminderTime.period; dayName = reminderTime.dayName; break; case ReminderTimeType.subject: - final SubjectReminderTime reminderTime = time; + final SubjectReminderTime reminderTime = time as SubjectReminderTime; course = reminderTime.name; break; default: @@ -78,7 +77,7 @@ class RemindersBuilderModel with ChangeNotifier { Reminder build() => Reminder ( message: message, time: ReminderTime.fromType( - type: type, + type: type!, dayName: dayName, period: period, name: course, @@ -94,23 +93,27 @@ class RemindersBuilderModel with ChangeNotifier { /// - [type] is null, /// - [type] is [ReminderTimeType.period] and [dayName] or [period] is null, or /// - [type] is [ReminderTimeType.subject] and [course] is null. - /// - bool get ready => (message?.isNotEmpty ?? false) && - type != null && - (type != ReminderTimeType.period || - (dayName != null && period != null) - ) && ( - type != ReminderTimeType.subject || course != null - ); + bool get ready { + if (message.isEmpty) { + return false; + } + switch (type) { + case ReminderTimeType.period: + return dayName != null && period != null; + case ReminderTimeType.subject: + return type != ReminderTimeType.subject || course != null; + case null: return false; + } + } /// A list of all the periods in [dayName]. /// /// Make sure this field is only accessed *after* setting [dayName]. - List get periods { + List? get periods { if (dayName == null) { return null; } - final List schedule = _schedule.user.schedule [dayName]; + final List schedule = _schedule.user.schedule [dayName]!; return [ for (int index = 0; index < schedule.length; index++) (index + 1).toString() diff --git a/lib/src/models/view/builders/special_builder.dart b/lib/src/models/view/builders/special_builder.dart index 01f0787c7..59569abe2 100644 --- a/lib/src/models/view/builders/special_builder.dart +++ b/lib/src/models/view/builders/special_builder.dart @@ -6,7 +6,7 @@ import "package:ramaz/data.dart"; // ignore: prefer_mixin class SpecialBuilderModel with ChangeNotifier { /// The special that this special is based on. - Special preset; + Special? preset; /// Numbers for the periods. /// @@ -14,8 +14,9 @@ class SpecialBuilderModel with ChangeNotifier { List periods = []; List _times = []; List _skips = []; - String _name; - int _numPeriods = 0, _mincha, _homeroom; + String? _name; + int _numPeriods = 0; + int? _mincha, _homeroom; /// The times for the periods. /// @@ -38,8 +39,8 @@ class SpecialBuilderModel with ChangeNotifier { /// The name of this special. /// /// See [Special.name]. - String get name => _name; - set name (String value) { + String? get name => _name; + set name (String? value) { _name = value; notifyListeners(); } @@ -88,8 +89,8 @@ class SpecialBuilderModel with ChangeNotifier { /// The index of Mincha in [times]. /// /// See [Special.mincha]. - int get mincha => _mincha; - set mincha (int value) { + int? get mincha => _mincha; + set mincha (int? value) { _mincha = value; periods = getIndices(); notifyListeners(); @@ -98,24 +99,23 @@ class SpecialBuilderModel with ChangeNotifier { /// The index of homeroom in [times]. /// /// See [Special.homeroom]. - int get homeroom => _homeroom; - set homeroom (int value) { + int? get homeroom => _homeroom; + set homeroom (int? value) { _homeroom = value; periods = getIndices(); notifyListeners(); } /// Whether this special is ready to be built. - bool get ready => numPeriods != null && - numPeriods > 0 && - times.isNotEmpty && - name != null && name.isNotEmpty && - !Special.specials.any((Special special) => special.name == name) && - (preset == null || special != preset); + bool get ready => numPeriods > 0 + && times.isNotEmpty + && name != null && name!.isNotEmpty + && !Special.specials.any((Special special) => special.name == name) + && (preset == null || special != preset); /// The special being built. Special get special => Special( - name, times, + name!, times, homeroom: homeroom, mincha: mincha, skip: skips @@ -138,13 +138,13 @@ class SpecialBuilderModel with ChangeNotifier { /// Sets properties of this special based on an existing special. /// /// The special can then be fine-tuned afterwards. - void usePreset(Special special) { + void usePreset(Special? special) { if (special == null) { return; } preset = special; _times = List.of(special.periods); - _skips = special.skip ?? []; + _skips = special.skip; _name = special.name; _numPeriods = special.periods.length; _mincha = special.mincha; diff --git a/lib/src/models/view/builders/sports_builder.dart b/lib/src/models/view/builders/sports_builder.dart index 91c0ad337..e73eaa108 100644 --- a/lib/src/models/view/builders/sports_builder.dart +++ b/lib/src/models/view/builders/sports_builder.dart @@ -6,45 +6,44 @@ import "package:ramaz/data.dart"; /// A ViewModel for the Sports game builder. // ignore: prefer_mixin class SportsBuilderModel with ChangeNotifier { - Scores _scores; - Sport _sport; - DateTime _date; - TimeOfDay _start, _end; + Scores? _scores; + Sport? _sport; + DateTime? _date; + TimeOfDay? _start, _end; - String _opponent, _team; + String? _opponent, _team; bool _away = false, _loading = false; /// Creates a ViewModel for the sports game builder page. /// /// Passing in a [SportsGame] for [parent] will fill this page with all the /// relevant properties of [parent] before building. - SportsBuilderModel([SportsGame parent]) : + SportsBuilderModel([SportsGame? parent]) : _scores = parent?.scores, _sport = parent?.sport, _date = parent?.date, - _start = parent?.times?.start?.asTimeOfDay, - _end = parent?.times?.end?.asTimeOfDay, + _start = parent?.times.start.asTimeOfDay, + _end = parent?.times.end.asTimeOfDay, _opponent = parent?.opponent, _team = parent?.team, - _away = !(parent?.home ?? true); + _away = !(parent?.isHome ?? true); /// Whether this game is ready to submit. bool get ready => sport != null && team != null && - away != null && date != null && start != null && end != null && - opponent.isNotEmpty; + (opponent?.isNotEmpty ?? false); /// The game being created. SportsGame get game => SportsGame( - date: date, - home: !away, - times: Range(start?.asTime, end?.asTime), + date: date!, + isHome: !away, + times: Range(start!.asTime, end!.asTime), team: team ?? "", opponent: opponent ?? "", - sport: sport, + sport: sport!, scores: scores, ); @@ -53,8 +52,8 @@ class SportsBuilderModel with ChangeNotifier { /// This only applies if the game has already been finished. /// /// Changing this will update the page. - Scores get scores => _scores; - set scores(Scores value) { + Scores? get scores => _scores; + set scores(Scores? value) { _scores = value; notifyListeners(); } @@ -62,8 +61,8 @@ class SportsBuilderModel with ChangeNotifier { /// The sport being played. /// /// Changing this will update the page. - Sport get sport => _sport; - set sport(Sport value) { + Sport? get sport => _sport; + set sport(Sport? value) { _sport = value; notifyListeners(); } @@ -71,8 +70,8 @@ class SportsBuilderModel with ChangeNotifier { /// The date this game takes place. /// /// Changing this will update the page. - DateTime get date => _date; - set date(DateTime value) { + DateTime? get date => _date; + set date(DateTime? value) { _date = value; notifyListeners(); } @@ -80,8 +79,8 @@ class SportsBuilderModel with ChangeNotifier { /// The time this game starts. /// /// Changing this will update the page. - TimeOfDay get start => _start; - set start(TimeOfDay value) { + TimeOfDay? get start => _start; + set start(TimeOfDay? value) { _start = value; notifyListeners(); } @@ -89,8 +88,8 @@ class SportsBuilderModel with ChangeNotifier { /// The time this game ends. /// /// Changing this will update the page. - TimeOfDay get end => _end; - set end(TimeOfDay value) { + TimeOfDay? get end => _end; + set end(TimeOfDay? value) { _end = value; notifyListeners(); } @@ -98,8 +97,8 @@ class SportsBuilderModel with ChangeNotifier { /// The (home) team playing this game. /// /// Changing this will update the page. - String get team => _team; - set team(String value) { + String? get team => _team; + set team(String? value) { _team = value; notifyListeners(); } @@ -107,8 +106,8 @@ class SportsBuilderModel with ChangeNotifier { /// The name of the opponent school. /// /// Changing this will update the page. - String get opponent => _opponent; - set opponent(String value) { + String? get opponent => _opponent; + set opponent(String? value) { _opponent = value; notifyListeners(); } diff --git a/lib/src/models/view/calendar_editor.dart b/lib/src/models/view/calendar_editor.dart index fce2230de..6676353a3 100644 --- a/lib/src/models/view/calendar_editor.dart +++ b/lib/src/models/view/calendar_editor.dart @@ -26,7 +26,7 @@ class CalendarEditor with ChangeNotifier { // final List>> data = List.filled(12, null); /// The calendar filled with [Day]s. - final List> calendar = List.filled(12, null); + final List?> calendar = List.filled(12, null); /// A list of callbacks on the Firebase streams. /// @@ -51,7 +51,7 @@ class CalendarEditor with ChangeNotifier { /// Every entry is a list of two numbers. The first one is the amount of days /// from Sunday before the month starts, and the second one is the amount of /// days after the month until Saturday. They will be represented by blanks. - final List> paddings = List.filled(12, null); + final List?> paddings = List.filled(12, null); /// Creates a data model to hold the calendar. /// @@ -90,8 +90,8 @@ class CalendarEditor with ChangeNotifier { /// (starting on Sunday) instead of defaulting to the first open cell on /// the calendar grid. This function pads the calendar with the correct /// amount of empty days before and after the month. - List layoutMonth(int month) { - final List cal = calendar [month]; + List layoutMonth(int month) { + final List cal = calendar [month]!; final int firstDayOfWeek = DateTime(years [month], month + 1, 1).weekday; final int weekday = firstDayOfWeek == 7 ? 0 : firstDayOfWeek; paddings [month] = [weekday, daysInMonth - (weekday + cal.length)]; @@ -99,15 +99,15 @@ class CalendarEditor with ChangeNotifier { } /// Updates the calendar. - Future updateDay(DateTime date, Day day) async { + Future updateDay(DateTime date, Day? day) async { if (day == null) { return; } - calendar [date.month - 1] [date.day - 1] = day; + calendar [date.month - 1]! [date.day - 1] = day; await Services.instance.database.setCalendar( date.month, { - "calendar": Day.monthToJson(calendar [date.month - 1]), + "calendar": Day.monthToJson(calendar [date.month - 1]!), "month": date.month } ); diff --git a/lib/src/models/view/feedback.dart b/lib/src/models/view/feedback.dart index 2da340df7..1f9ed4d0b 100644 --- a/lib/src/models/view/feedback.dart +++ b/lib/src/models/view/feedback.dart @@ -6,17 +6,17 @@ import "package:ramaz/services.dart"; /// A view model for the feedback page. // ignore: prefer_mixin class FeedbackModel with ChangeNotifier { - String _message; + String? _message; bool _anonymous = true; /// Whether the user is ready to submit /// /// Is true if the [message] is non-null and not empty. - bool get ready => message != null && message.trim().isNotEmpty; + bool get ready => message != null && message!.trim().isNotEmpty; /// The message that will be sent along with the feedback. - String get message => _message; - set message (String value) { + String? get message => _message; + set message (String? value) { _message = value; notifyListeners(); } @@ -37,7 +37,7 @@ class FeedbackModel with ChangeNotifier { .cloudDatabase .sendFeedback( Feedback ( - message: message, + message: message!, timestamp: DateTime.now(), anonymous: anonymous, name: anonymous ? null : Auth.name, diff --git a/lib/src/models/view/home.dart b/lib/src/models/view/home.dart index 7d01424d6..2af22702f 100644 --- a/lib/src/models/view/home.dart +++ b/lib/src/models/view/home.dart @@ -28,8 +28,8 @@ class HomeModel with ChangeNotifier { // be used instead. @override void dispose() { - Models.instance?.schedule?.removeListener(notifyListeners); - Models.instance?.sports?.removeListener(notifyListeners); + Models.instance.schedule.removeListener(notifyListeners); + Models.instance.sports.removeListener(notifyListeners); super.dispose(); } diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index 9efb27b39..bf54b123c 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -10,7 +10,7 @@ class ScheduleModel with ChangeNotifier { static const Special defaultSpecial = Special.covid; /// The default [Day] for the UI. - Day defaultDay; + late Day defaultDay; /// The schedule data model. /// @@ -18,7 +18,7 @@ class ScheduleModel with ChangeNotifier { final Schedule schedule; /// The day whose schedule is being shown in the UI. - Day day; + Day? day; /// The selected date from the calendar. /// @@ -32,13 +32,13 @@ class ScheduleModel with ChangeNotifier { /// If today is a school day, then use that. Otherwise, use the /// defaults (see [defaultSpecial]). ScheduleModel () : schedule = Models.instance.schedule { - day = schedule.hasSchool - ? schedule.today - : defaultDay; defaultDay = Day( name: schedule.user.schedule.keys.first, special: defaultSpecial ); + day = schedule.hasSchool + ? schedule.today + : defaultDay; } /// Attempts to set the UI to the schedule of the given day. @@ -51,8 +51,8 @@ class ScheduleModel with ChangeNotifier { date.month, date.day ); - final Day selected = Day.getDate(schedule.calendar, justDate); - if (!selected.school) { + final Day? selected = Day.getDate(schedule.calendar, justDate); + if (selected == null) { throw Exception("No School"); } day = selected; @@ -67,26 +67,20 @@ class ScheduleModel with ChangeNotifier { /// /// If the dayName is non-null, the special defaults to [defaultSpecial]. void update({ - String newName, - Special newSpecial, - void Function() onInvalidSchedule, + String? newName, + Special? newSpecial, + void Function()? onInvalidSchedule, }) { - String name = day.name; - if (newName != null) { - name = newName; - day = Day(name: name, special: defaultSpecial); - notifyListeners(); - } - if (newSpecial != null) { - day = Day (name: name, special: newSpecial); - notifyListeners(); - } + final String name = newName ?? day?.name ?? defaultDay.name; + final Special special = newSpecial ?? day?.special ?? defaultSpecial; + day = Day(name: name, special: special); + notifyListeners(); try { // Just to see if the computation is possible. // TODO: Move the logic from ClassList here. - Models.instance.schedule.user.getPeriods(day); + Models.instance.schedule.user.getPeriods(day!); } on RangeError { // ignore: avoid_catching_errors - day = Day(name: day.name, special: defaultSpecial); + day = Day(name: day!.name, special: defaultSpecial); if (onInvalidSchedule != null) { onInvalidSchedule(); } diff --git a/lib/src/models/view/sports.dart b/lib/src/models/view/sports.dart index 9e3f1d59f..317908562 100644 --- a/lib/src/models/view/sports.dart +++ b/lib/src/models/view/sports.dart @@ -29,20 +29,20 @@ class SportsModel with ChangeNotifier { final Sports data; /// A list of recent games. - List recents; + List recents = []; /// A list of upcoming games. - List upcoming; + List upcoming = []; /// Recent games sorted by sport. /// /// Generated by calling [sortBySport] with [recents]. - Map> recentBySport; + Map> recentBySport = {}; /// Upcoming games sorted by sport. /// /// Generated by calling [sortBySport] with [upcoming]. - Map> upcomingBySport; + Map> upcomingBySport = {}; /// Whether the user is an admin. /// @@ -121,7 +121,7 @@ class SportsModel with ChangeNotifier { if (!result.containsKey(game.sport)) { result [game.sport] = [index]; } else { - result [game.sport].add(index); + result [game.sport]!.add(index); } } for (final List gamesList in result.values) { From 4591f29254f779f4f0f9bc94706e3363d54cc80f Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 25 Mar 2021 15:02:23 -0400 Subject: [PATCH 100/251] Updated dependencies to nnbd --- analysis_options.yaml | 2 +- pubspec.lock | 127 ++++++++++++++++++------------------------ pubspec.yaml | 27 +++++---- 3 files changed, 69 insertions(+), 87 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 78e05b676..a6d0b7908 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -122,7 +122,7 @@ linter: - slash_for_doc_comments - sort_child_properties_last # - sort_constructors_first - - sort_pub_dependencies + # - sort_pub_dependencies - sort_unnamed_constructors_first - test_types_in_equals - throw_in_finally diff --git a/pubspec.lock b/pubspec.lock index 03e70fdc3..914961684 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -8,20 +8,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.0.4" - adaptive_components: - dependency: "direct main" - description: - name: adaptive_components - url: "https://pub.dartlang.org" - source: hosted - version: "0.0.1" - adaptive_navigation: - dependency: transitive - description: - name: adaptive_navigation - url: "https://pub.dartlang.org" - source: hosted - version: "0.0.3" archive: dependency: transitive description: @@ -84,21 +70,21 @@ packages: name: cloud_firestore url: "https://pub.dartlang.org" source: hosted - version: "0.14.1+3" + version: "1.0.2" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" + version: "4.0.0" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "0.2.0+4" + version: "1.0.2" collection: dependency: transitive description: @@ -141,76 +127,83 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.0" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "7.3.0" firebase_auth: dependency: "direct main" description: name: firebase_auth url: "https://pub.dartlang.org" source: hosted - version: "0.18.1+2" + version: "1.0.1" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "4.0.0" firebase_auth_web: dependency: transitive description: name: firebase_auth_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.1+1" + version: "1.0.3" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "0.5.0+1" + version: "1.0.2" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "4.0.0" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "1.0.2" firebase_crashlytics: dependency: "direct main" description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "0.2.1+1" + version: "1.0.0" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.1" + version: "2.0.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging url: "https://pub.dartlang.org" source: hosted - version: "7.0.3" + version: "9.0.1" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" flutter: dependency: "direct main" description: flutter @@ -229,21 +222,21 @@ packages: name: flutter_local_notifications url: "https://pub.dartlang.org" source: hosted - version: "2.0.0+1" + version: "5.0.0" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "3.0.0" flutter_native_timezone: dependency: "direct main" description: name: flutter_native_timezone url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.10" flutter_test: dependency: "direct dev" description: flutter @@ -260,42 +253,35 @@ packages: name: google_sign_in url: "https://pub.dartlang.org" source: hosted - version: "4.5.3" + version: "5.0.1" google_sign_in_platform_interface: dependency: transitive description: name: google_sign_in_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "2.0.1" google_sign_in_web: dependency: transitive description: name: google_sign_in_web url: "https://pub.dartlang.org" source: hosted - version: "0.9.1+1" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.2" + version: "0.10.0" http_parser: dependency: transitive description: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "3.1.4" + version: "4.0.0" idb_shim: dependency: "direct main" description: name: idb_shim url: "https://pub.dartlang.org" source: hosted - version: "1.12.0" + version: "2.0.0+2" image: dependency: transitive description: @@ -309,7 +295,7 @@ packages: name: intl url: "https://pub.dartlang.org" source: hosted - version: "0.16.1" + version: "0.17.0" js: dependency: transitive description: @@ -379,7 +365,7 @@ packages: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.9.0" + version: "1.11.0" petitparser: dependency: transitive description: @@ -394,20 +380,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.0" - platform_detect: - dependency: transitive - description: - name: platform_detect - url: "https://pub.dartlang.org" - source: hosted - version: "1.4.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "2.0.0" process: dependency: transitive description: @@ -415,27 +394,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.1.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "1.4.4" quiver: dependency: transitive description: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "3.0.0" sembast: dependency: transitive description: name: sembast url: "https://pub.dartlang.org" source: hosted - version: "2.4.7+6" + version: "3.0.0+4" shared_preferences: dependency: "direct main" description: @@ -517,7 +489,7 @@ packages: name: synchronized url: "https://pub.dartlang.org" source: hosted - version: "2.2.0+2" + version: "3.0.0" term_glyph: dependency: transitive description: @@ -538,7 +510,7 @@ packages: name: timezone url: "https://pub.dartlang.org" source: hosted - version: "0.5.7" + version: "0.7.0-nullsafety.0" typed_data: dependency: transitive description: @@ -552,35 +524,42 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "5.5.2" + version: "6.0.3" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "0.0.1+1" + version: "2.0.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "0.0.1+7" + version: "2.0.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.0.8" + version: "2.0.2" url_launcher_web: dependency: transitive description: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "0.1.3+1" + version: "2.0.0" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 6b430c7a9..3edf8dd9c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,21 +15,24 @@ environment: dependencies: flutter: sdk: flutter + + # ------------- Services ------------- # Firebase/Google - cloud_firestore: ^0.14.1+3 - firebase_auth: ^0.18.1+2 - firebase_crashlytics: ^0.2.1+1 - firebase_messaging: ^7.0.3 - google_sign_in: ^4.5.1 - # Misc - flutter_local_notifications: ^2.0.0 - idb_shim: ^1.12.0 + cloud_firestore: ^1.0.2 + firebase_auth: ^1.0.1 + firebase_crashlytics: ^1.0.0 + firebase_messaging: ^9.0.1 + google_sign_in: ^5.0.1 + + flutter_local_notifications: ^5.0.0 + idb_shim: ^2.0.0 path_provider: ^2.0.1 shared_preferences: ^2.0.5 - url_launcher: ^5.2.5 - flutter_native_timezone: ^1.0.4 + + # ------------- Misc ------------- breakpoint_scaffold: ^0.0.2 - adaptive_components: any + flutter_native_timezone: ^1.0.10 + url_launcher: ^6.0.3 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. @@ -39,8 +42,8 @@ dev_dependencies: flutter_test: sdk: flutter matcher: any - # pedantic: ^1.4.0 flutter_launcher_icons: ^0.7.0 + # pedantic: ^1.4.0 flutter_icons: android: false # overwrite From 0368de7b82bf9882a2377e90dbbafd5f7b5aed29 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 25 Mar 2021 20:24:38 -0400 Subject: [PATCH 101/251] Migrated Services to nnbd --- lib/services.dart | 4 +- lib/src/services/auth.dart | 26 +++-- lib/src/services/cloud_db.dart | 61 ++++++---- lib/src/services/crashlytics/mobile.dart | 2 +- lib/src/services/crashlytics/stub.dart | 3 +- lib/src/services/database.dart | 12 +- lib/src/services/databases.dart | 8 +- lib/src/services/local_db.dart | 106 ++++++++++++------ lib/src/services/notifications.dart | 16 +-- lib/src/services/notifications/mobile.dart | 33 +++--- lib/src/services/notifications/stub.dart | 13 ++- lib/src/services/preferences.dart | 20 ++-- .../services/push_notifications/mobile.dart | 27 ++--- 13 files changed, 195 insertions(+), 136 deletions(-) diff --git a/lib/services.dart b/lib/services.dart index 6e0d208e4..9c3dc77bd 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -60,12 +60,12 @@ class Services implements Service { /// All the services in a list. /// /// The functions of this service operate on these services. - List services; + late final List services; /// Bundles services together. /// /// Also initializes [services]. - Services() { + Services() { services = [prefs, database, crashlytics, notifications]; } diff --git a/lib/src/services/auth.dart b/lib/src/services/auth.dart index 7711203fc..14c20193b 100644 --- a/lib/src/services/auth.dart +++ b/lib/src/services/auth.dart @@ -32,15 +32,15 @@ class Auth { /// This getter returns a [User], which should not be used /// outside this library. This method should only be called by /// methods that provide higher level functionality, such as [isSignedIn]. - static User get _currentUser => auth.currentUser; + static User? get _currentUser => auth.currentUser; /// The user's email. /// /// Since the database is case-sensitive, we standardize the lower case. - static String get email => _currentUser?.email?.toLowerCase(); + static String? get email => _currentUser?.email?.toLowerCase(); /// The user's full name. - static String get name => _currentUser?.displayName; + static String? get name => _currentUser?.displayName; /// Determines whether the user is currently logged static bool get isSignedIn => _currentUser != null; @@ -48,23 +48,27 @@ class Auth { /// Gets the user's custom claims. /// /// See the official [Firebase docs](https://firebase.google.com/docs/auth/admin/custom-claims). - static Future get claims async => ( - await _currentUser.getIdTokenResult() - ).claims; + static Future?> get claims async => !isSignedIn ? null + : (await _currentUser!.getIdTokenResult()).claims; /// Whether the user is an admin. /// /// This works by checking for an "isAdmin" flag in the user's custom [claims]. - static Future get isAdmin async => (await claims) ["isAdmin"] ?? false; + static Future get isAdmin async { + final Map? customClaims = await claims; + return customClaims != null && (customClaims ["isAdmin"] ?? false); + } /// The scopes of an admin. /// /// Returns null if the user is not an admin (ie, [isAdmin] returns false). - static Future> get adminScopes async => !(await isAdmin) - ? null : [ - for (final scope in (await claims) ["scopes"]) + static Future?> get adminScopes async { + final Map? customClaims = await claims; + return customClaims == null ? null : [ + for (final String scope in customClaims ["scopes"]) scope.toString() ]; + } /// Whether the user is an admin for the calendar. static Future get isCalendarAdmin async => @@ -82,7 +86,7 @@ class Auth { /// Signs the user in using Google as a provider. static Future signIn() async { - final GoogleSignInAccount googleAccount = await google.signIn(); + final GoogleSignInAccount? googleAccount = await google.signIn(); if (googleAccount == null) { throw NoAccountException(); } diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index 9a19d645d..57dff7b7f 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -15,6 +15,19 @@ extension DocumentFinder on CollectionReference { } } +/// Convenience methods on [DocumentReference]. +extension NonNullData on DocumentReference { + /// Gets data from a document, throwing if null. + Future> throwIfNull(String message) async { + final Map? value = (await get()).data(); + if (value == null) { + throw StateError(message); + } else { + return value; + } + } +} + /// A wrapper around Cloud Firestore. class CloudDatabase extends Database { static final DateTime _now = DateTime.now(); @@ -138,14 +151,8 @@ class CloudDatabase extends Database { Future signOut() => Auth.signOut(); @override - Future> get user async { - final DocumentSnapshot snapshot = await userDocument.get(); - if (!snapshot.exists) { - throw StateError("User ${Auth.email} does not exist in the database"); - } else { - return snapshot.data(); - } - } + Future> get user => + userDocument.throwIfNull("User ${Auth.email} does not exist in the database"); /// No-op -- The user cannot edit their own profile. /// @@ -155,8 +162,8 @@ class CloudDatabase extends Database { Future setUser(Map json) async {} @override - Future> getSection(String id) async => - (await sectionCollection.doc(id).get()).data(); + Future> getSection(String id) => + sectionCollection.doc(id).throwIfNull("Cannot find section: $id"); /// No-op -- The user cannot edit the courses list. /// @@ -167,9 +174,7 @@ class CloudDatabase extends Database { @override Future> getCalendarMonth(int month) async { final DocumentReference document = calendarCollection.doc(month.toString()); - final DocumentSnapshot snapshot = await document.get(); - final Map data = snapshot.data(); - return data; + return document.throwIfNull("No entry in calendar for $month"); } @override @@ -183,31 +188,39 @@ class CloudDatabase extends Database { final List documents = snapshot.docs; return [ for (final QueryDocumentSnapshot document in documents) - document.data() + // QueryDocumentSnapshot.data() is never null. + // I opened a PR to make the type non-nullable: + // https://github.com/FirebaseExtended/flutterfire/pull/5476 + document.data()! ]; } @override - Future updateReminder(String oldHash, Map json) async => - oldHash == null - ? remindersCollection.add(json) - : (await remindersCollection.findDocument("hash", oldHash)).set(json); + Future updateReminder(String? oldHash, Map json) async { + if (oldHash == null) { + await remindersCollection.add(json); + } else { + final DocumentReference document = await remindersCollection + .findDocument("hash", oldHash); + await document.set(json); + } + } @override Future deleteReminder(String oldHash) async => (await remindersCollection.findDocument("hash", oldHash)).delete(); @override - Future> get admin async => - (await adminDocument.get()).data(); + Future> get admin => + adminDocument.throwIfNull("User is not admin"); @override Future setAdmin(Map json) => adminDocument.set(json); @override Future>> get sports async { - final DocumentSnapshot snapshot = await sportsDocument.get(); - final Map data = snapshot.data(); + final Map data = await sportsDocument + .throwIfNull("No sports data found"); return [ for (final dynamic json in data [sportsKey]) Map.from(json) @@ -224,10 +237,10 @@ class CloudDatabase extends Database { ) => feedbackCollection.doc().set(json); /// Listens to a month for changes in the calendar. - Stream>> getCalendarStream(int month) => + Stream?>> getCalendarStream(int month) => calendarCollection.doc(month.toString()).snapshots().map( (DocumentSnapshot snapshot) => [ - for (final dynamic entry in snapshot.data() ["calendar"]) + for (final dynamic entry in snapshot.data()! ["calendar"]) Map.from(entry) ] ); diff --git a/lib/src/services/crashlytics/mobile.dart b/lib/src/services/crashlytics/mobile.dart index 59ce0c04c..3ccbf83c2 100644 --- a/lib/src/services/crashlytics/mobile.dart +++ b/lib/src/services/crashlytics/mobile.dart @@ -18,7 +18,7 @@ class CrashlyticsImplementation extends Crashlytics { @override Future init() async { await FirebaseCore.init(); - didCrashLastTime = await firebase.didCrashOnPreviousExecution(); + final bool didCrashLastTime = await firebase.didCrashOnPreviousExecution(); if (didCrashLastTime) { await log("App crashed on last run"); } diff --git a/lib/src/services/crashlytics/stub.dart b/lib/src/services/crashlytics/stub.dart index df46da159..70812fa12 100644 --- a/lib/src/services/crashlytics/stub.dart +++ b/lib/src/services/crashlytics/stub.dart @@ -25,7 +25,8 @@ class CrashlyticsStub extends Crashlytics { @override Future recordFlutterError ( FlutterErrorDetails details - ) async => throw details.exception; + ) async => throw details.exception; // ignore: only_throw_errors + // [FlutterErrorDetails.exception] is an [Object], and can be any value. @override Future setEmail(String email) async {} diff --git a/lib/src/services/database.dart b/lib/src/services/database.dart index f143c3785..8e3e8daa2 100644 --- a/lib/src/services/database.dart +++ b/lib/src/services/database.dart @@ -51,7 +51,7 @@ abstract class Database extends Service { Future> getSection(String id); /// The different classes (sections, not courses) for a schedule. - Future>> getSections( + Future>?> getSections( Iterable ids ) async => { for (final String id in ids) @@ -64,10 +64,10 @@ abstract class Database extends Service { /// The calendar in JSON form. /// /// Admins can change this with [setCalendar]. - Future>>> get calendar async => [ + Future?>>> get calendar async => [ for (int month = 1; month <= 12; month++) [ - for (final dynamic day in (await getCalendarMonth(month)) [calendarKey]) - Map.from(day) + for (final Map? day in (await getCalendarMonth(month)) [calendarKey]) + day == null ? null : Map.from(day) ] ]; @@ -95,7 +95,7 @@ abstract class Database extends Service { /// /// This function queries the database for a reminder with the same hash and /// updates it. - Future updateReminder(String oldHash, Map json); + Future updateReminder(String? oldHash, Map json); /// Deletes a reminder at the given index. /// @@ -104,7 +104,7 @@ abstract class Database extends Service { Future deleteReminder(String oldHash); /// The admin object (or null). - Future> get admin; + Future?> get admin; /// Sets the admin object for this user. Future setAdmin(Map json); diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart index 299c43a55..75c65f906 100644 --- a/lib/src/services/databases.dart +++ b/lib/src/services/databases.dart @@ -85,7 +85,7 @@ class Databases extends Database { /// this function is left blank and [getSections] uses other /// [Database.getSections] to work. @override - Future> getSection(String id) async => null; + Future> getSection(String id) async => {}; /// Gets section data. /// @@ -94,10 +94,10 @@ class Databases extends Database { Future>> getSections( Iterable ids ) async { - Map> result = + Map>? result = await localDatabase.getSections(ids); - if (result.values.every((value) => value == null)) { - result = await cloudDatabase.getSections(ids); + if (result == null) { + result = (await cloudDatabase.getSections(ids))!; await localDatabase.setSections(result); } return result; diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index caf7b0065..f78b37b3d 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -1,5 +1,4 @@ import "package:idb_shim/idb_shim.dart" as idb; -import "package:meta/meta.dart"; import "auth.dart"; import "database.dart"; @@ -7,12 +6,23 @@ import "local_db/idb_factory_stub.dart" if (dart.library.io) "local_db/idb_factory_io.dart" if (dart.library.html) "local_db/idb_factory_web.dart"; +extension on Stream { + Future firstWhereOrNull(bool Function(T) test) async { + await for (final T element in this) { + if (test(element)) { + return element; + } + } + return null; + } +} + /// Provides convenience methods around an [idb.ObjectStore]. -extension ObjectStoreExtension on idb.ObjectStore { +extension on idb.ObjectStore { /// Gets the data at the key in this object store. /// /// This extension provides type safety. - Future> get(dynamic key) async { + Future?> get(Object key) async { final dynamic result = await getObject(key); return result == null ? null : Map.from(result); @@ -20,19 +30,32 @@ extension ObjectStoreExtension on idb.ObjectStore { } /// Provides convenience methods on a [Database]. -extension DatabaseExtension on idb.Database { +extension on idb.Database { /// Gets data at a key in an object store. /// /// This code handles transactions so other code doesn't have to. - Future> get(String storeName, dynamic key) => + Future?> get(String storeName, Object key) => transaction(storeName, idb.idbModeReadOnly) .objectStore(storeName) .get(key); + Future> throwIfNull({ + required String storeName, + required Object key, + required String message, + }) async { + final Map? result = await get(storeName, key); + if (result == null) { + throw StateError(message); + } else { + return result; + } + } + /// Adds data at a key to an object store. /// /// This code handles transactions so other code doesn't have to. - Future add(String storeName, T value) => + Future add(String storeName, Object value) => transaction(storeName, idb.idbModeReadWrite) .objectStore(storeName) .add(value); @@ -46,7 +69,7 @@ extension DatabaseExtension on idb.Database { /// have a key. /// /// This code handles transactions so other code doesn't have to. - Future update(String storeName, T value, [dynamic key]) => + Future update(String storeName, Object value, [Object? key]) => transaction(storeName, idb.idbModeReadWrite) .objectStore(storeName) .put(value, key); @@ -63,27 +86,25 @@ extension DatabaseExtension on idb.Database { ) Map.from(entry) ]; - /// Deletes a data from an object store. - /// - /// This code handles transactions so other code doesn't have to. - Future delete(String storeName, dynamic key) async => - transaction(storeName, idb.idbModeReadWrite) - .objectStore(storeName) - .delete(key); - /// Finds an entry in an object store by a field and value. - Future findEntry({ - @required String storeName, - @required String key, - @required String path + /// + /// Returns null if no key is given. + Future findEntry({ + required String storeName, + required String? key, + required String path }) async => key == null ? null : transaction(storeName, idb.idbModeReadWrite) .objectStore(storeName) .index(path) .openCursor(range: idb.KeyRange.only(key), autoAdvance: true) - .firstWhere( + .firstWhereOrNull( (idb.CursorWithValue cursor) => cursor.key == key, - orElse: () => null ); + + Future objectCount(String storeName) => + transaction(storeName, idb.idbModeReadOnly) + .objectStore(storeName) + .count(); } /// A database that's hosted on the user's device. @@ -97,7 +118,7 @@ extension DatabaseExtension on idb.Database { /// value. The choice should be made based on the data in that object store. /// /// Reading and writing data is done with transactions. This process is -/// abstracted by [ObjectStoreExtension] and [DatabaseExtension]. +/// abstracted by extensions on [idb.ObjectStore] and [idb.Database]. /// /// Another quirk of idb is that object stores can only be created on startup. /// One way this is relevant is in [isSignedIn]. If it turns out that the user @@ -143,7 +164,7 @@ class LocalDatabase extends Database { /// The idb database itself. /// /// Not to be confused with a RamLife [Database]. - idb.Database database; + late idb.Database database; @override Future init() async { @@ -190,16 +211,28 @@ class LocalDatabase extends Database { } @override - Future> get user async => - Map.from(await database.get(userStoreName, Auth.email)); + Future> get user => database.throwIfNull( + storeName: userStoreName, + key: Auth.email!, + message: "User has not been signed in" + ); @override Future setUser(Map json) => database.add(userStoreName, json); @override - Future> getSection(String id) => - database.get(sectionStoreName, id); + Future> getSection(String id) => database.throwIfNull( + storeName: sectionStoreName, + key: id, + message: "Section $id is not recognized", + ); + + @override + Future>?> getSections( + Iterable ids + ) async => await database.objectCount(sectionStoreName) == 0 ? null + : super.getSections(ids); @override Future setSections(Map> json) async { @@ -209,8 +242,12 @@ class LocalDatabase extends Database { } @override - Future> getCalendarMonth(int month) async => - Map.from(await database.get(calendarStoreName, month)); + Future> getCalendarMonth(int month) => + database.throwIfNull( + storeName: calendarStoreName, + key: month, + message: "Cannot find $month in calendar" + ); @override Future setCalendar(int month, Map json) async { @@ -222,8 +259,8 @@ class LocalDatabase extends Database { database.getAll(reminderStoreName); @override - Future updateReminder(String oldHash, Map json) async { - final idb.CursorWithValue cursor = await database.findEntry( + Future updateReminder(String? oldHash, Map json) async { + final idb.CursorWithValue? cursor = await database.findEntry( storeName: reminderStoreName, key: oldHash, path: "hash" @@ -244,8 +281,11 @@ class LocalDatabase extends Database { )?.delete(); @override - Future> get admin async => - Map.from(await database.get(adminStoreName, Auth.email)); + Future> get admin async => database.throwIfNull( + storeName: adminStoreName, + key: Auth.email!, + message: "Admin data not found", + ); @override Future setAdmin(Map json) => diff --git a/lib/src/services/notifications.dart b/lib/src/services/notifications.dart index 4dc59de79..28fa70258 100644 --- a/lib/src/services/notifications.dart +++ b/lib/src/services/notifications.dart @@ -12,7 +12,7 @@ class Notification { /// The ID of this notification. /// /// The ID is used for canceling the notifications. - int get id => 0; + static const int id = 0; /// The title of this notification. final String title; @@ -22,14 +22,14 @@ class Notification { /// Creates a notification. const Notification({ - @required this.title, - @required this.message, + required this.title, + required this.message, }); /// Creates a notification for a reminder. factory Notification.reminder({ - @required String title, - @required String message, + required String title, + required String message, }) => getReminderNotification(title: title, message: message); } @@ -49,14 +49,14 @@ abstract class Notifications extends Service { static Notifications instance = notifications; /// Sends a notification immediately. - void sendNotification(Notification notification); + void sendNotification(covariant Notification notification); /// Schedules a notification for [date]. /// /// [date] must not be in the past. void scheduleNotification({ - @required Notification notification, - @required DateTime date + required covariant Notification notification, + required DateTime date }); /// Cancels all notifications. diff --git a/lib/src/services/notifications/mobile.dart b/lib/src/services/notifications/mobile.dart index 35843cd8f..3903f4f35 100644 --- a/lib/src/services/notifications/mobile.dart +++ b/lib/src/services/notifications/mobile.dart @@ -1,5 +1,4 @@ import "package:flutter_local_notifications/flutter_local_notifications.dart"; -import "package:meta/meta.dart"; import "package:timezone/timezone.dart"; import "package:timezone/data/latest.dart"; import "package:flutter_native_timezone/flutter_native_timezone.dart"; @@ -10,8 +9,8 @@ import "../notifications.dart"; /// Creates a reminders notification using [MobileNotification.reminder]. Notification getReminderNotification({ - @required String title, - @required String message, + required String title, + required String message, }) => MobileNotification.reminder(title: title, message: message); /// The mobile implementation of the [Notifications] service. @@ -51,15 +50,15 @@ class MobileNotification extends Notification { /// Creates a new [Notification]. const MobileNotification({ - @required String title, - @required String message, - @required this.details, + required String title, + required String message, + required this.details, }) : super(title: title, message: message); /// The optimal configuration for a reminder notification. MobileNotification.reminder({ - @required String title, - @required String message, + required String title, + required String message, }) : details = reminderDetails, super(title: title, message: message); @@ -71,10 +70,10 @@ class MobileNotifications extends Notifications { final plugin = FlutterLocalNotificationsPlugin(); /// The location this device is in. - String timezoneName; + late String timezoneName; /// The location (and timezones) this device is in. - Location location; + late Location location; @override Future init() async { @@ -95,10 +94,8 @@ class MobileNotifications extends Notifications { Future signIn() async {} @override - void sendNotification( - covariant MobileNotification notification - ) => plugin.show( - notification.id, + void sendNotification(MobileNotification notification) => plugin.show( + Notification.id, notification.title, notification.message, notification.details, @@ -106,10 +103,10 @@ class MobileNotifications extends Notifications { @override void scheduleNotification({ - @required covariant MobileNotification notification, - @required DateTime date, + required MobileNotification notification, + required DateTime date, }) => plugin.zonedSchedule( - notification.id, + Notification.id, notification.title, notification.message, TZDateTime.from(date, location), @@ -128,6 +125,6 @@ class MobileNotifications extends Notifications { final PendingNotificationRequest request in await plugin.pendingNotificationRequests() ) - request.title + request.title! ]; } diff --git a/lib/src/services/notifications/stub.dart b/lib/src/services/notifications/stub.dart index 80c6dc207..9760c95a3 100644 --- a/lib/src/services/notifications/stub.dart +++ b/lib/src/services/notifications/stub.dart @@ -1,14 +1,12 @@ -import "package:meta/meta.dart"; - import "../notifications.dart"; /// The web implementation of a reminders notification. /// /// Notifications are not yet supported on web. Notification getReminderNotification({ - @required String title, - @required String message, -}) => null; + required String title, + required String message, +}) => Notification(title: title, message: message); /// The web implementation of the [Notifications] service. /// @@ -29,7 +27,10 @@ class StubNotifications extends Notifications { void sendNotification(Notification notification) {} @override - void scheduleNotification({Notification notification, DateTime date}) {} + void scheduleNotification({ + required Notification notification, + required DateTime date + }) {} @override void cancelAll() {} diff --git a/lib/src/services/preferences.dart b/lib/src/services/preferences.dart index 9d4dbf7fb..60b731ec6 100644 --- a/lib/src/services/preferences.dart +++ b/lib/src/services/preferences.dart @@ -7,7 +7,13 @@ import "service.dart"; /// The SharedPreferences plugin allows for quick and small key-value based /// storage, which can be very useful. class Preferences extends Service { - SharedPreferences _prefs; + /// The key for if this is the first time or not. + static const String firstTimeKey = "firstTime"; + + /// The key for the user brightness preference. + static const String lightMode = "lightMode"; + + late SharedPreferences _prefs; @override Future init() async { @@ -17,12 +23,6 @@ class Preferences extends Service { @override Future signIn() async {} - /// The key for if this is the first time or not. - static const String firstTimeKey = "firstTime"; - - /// The key for the user brightness preference. - static const String lightMode = "lightMode"; - /// Determines whether this is the first time opening the app. bool get firstTime { final bool result = _prefs.getBool(firstTimeKey) ?? true; @@ -34,6 +34,8 @@ class Preferences extends Service { /// /// `true` means light mode, `false` means dark mode, and `null` gets the /// system preferences (if not supported -- light mode). - bool get brightness => _prefs.getBool(lightMode); - set brightness (bool value) => _prefs.setBool(lightMode, value); + bool? get brightness => _prefs.getBool(lightMode); + set brightness (bool? value) => value == null + ? _prefs.remove(lightMode) + : _prefs.setBool(lightMode, value); } diff --git a/lib/src/services/push_notifications/mobile.dart b/lib/src/services/push_notifications/mobile.dart index 7533be886..197136a42 100644 --- a/lib/src/services/push_notifications/mobile.dart +++ b/lib/src/services/push_notifications/mobile.dart @@ -35,10 +35,10 @@ class FCM extends PushNotifications { static const List topics = ["calendar", "sports"]; /// Provides the connection to Firebase Messaging. - static final FirebaseMessaging firebase = FirebaseMessaging(); + static final FirebaseMessaging firebase = FirebaseMessaging.instance; /// Maps command payloads to async functions. - static Map callbacks; + late Map callbacks; @override Future init() async { @@ -54,16 +54,16 @@ class FCM extends PushNotifications { } @override - Future signIn() async => firebase.requestNotificationPermissions(); + Future signIn() async => firebase.requestPermission(); /// A callback to handle any notification. /// /// This function uses the `command` field of the notification to find the /// right [AsyncCallback], and calls it. - static Future callback( + Future callback( Map message, ) async { - final String command = (message["data"] ?? message) ["command"]; + final String? command = (message["data"] ?? message) ["command"]; if (command == null) { throw JsonUnsupportedObjectError( message, @@ -71,7 +71,7 @@ class FCM extends PushNotifications { partialResult: message.toString(), ); } - final AsyncCallback function = callbacks [command]; + final AsyncCallback? function = callbacks [command]; if (function == null) { throw ArgumentError.value( command, @@ -87,14 +87,15 @@ class FCM extends PushNotifications { Future registerForNotifications( Map callbacks ) async { - FCM.callbacks = callbacks; + this.callbacks = callbacks; - firebase.configure( - onMessage: callback, - onBackgroundMessage: callback, - onLaunch: callback, - onResume: callback, - ); + FirebaseMessaging.onBackgroundMessage((message) => callback(message.data)); + // replace with FirebaseMessaging.onMessage.listen(callback) + // firebase.configure( + // onMessage: callback, + // onLaunch: callback, + // onResume: callback, + // ); } /// Subscribes to all the topics in [topics]. From 45b2a43c80fc35c2304426e7bf665e145348f5d4 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 25 Mar 2021 21:37:43 -0400 Subject: [PATCH 102/251] Migrated widgets library to nnbd --- analysis_options.yaml | 2 +- lib/app.dart | 58 ++---- lib/pages.dart | 2 - .../widgets/ambient/brightness_changer.dart | 38 ++-- lib/src/widgets/ambient/theme_changer.dart | 59 ++++-- lib/src/widgets/atomic/activity_tile.dart | 6 +- .../widgets/atomic/admin/calendar_tile.dart | 19 +- lib/src/widgets/atomic/admin/period_tile.dart | 14 +- lib/src/widgets/atomic/info_card.dart | 12 +- lib/src/widgets/atomic/next_class.dart | 31 +-- lib/src/widgets/atomic/reminder_tile.dart | 9 +- lib/src/widgets/atomic/sports_tile.dart | 49 ++--- .../widgets/generic/adaptive_scaffold.dart | 194 +++++++++--------- lib/src/widgets/generic/class_list.dart | 48 ++--- lib/src/widgets/generic/date_picker.dart | 6 +- lib/src/widgets/generic/footer.dart | 9 +- lib/src/widgets/generic/model_listener.dart | 19 +- lib/src/widgets/images/link_icon.dart | 2 +- lib/src/widgets/images/loading_image.dart | 18 +- 19 files changed, 279 insertions(+), 316 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index a6d0b7908..275d3ba07 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -15,7 +15,7 @@ linter: # - avoid_as # dart 1 only - avoid_bool_literals_in_conditional_expressions # - avoid_catches_without_on_clauses - - avoid_catching_errors + # - avoid_catching_errors - avoid_double_and_int_checks - avoid_empty_else - avoid_field_initializers_in_const_classes diff --git a/lib/app.dart b/lib/app.dart index 580f3411d..bf48539d5 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -7,20 +7,18 @@ import "package:ramaz/services.dart"; /// The main app widget. class RamLife extends StatefulWidget { - /// Whether the user is already signed in. - final bool isSignedIn; - /// Creates the main app widget. - const RamLife ({this.isSignedIn}); + const RamLife(); @override RamLifeState createState() => RamLifeState(); } +/// The state for the app. class RamLifeState extends State { @override Widget build (BuildContext context) => ThemeChanger( - defaultBrightness: null, + defaultBrightness: Brightness.light, light: ThemeData ( brightness: Brightness.light, primarySwatch: Colors.blue, @@ -30,8 +28,10 @@ class RamLifeState extends State { primaryColorDark: RamazColors.blueDark, accentColor: RamazColors.gold, accentColorBrightness: Brightness.light, - cursorColor: RamazColors.blueLight, - textSelectionHandleColor: RamazColors.blueLight, + textSelectionTheme: const TextSelectionThemeData( + cursorColor: RamazColors.blueLight, + selectionHandleColor: RamazColors.blueLight, + ), buttonColor: RamazColors.gold, buttonTheme: const ButtonThemeData ( buttonColor: RamazColors.gold, @@ -59,8 +59,10 @@ class RamLifeState extends State { backgroundColor: RamazColors.goldDark, foregroundColor: RamazColors.blue ), - cursorColor: RamazColors.blueLight, - textSelectionHandleColor: RamazColors.blueLight, + textSelectionTheme: const TextSelectionThemeData( + cursorColor: RamazColors.blueLight, + selectionHandleColor: RamazColors.blueLight, + ), cardTheme: CardTheme ( color: Colors.grey[820] ), @@ -82,10 +84,6 @@ class RamLifeState extends State { color: RamazColors.blue, theme: theme, routes: { - Routes.splash: (_) => RouteInitializer( - isAllowed: () => Auth.isSignedIn, - builder: (_) => HomePage(), - ), Routes.login: (_) => const Login(), Routes.home: enforceLogin((_) => HomePage()), Routes.schedule: enforceLogin((_) => SchedulePage()), @@ -99,40 +97,10 @@ class RamLifeState extends State { ) ); + /// Enforces the user be signed in. WidgetBuilder enforceLogin(WidgetBuilder builder) => (_) => RouteInitializer( isAllowed: () => Auth.isSignedIn, builder: builder, ); - - // WidgetBuilder enforceLogin(WidgetBuilder builder) => - // (_) { - // if (widget.isSignedIn == null) { - // return SplashScreen(); - // } else if (!Services.instance.database.isSignedIn) { - // return Login(builder); - // } else { - // return builder(_); - // } - // }; -} - - - -// logic -// initialRoute => route with/out login -// routes: map with custom RouteInitializer -// routeInitializer: -// - Route onSuccess -// - Route onDeny -// - Route onError -// onGenerateRoute: for complex URL logic (not needed yet) - - -/// Some routeInitializers: -/// - home: RouteInitializer( -/// - isAllowed: isSignedIn -/// - onSuccess: Routes.home -/// - onDeny: Routes.login -/// - onError: reset(); Routes.login -/// ) \ No newline at end of file +} \ No newline at end of file diff --git a/lib/pages.dart b/lib/pages.dart index 1b17efcfc..037a8dab8 100644 --- a/lib/pages.dart +++ b/lib/pages.dart @@ -47,6 +47,4 @@ class Routes { /// The route name for the sports games page. static const String sports = "sports"; - - static const String splash = "splash"; } diff --git a/lib/src/widgets/ambient/brightness_changer.dart b/lib/src/widgets/ambient/brightness_changer.dart index b5a99fd09..d59438dd3 100644 --- a/lib/src/widgets/ambient/brightness_changer.dart +++ b/lib/src/widgets/ambient/brightness_changer.dart @@ -17,10 +17,10 @@ enum BrightnessChangerForm { class BrightnessChanger extends StatelessWidget { /// Returns a custom value if [value] is null, true, or false. static T caseConverter({ - @required bool value, - @required T onNull, - @required T onTrue, - @required T onFalse, + required bool? value, + required T onNull, + required T onTrue, + required T onFalse, }) => value == null ? onNull : value ? onTrue : onFalse; @@ -38,7 +38,7 @@ class BrightnessChanger extends StatelessWidget { /// Creates a widget to toggle the app brightness. /// /// This constructor determines the icon. - BrightnessChanger({@required this.prefs, @required this.form}) : + BrightnessChanger({required this.prefs, required this.form}) : icon = Icon ( caseConverter( value: prefs.brightness, @@ -46,30 +46,28 @@ class BrightnessChanger extends StatelessWidget { onTrue: Icons.brightness_high, onFalse: Icons.brightness_low, ) - ), - assert (prefs != null, "Cannot load user preference"), - assert (form != null, "Cannot build widget without selected appearance"); + ); /// Creates a [BrightnessChanger] as a toggle button. - factory BrightnessChanger.iconButton({@required Preferences prefs}) => - BrightnessChanger (prefs: prefs, form: BrightnessChangerForm.button); + factory BrightnessChanger.iconButton({required Preferences prefs}) => + BrightnessChanger(prefs: prefs, form: BrightnessChangerForm.button); /// Creates a [BrightnessChanger] as a drop-down menu. - factory BrightnessChanger.dropdown({@required Preferences prefs}) => - BrightnessChanger (prefs: prefs, form: BrightnessChangerForm.dropdown); + factory BrightnessChanger.dropdown({required Preferences prefs}) => + BrightnessChanger(prefs: prefs, form: BrightnessChangerForm.dropdown); - @override Widget build (BuildContext context) { + @override + Widget build (BuildContext context) { switch (form) { - case BrightnessChangerForm.button: return IconButton ( + case BrightnessChangerForm.button: return IconButton( icon: icon, onPressed: () => buttonToggle(context), ); - - case BrightnessChangerForm.dropdown: return ListTile ( + case BrightnessChangerForm.dropdown: return ListTile( title: const Text ("Theme"), leading: icon, trailing: DropdownButton( - onChanged: (bool value) => setBrightness(context, value: value), + onChanged: (bool? value) => setBrightness(context, value: value), value: prefs.brightness, items: const [ DropdownMenuItem ( @@ -87,8 +85,6 @@ class BrightnessChanger extends StatelessWidget { ], ) ); - - default: return null; // somehow got null } } @@ -99,7 +95,7 @@ class BrightnessChanger extends StatelessWidget { /// If the brightness is auto, it will be set to light. void buttonToggle(BuildContext context) => setBrightness( context, - value: caseConverter( + value: caseConverter( value: prefs.brightness, onTrue: false, onFalse: null, @@ -110,7 +106,7 @@ class BrightnessChanger extends StatelessWidget { /// Sets the brightness of the app. /// /// Also saves it to [Preferences]. - void setBrightness (BuildContext context, {bool value}) { + void setBrightness (BuildContext context, {required bool? value}) { ThemeChanger.of(context).brightness = caseConverter ( value: value, onTrue: Brightness.light, diff --git a/lib/src/widgets/ambient/theme_changer.dart b/lib/src/widgets/ambient/theme_changer.dart index df9fd835f..e80995f70 100644 --- a/lib/src/widgets/ambient/theme_changer.dart +++ b/lib/src/widgets/ambient/theme_changer.dart @@ -1,6 +1,7 @@ import "package:flutter/material.dart"; -typedef ThemeBuilder = Widget Function (BuildContext, ThemeData); +/// Builds a widget with the given theme. +typedef ThemeBuilder = Widget Function(BuildContext, ThemeData); /// A widget to change the theme. /// @@ -43,37 +44,45 @@ class ThemeChanger extends StatefulWidget { /// Creates a widget to change the theme. const ThemeChanger ({ - @required this.builder, - @required this.defaultBrightness, - @required this.light, - @required this.dark, - this.themes, + required this.builder, + required this.defaultBrightness, + required this.light, + required this.dark, + this.themes = const {}, }); - @override ThemeChangerState createState() => ThemeChangerState(); + @override + ThemeChangerState createState() => ThemeChangerState(); /// Gets the [ThemeChangerState] from a [BuildContext]. /// /// Use this function to switch the theme. - static ThemeChangerState of(BuildContext context) => - context.findAncestorStateOfType(); + static ThemeChangerState of(BuildContext context) { + final state = context.findAncestorStateOfType(); + if (state == null) { + throw StateError("No theme changer found in the widget tree"); + } else { + return state; + } + } } /// The state for a [ThemeChanger]. /// /// This class has properties that control the theme. class ThemeChangerState extends State { - ThemeData _theme; - Brightness _brightness; - String _key; + late ThemeData _theme; + late Brightness _brightness; + String? _key; - @override void initState() { + @override + void initState() { super.initState(); brightness = widget.defaultBrightness; } - @override Widget build (BuildContext context) => - widget.builder (context, _theme); + @override + Widget build (BuildContext context) => widget.builder (context, _theme); /// The current brightness. /// @@ -81,17 +90,22 @@ class ThemeChangerState extends State { /// [ThemeChanger.light] and [ThemeChanger.dark]). Brightness get brightness => _brightness; set brightness(Brightness value) { - setState(() => _theme = value == Brightness.light + _key = null; + _brightness = value; + setState(() => _theme = value == Brightness.light ? widget.light : widget.dark ); - _brightness = value; } /// The current theme. /// /// Changing this will rebuild the widget tree. ThemeData get theme => _theme; - set theme(ThemeData data) => setState(() => _theme = data); + set theme(ThemeData data) { + _brightness = data.brightness; + _key = null; + setState(() => _theme = data); + } /// The name of the theme. /// @@ -101,9 +115,10 @@ class ThemeChangerState extends State { /// /// When [brightness] or [theme] are changed, [theme] may not exist in /// [ThemeChanger.themes], in which case `themeName` will equal null. - String get themeName => _key; - set themeName (String key) => setState(() { - _theme = (widget.themes ?? {}) [key]; + String? get themeName => _key; + set themeName (String? key) { + setState(() => _theme = (widget.themes) [key] ?? _theme); _key = key; - }); + _brightness = _theme.brightness; + } } diff --git a/lib/src/widgets/atomic/activity_tile.dart b/lib/src/widgets/atomic/activity_tile.dart index 604d420a0..cb06e5494 100644 --- a/lib/src/widgets/atomic/activity_tile.dart +++ b/lib/src/widgets/atomic/activity_tile.dart @@ -18,9 +18,7 @@ class ActivityTile extends StatelessWidget { final Activity activity; /// Creates an ActivityTile widget. - const ActivityTile( - this.activity, - ); + const ActivityTile(this.activity); @override Widget build(BuildContext context) => SizedBox( @@ -37,7 +35,7 @@ class ActivityTile extends StatelessWidget { ? "Tap to see details" : activity.toString(), ), - onTap: activity.message == null ? null : () => showDialog( + onTap: () => showDialog( context: context, builder: (_) => AlertDialog( title: const Text("Activity"), diff --git a/lib/src/widgets/atomic/admin/calendar_tile.dart b/lib/src/widgets/atomic/admin/calendar_tile.dart index 604a92ab6..da50cb5e8 100644 --- a/lib/src/widgets/atomic/admin/calendar_tile.dart +++ b/lib/src/widgets/atomic/admin/calendar_tile.dart @@ -13,16 +13,13 @@ class CalendarTile extends StatelessWidget{ static const CalendarTile blank = CalendarTile(date: null, day: null); /// The date for this tile. - final int date; + final int? date; /// The [Day] represented by this tile. - final Day day; + final Day? day; /// Creates a widget to update a day in the calendar - const CalendarTile({ - @required this.date, - @required this.day, - }); + const CalendarTile({this.date, this.day}); @override Widget build(BuildContext context) => Container( @@ -32,19 +29,19 @@ class CalendarTile extends StatelessWidget{ if (date != null) ...[ Align ( alignment: Alignment.topLeft, - child: Text ((date + 1).toString()), + child: Text ((date! + 1).toString()), ), - if (day?.name != null) + if (day != null) Center ( child: Text ( - day.name, + day!.name, textScaleFactor: 1.5 ), ), if ( - day?.name != null && + day != null && ![Special.rotate.name, Special.regular.name] - .contains(day.special?.name) + .contains(day!.special.name) ) const Align( alignment: Alignment.bottomCenter, child: Text ("•", textScaleFactor: 0.8), diff --git a/lib/src/widgets/atomic/admin/period_tile.dart b/lib/src/widgets/atomic/admin/period_tile.dart index f8cb8a0ce..a3e695048 100644 --- a/lib/src/widgets/atomic/admin/period_tile.dart +++ b/lib/src/widgets/atomic/admin/period_tile.dart @@ -16,7 +16,7 @@ class PeriodTile extends StatelessWidget { final TimeOfDay start, end; /// The [Activity] for this period. - final Activity activity; + final Activity? activity; /// Whether this period is skipped. final bool skipped; @@ -26,9 +26,9 @@ class PeriodTile extends StatelessWidget { /// Creates a widget to edit a period in a [Special]. PeriodTile({ - @required this.model, - @required this.range, - @required this.index, + required this.model, + required this.range, + required this.index, }) : skipped = model.skips.contains(index), activity = null, @@ -67,7 +67,7 @@ class PeriodTile extends StatelessWidget { await showTimePicker( context: context, initialTime: start, - ), + ) ?? start, start: true, ) ), @@ -86,7 +86,7 @@ class PeriodTile extends StatelessWidget { await showTimePicker( context: context, initialTime: end, - ), + ) ?? end, start: false, ) ), @@ -107,7 +107,7 @@ class PeriodTile extends StatelessWidget { /// Creates a [Range] from a [TimeOfDay]. /// /// [start] determines if the range starts with [time] or not. - Range getRange(TimeOfDay time, {bool start}) => Range( + Range getRange(TimeOfDay time, {required bool start}) => Range( start ? time.asTime : range.start, start ? range.end : time.asTime, ); diff --git a/lib/src/widgets/atomic/info_card.dart b/lib/src/widgets/atomic/info_card.dart index c9ab1a503..cbe660222 100644 --- a/lib/src/widgets/atomic/info_card.dart +++ b/lib/src/widgets/atomic/info_card.dart @@ -14,7 +14,7 @@ class InfoCard extends StatelessWidget { /// The text passed to [ListTile.subtitle]. /// /// Every string in the iterable is put on it's own line. - final Iterable children; + final Iterable? children; /// The heading of the tile. final String title; @@ -24,10 +24,10 @@ class InfoCard extends StatelessWidget { /// Creates an info tile. const InfoCard ({ - @required this.title, - @required this.icon, - @required this.children, - this.page, + required this.title, + required this.icon, + required this.page, + this.children, }); @override Widget build (BuildContext context) => Card ( @@ -42,7 +42,7 @@ class InfoCard extends StatelessWidget { children: [ const SizedBox (height: 5), ...[ - for (final String text in children) ...[ + for (final String text in children!) ...[ const SizedBox(height: 2.5), Text(text, textScaleFactor: 1.25), const SizedBox(height: 2.5), diff --git a/lib/src/widgets/atomic/next_class.dart b/lib/src/widgets/atomic/next_class.dart index 9d1f4b342..09cd1375e 100644 --- a/lib/src/widgets/atomic/next_class.dart +++ b/lib/src/widgets/atomic/next_class.dart @@ -13,7 +13,7 @@ class SpecialTile extends StatelessWidget { final Widget child; /// Creates a decorative border. - const SpecialTile({this.child}); + const SpecialTile({required this.child}); @override Widget build (BuildContext context) => Padding ( @@ -32,21 +32,16 @@ class SpecialTile extends StatelessWidget { /// A widget to represent the next class. class NextClass extends StatelessWidget { - /// Whether today has a modified schedule. - /// - /// This determines whether the times should be shown. - final bool modified; - /// Whether this is the next period or not. /// /// This changes the text from "Right now" to "Up next". final bool next; /// The period to represent. - final Period period; + final Period? period; /// The subject associated with [period]. - final Subject subject; + final Subject? subject; /// The reminders that apply for this period. /// @@ -55,10 +50,9 @@ class NextClass extends StatelessWidget { /// Creates an info tile to represent a period. const NextClass({ - @required this.period, - @required this.subject, - @required this.reminders, - @required this.modified, + required this.reminders, + this.period, + this.subject, this.next = false, }); @@ -67,17 +61,14 @@ class NextClass extends StatelessWidget { children: [ InfoCard( icon: next ? Icons.restore : Icons.school, - children: modified - ? const ["See side panel or click for schedule"] - : period?.getInfo(subject), + children: period?.getInfo(subject), page: Routes.schedule, - title: modified ? "Times unavailable" : - period == null - ? "School is over" - : "${next ? 'Up next' : 'Right now'}: ${period.getName(subject)}" + title: period == null + ? "School is over" + : "${next ? 'Up next' : 'Right now'}: ${period!.getName(subject)}" ), if (period?.activity != null) - SpecialTile(child: ActivityTile(period.activity)), + SpecialTile(child: ActivityTile(period!.activity!)), for (final int index in reminders) SpecialTile(child: ReminderTile(index: index)) ] diff --git a/lib/src/widgets/atomic/reminder_tile.dart b/lib/src/widgets/atomic/reminder_tile.dart index e69fcc388..c09152562 100644 --- a/lib/src/widgets/atomic/reminder_tile.dart +++ b/lib/src/widgets/atomic/reminder_tile.dart @@ -16,13 +16,16 @@ class ReminderTile extends StatelessWidget { /// Creates a reminder tile. const ReminderTile({ - @required this.index, + required this.index, this.height = 65, }); @override Widget build (BuildContext context) { + // The data model. final Reminders reminders = Models.instance.reminders; + + // The reminder being represented final Reminder reminder = reminders.reminders [index]; return SizedBox ( @@ -30,11 +33,11 @@ class ReminderTile extends StatelessWidget { child: Center ( child: ListTile( title: Text (reminder.message), - subtitle: Text (reminder.time.toString() ?? ""), + subtitle: Text(reminder.time.toString()), onTap: () async { if (!Models.instance.schedule.isValidReminder(reminder)) { reminders.deleteReminder(index); - Scaffold.of(context).showSnackBar( + ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("Deleted outdated reminder")) ); return; diff --git a/lib/src/widgets/atomic/sports_tile.dart b/lib/src/widgets/atomic/sports_tile.dart index 39fdc9c1e..6febc833a 100644 --- a/lib/src/widgets/atomic/sports_tile.dart +++ b/lib/src/widgets/atomic/sports_tile.dart @@ -18,13 +18,13 @@ class SportsStats extends StatelessWidget { final String dateTime; /// The score for [team]. - final int score; + final int? score; /// Creates a row to represent some stats in a [SportsTile]. const SportsStats({ - @required this.team, - @required this.dateTime, - @required this.score, + required this.team, + required this.dateTime, + this.score, }); @override @@ -48,7 +48,7 @@ class SportsScoreUpdater extends StatefulWidget { /// Opens a dialog to prompt the user for the scores of the game. /// /// Returns the scores as inputted. - static Future updateScores( + static Future updateScores( BuildContext context, SportsGame game ) => showDialog( @@ -58,7 +58,7 @@ class SportsScoreUpdater extends StatefulWidget { /// The game being edited. /// - /// [SportsGame.home] is used to fill [Scores.isHome]. + /// [SportsGame.isHome] is used to fill [Scores.isHome]. final SportsGame game; /// Creates a widget to get the scores for [game] from the user. @@ -79,13 +79,17 @@ class ScoreUpdaterState extends State { final TextEditingController otherController = TextEditingController(); /// The value of [ramazController] as a number. - int ramazScore; + int? ramazScore; /// The value of [otherController] as a number. - int otherScore; + int? otherScore; /// The [Scores] object represented by this widget. - Scores get scores => Scores(ramazScore, otherScore, isHome: widget.game.home); + Scores get scores => Scores( + ramazScore: ramazScore!, // only called if [ready] == true + otherScore: otherScore!, // only called if [ready] == true + isHome: widget.game.isHome + ); /// Whether [scores] is valid and ready to submit. bool get ready => ramazController.text.isNotEmpty && @@ -96,8 +100,8 @@ class ScoreUpdaterState extends State { @override void initState() { super.initState(); - ramazController.text = widget.game.scores?.ramazScore?.toString(); - otherController.text = widget.game.scores?.otherScore?.toString(); + ramazController.text = widget.game.scores?.ramazScore.toString() ?? ""; + otherController.text = widget.game.scores?.otherScore.toString() ?? ""; ramazScore = int.tryParse(ramazController.text); otherScore = int.tryParse(otherController.text); } @@ -146,11 +150,11 @@ class ScoreUpdaterState extends State { ] ), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text("Cancel"), ), - RaisedButton( + ElevatedButton( onPressed: !ready ? null : () => Navigator.of(context).pop(scores), child: const Text("Save"), ) @@ -168,9 +172,8 @@ class ScoreUpdaterState extends State { /// Instead, a pass [onTap] to [SportsTile()]. class SportsTile extends StatelessWidget { /// Formats [date] into month-day-year form. - static String formatDate(DateTime date, {bool noNull = false}) => - noNull && date == null ? null : - "${date?.month ?? ' '}-${date?.day ?? ' '}-${date?.year ?? ' '}"; + static String formatDate(DateTime? date) => + "${date?.month ?? ' '}-${date?.day ?? ' '}-${date?.year ?? ' '}"; /// The game for this widget to represent. final SportsGame game; @@ -182,7 +185,7 @@ class SportsTile extends StatelessWidget { /// [game] depends on the context, so is left to the parent widget. /// /// If this is non-null, an edit icon will be shown on this widget. - final VoidCallback onTap; + final VoidCallback? onTap; /// Creates a widget to display a [SportsGame]. const SportsTile(this.game, {this.onTap}); @@ -203,7 +206,6 @@ class SportsTile extends StatelessWidget { case Sport.tennis: return SportsIcons.tennis; case Sport.volleyball: return SportsIcons.volleyball; } - return null; } /// The color of this widget. @@ -213,11 +215,10 @@ class SportsTile extends StatelessWidget { /// If the game was tied, it's a light gray. /// /// This is a great example of why the helper class [Scores] exists. - Color get cardColor => game.scores != null - ? (game.scores.didDraw + Color? get cardColor => game.scores == null ? null : + game.scores!.didDraw ? Colors.blueGrey - : (game.scores.didWin ? Colors.lightGreen : Colors.red [400]) - ) : null; + : (game.scores!.didWin ? Colors.lightGreen : Colors.red [400]); /// Determines how long to pad the team names so they align. int get padLength => game.opponent.length > "Ramaz".length @@ -239,8 +240,8 @@ class SportsTile extends StatelessWidget { backgroundImage: icon, backgroundColor: cardColor ?? Theme.of(context).cardColor, ), - title: Text(game?.team ?? ""), - subtitle: Text(game.home + title: Text(game.team), + subtitle: Text(game.isHome ? "${game.opponent} @ Ramaz" : "Ramaz @ ${game.opponent}" ), diff --git a/lib/src/widgets/generic/adaptive_scaffold.dart b/lib/src/widgets/generic/adaptive_scaffold.dart index b05d9eda8..a12651afa 100644 --- a/lib/src/widgets/generic/adaptive_scaffold.dart +++ b/lib/src/widgets/generic/adaptive_scaffold.dart @@ -1,109 +1,109 @@ -import "package:flutter/material.dart"; +// import "package:flutter/material.dart"; -class AdaptiveScaffold extends StatelessWidget { - static const double largeScreenWidth = 768; - static const double drawerWidth = 256; - // static const double drawerWidth = 320; - static const double endDrawerWidth = 320; +// class AdaptiveScaffold extends StatelessWidget { +// static const double largeScreenWidth = 768; +// static const double drawerWidth = 256; +// // static const double drawerWidth = 320; +// static const double endDrawerWidth = 320; - final Widget body; - final Widget drawer; - final Widget endDrawer; - final Widget floatingActionButton; - final Widget bottomNavigationBar; - final AppBar appBar; - final AppBar Function(bool) appBarBuilder; +// final Widget body; +// final Widget drawer; +// final Widget endDrawer; +// final Widget floatingActionButton; +// final Widget bottomNavigationBar; +// final AppBar appBar; +// final AppBar Function(bool) appBarBuilder; - const AdaptiveScaffold({ - @required this.body, - this.appBar, - this.appBarBuilder, - this.drawer, - this.endDrawer, - this.floatingActionButton, - this.bottomNavigationBar, - }); +// const AdaptiveScaffold({ +// @required this.body, +// this.appBar, +// this.appBarBuilder, +// this.drawer, +// this.endDrawer, +// this.floatingActionButton, +// this.bottomNavigationBar, +// }); - @override - Widget build(BuildContext context) { - final double width = MediaQuery.of(context).size.width; - final bool shouldShowDrawer = - width >= largeScreenWidth + drawerWidth && drawer != null; - final bool shouldShowEndDrawer = width >= - largeScreenWidth + (drawer == null ? 0 : drawerWidth) + endDrawerWidth - && endDrawer != null; - final AppBar appBar = this.appBar ?? appBarBuilder(shouldShowEndDrawer); +// @override +// Widget build(BuildContext context) { +// final double width = MediaQuery.of(context).size.width; +// final bool shouldShowDrawer = +// width >= largeScreenWidth + drawerWidth && drawer != null; +// final bool shouldShowEndDrawer = width >= +// largeScreenWidth + (drawer == null ? 0 : drawerWidth) + endDrawerWidth +// && endDrawer != null; +// final AppBar appBar = this.appBar ?? appBarBuilder(shouldShowEndDrawer); - return Scaffold( - drawer: shouldShowDrawer ? null : drawer, - endDrawer: shouldShowEndDrawer ? null : endDrawer, - appBar: appBar, - floatingActionButton: floatingActionButton, - bottomNavigationBar: bottomNavigationBar, - body: !shouldShowDrawer - ? body - : StandardDrawerBody( - appBar: appBar, - drawer: drawer, - endDrawer: shouldShowEndDrawer ? null : endDrawer, - body: !shouldShowEndDrawer - ? body - : StandardEndDrawerBody( - body: body, - endDrawer: endDrawer, - ) - ) - ); - } -} +// return Scaffold( +// drawer: shouldShowDrawer ? null : drawer, +// endDrawer: shouldShowEndDrawer ? null : endDrawer, +// appBar: appBar, +// floatingActionButton: floatingActionButton, +// bottomNavigationBar: bottomNavigationBar, +// body: !shouldShowDrawer +// ? body +// : StandardDrawerBody( +// appBar: appBar, +// drawer: drawer, +// endDrawer: shouldShowEndDrawer ? null : endDrawer, +// body: !shouldShowEndDrawer +// ? body +// : StandardEndDrawerBody( +// body: body, +// endDrawer: endDrawer, +// ) +// ) +// ); +// } +// } -class StandardEndDrawerBody extends StatelessWidget { - final Widget body; - final Widget endDrawer; +// class StandardEndDrawerBody extends StatelessWidget { +// final Widget body; +// final Widget endDrawer; - const StandardEndDrawerBody({ - @required this.body, - @required this.endDrawer, - }); +// const StandardEndDrawerBody({ +// @required this.body, +// @required this.endDrawer, +// }); - @override - Widget build(BuildContext context) => Row( - children: [ - Expanded(child: body), - Container( - width: AdaptiveScaffold.endDrawerWidth, - child: endDrawer, - ) - ] - ); -} +// @override +// Widget build(BuildContext context) => Row( +// children: [ +// Expanded(child: body), +// Container( +// width: AdaptiveScaffold.endDrawerWidth, +// child: endDrawer, +// ) +// ] +// ); +// } -class StandardDrawerBody extends StatelessWidget { - final Widget body; - final Widget drawer; - final AppBar appBar; - final Widget endDrawer; +// class StandardDrawerBody extends StatelessWidget { +// final Widget body; +// final Widget drawer; +// final AppBar appBar; +// final Widget endDrawer; - const StandardDrawerBody({ - @required this.body, - @required this.drawer, - @required this.appBar, - @required this.endDrawer, - }); +// const StandardDrawerBody({ +// @required this.body, +// @required this.drawer, +// @required this.appBar, +// @required this.endDrawer, +// }); - @override - Widget build(BuildContext context) => Row( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: AdaptiveScaffold.drawerWidth, - child: Drawer(elevation: 0, child: drawer) - ), - Flexible( - fit: FlexFit.loose, - child: body, - ), - ] - ); -} +// @override +// Widget build(BuildContext context) => Row( +// mainAxisSize: MainAxisSize.min, +// children: [ +// Container( +// width: AdaptiveScaffold.drawerWidth, +// child: Drawer(elevation: 0, child: drawer) +// ), +// Flexible( +// fit: FlexFit.loose, +// child: body, +// ), +// ] +// ); +// } diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index 617d2ece2..a49d9b228 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -19,22 +19,23 @@ class ClassPanel extends StatelessWidget { /// A list of reminders for this period. /// - /// This list holds th indices of the reminders for this period in + /// This list holds the indices of the reminders for this period in /// [Reminders.reminders]. final List reminders; /// An activity for this period. - final Activity activity; + final Activity? activity; /// Creates a widget to represent a period. const ClassPanel ({ - @required this.title, - @required this.children, - @required this.reminders, - @required this.activity, + required this.title, + required this.children, + required this.reminders, + this.activity, }); - @override Widget build (BuildContext context) => ExpansionTile ( + @override + Widget build (BuildContext context) => ExpansionTile ( title: SizedBox ( height: 50, child: Center ( @@ -60,7 +61,7 @@ class ClassPanel extends StatelessWidget { child: Text (label) ), if (activity != null) - ActivityTile(activity), + ActivityTile(activity!), // already checked for null for (final int index in reminders) ReminderTile ( index: index, @@ -84,34 +85,23 @@ class ClassList extends StatelessWidget { /// A list of periods for today. /// /// Comes from using [day] with [User.getPeriods]. - final Iterable periods; + final Iterable? periods; /// The header for this list. May be null. - final String headerText; + final String? headerText; /// Creates a list of [ClassPanel] widgets to represent periods in a day. const ClassList ({ - @required this.day, - this.headerText, + required this.day, this.periods, + this.headerText, }); - Iterable _getPeriods(BuildContext context) { - try { - return periods ?? Models.instance.schedule.user.getPeriods(day); - } on RangeError { // ignore: avoid_catching_errors - Future( // cannot show snackbar on build, so wait for next frame - () => Scaffold.of(context).showSnackBar( - const SnackBar(content: Text("Invalid schedule")) - ) - ); - return Models.instance.schedule.user.getPeriods( - Models.instance.schedule.today - ); - } - } + Iterable _getPeriods(BuildContext context) => + periods ?? Models.instance.schedule.user.getPeriods(day); - @override Widget build(BuildContext context) => ModelListener( + @override + Widget build(BuildContext context) => ModelListener( model: () => Models.instance.reminders, dispose: false, // ignore: sort_child_properties_last @@ -138,7 +128,7 @@ class ClassList extends StatelessWidget { /// Creates a [ClassPanel] for a given period. Widget getPanel(Period period) { - final Subject subject = Models.instance.schedule.subjects[period.id]; + final Subject? subject = Models.instance.schedule.subjects[period.id]; return ClassPanel ( children: [ for (final String description in period.getInfo(subject)) @@ -155,7 +145,7 @@ class ClassList extends StatelessWidget { dayName: day.name, subject: subject?.name, ), - activity: period?.activity, + activity: period.activity, ); } } diff --git a/lib/src/widgets/generic/date_picker.dart b/lib/src/widgets/generic/date_picker.dart index 0b2333dae..1fbf38184 100644 --- a/lib/src/widgets/generic/date_picker.dart +++ b/lib/src/widgets/generic/date_picker.dart @@ -3,9 +3,9 @@ import "package:flutter/material.dart"; /// Prompts the user to pick a date from the calendar. /// /// The calendar will show the days of the school year. -Future pickDate({ - @required BuildContext context, - @required DateTime initialDate +Future pickDate({ + required BuildContext context, + required DateTime initialDate }) async { final DateTime now = DateTime.now(); final DateTime beginningOfYear = DateTime( diff --git a/lib/src/widgets/generic/footer.dart b/lib/src/widgets/generic/footer.dart index d5002fccb..8de104bb3 100644 --- a/lib/src/widgets/generic/footer.dart +++ b/lib/src/widgets/generic/footer.dart @@ -15,7 +15,8 @@ class Footer extends StatelessWidget { /// A scale factor for the footer text. static const double textScale = 1.25; - @override Widget build (BuildContext context) => ModelListener( + @override + Widget build (BuildContext context) => ModelListener( model: () => Models.instance.schedule, dispose: false, // ignore: sort_child_properties_last @@ -40,11 +41,13 @@ class Footer extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Text ( - "Next: ${schedule.nextPeriod.getName(schedule.nextSubject)}", + // ternary already checked for schedule.nextPeriod == null + "Next: ${schedule.nextPeriod!.getName(schedule.nextSubject)}", textScaleFactor: textScale ), Text ( - (schedule.nextPeriod + // ternary already checked for schedule.nextPeriod == null + (schedule.nextPeriod! .getInfo(schedule.nextSubject) ..removeWhere( (String str) => ( diff --git a/lib/src/widgets/generic/model_listener.dart b/lib/src/widgets/generic/model_listener.dart index 34f869f82..0e99d04cd 100644 --- a/lib/src/widgets/generic/model_listener.dart +++ b/lib/src/widgets/generic/model_listener.dart @@ -2,7 +2,7 @@ import "package:flutter/material.dart"; /// A function to build a widget with a [ChangeNotifier] subclass. typedef ModelBuilder = - Widget Function(BuildContext context, T model, Widget child); + Widget Function(BuildContext context, T model, Widget? child); /// A widget that listens to a [ChangeNotifier] and rebuilds the widget tree /// when [ChangeNotifier.notifyListeners]. @@ -23,7 +23,7 @@ class ModelListener extends StatefulWidget { /// This child is never re-built, so if there is an expensive widget that /// does not depend on [model], it would go here and can be /// re-used in [builder]. - final Widget child; + final Widget? child; /// Whether or not to dispose the [model]. /// @@ -33,8 +33,8 @@ class ModelListener extends StatefulWidget { /// Creates a widget that listens to a [ChangeNotifier]. const ModelListener ({ - @required this.model, - @required this.builder, + required this.model, + required this.builder, this.child, this.dispose = true }); @@ -52,14 +52,16 @@ class ModelListenerState /// This is different than [ModelListener.model], which is a function that is /// called to create the model. Here is where the result of that function is /// actually stored. - Model model; + late final Model model; - @override void initState() { + @override + void initState() { super.initState(); model = widget.model()..addListener(listener); } - @override void dispose() { + @override + void dispose() { try { model.removeListener(listener); } catch(_) { // ignore: avoid_catches_without_on_clauses @@ -71,7 +73,8 @@ class ModelListenerState super.dispose(); } - @override Widget build (BuildContext context) => widget.builder ( + @override + Widget build (BuildContext context) => widget.builder ( context, model, widget.child ); diff --git a/lib/src/widgets/images/link_icon.dart b/lib/src/widgets/images/link_icon.dart index d4725b469..9d2f02971 100644 --- a/lib/src/widgets/images/link_icon.dart +++ b/lib/src/widgets/images/link_icon.dart @@ -11,7 +11,7 @@ class LinkIcon extends StatelessWidget { final String url; /// Creates an icon that opens a web page. - const LinkIcon ({@required this.path, @required this.url}); + const LinkIcon ({required this.path, required this.url}); @override Widget build(BuildContext context) => IconButton ( iconSize: 45, diff --git a/lib/src/widgets/images/loading_image.dart b/lib/src/widgets/images/loading_image.dart index 1e5ad6320..47a7cb097 100644 --- a/lib/src/widgets/images/loading_image.dart +++ b/lib/src/widgets/images/loading_image.dart @@ -27,16 +27,16 @@ class LoadingImage extends StatefulWidget { /// /// This is used to size the [CircularProgressIndicator] so that it is /// roughly the same size as the image will be when it loads. - final double aspectRatio; + final double? aspectRatio; /// The image being loaded. final ImageProvider image; /// Creates an image with a placeholder while it loads. - const LoadingImage( - this.image, - {this.aspectRatio} - ); + const LoadingImage({ + required this.image, + required this.aspectRatio + }); @override LoadingImageState createState() => LoadingImageState(); @@ -48,16 +48,16 @@ class LoadingImage extends StatefulWidget { /// out the placeholder animation with the actual image when it loads. class LoadingImageState extends State { /// A listener that will notify when the image has loaded. - ImageStreamListener listener; + late ImageStreamListener listener; /// The stream of bytes in the image. - ImageStream stream; + late ImageStream stream; /// Whether the image is still loading. bool loading = true; /// The aspect ratio of the image. - double aspectRatio; + late double aspectRatio; @override void initState() { super.initState(); @@ -73,7 +73,6 @@ class LoadingImageState extends State { // BUG: Check if this actually works. // ignore: avoid_positional_boolean_parameters void onLoad (ImageInfo info, bool _) { - setState(() => loading = false); aspectRatio = Size ( info.image.width.toDouble(), info.image.height.toDouble() @@ -81,6 +80,7 @@ class LoadingImageState extends State { if (widget.aspectRatio == null) { debugPrint("LoadingImage: Aspect ratio for ${widget.image} is $aspectRatio"); } + setState(() => loading = false); } @override Widget build(BuildContext context) => loading From 4ff2a0c892698901f39a7b5e15e62ba5b0ab08cf Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 26 Mar 2021 00:25:01 -0400 Subject: [PATCH 103/251] Migrated pages library to nnbd --- analysis_options.yaml | 2 +- lib/src/data/admin.dart | 7 +- lib/src/data/schedule/day.dart | 6 +- lib/src/data/sports.dart | 2 +- lib/src/models/data/schedule.dart | 2 +- lib/src/models/data/user.dart | 3 +- lib/src/models/view/calendar_editor.dart | 2 +- lib/src/models/view/schedule.dart | 16 +- lib/src/pages/admin.dart | 32 ++- lib/src/pages/builders/day_builder.dart | 51 ++-- lib/src/pages/builders/reminder_builder.dart | 99 +++----- lib/src/pages/builders/special_builder.dart | 33 +-- lib/src/pages/builders/sports_builder.dart | 31 +-- lib/src/pages/calendar.dart | 11 +- lib/src/pages/drawer.dart | 1 - lib/src/pages/feedback.dart | 5 +- lib/src/pages/home.dart | 213 ++++++++-------- lib/src/pages/login.dart | 39 ++- lib/src/pages/reminders.dart | 52 ++-- lib/src/pages/route_initializer.dart | 30 ++- lib/src/pages/schedule.dart | 45 ++-- lib/src/pages/specials.dart | 10 +- lib/src/pages/splash.dart | 244 +++++++++---------- lib/src/pages/sports.dart | 31 ++- lib/src/widgets/generic/class_list.dart | 13 +- lib/src/widgets/generic/footer.dart | 4 +- lib/src/widgets/generic/icons.dart | 14 +- 27 files changed, 481 insertions(+), 517 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 275d3ba07..af9962932 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -57,7 +57,7 @@ linter: - empty_constructor_bodies - empty_statements - file_names - - flutter_style_todos + # - flutter_style_todos - hash_and_equals - implementation_imports - invariant_booleans diff --git a/lib/src/data/admin.dart b/lib/src/data/admin.dart index c58193523..e231c2ef8 100644 --- a/lib/src/data/admin.dart +++ b/lib/src/data/admin.dart @@ -11,19 +11,24 @@ enum Scope { calendar, /// The admin can access and modify student schedules. - schedule + schedule, + + // THe admin can create and update sports games. + sports, } /// Maps Strings to their respective [Scope]s. const Map stringToScope = { "calendar": Scope.calendar, "schedule": Scope.schedule, + "sports": Scope.sports, }; /// Maps [Scope]s to Strings. const Map scopeToString = { Scope.calendar: "calendar", Scope.schedule: "schedule", + Scope.sports: "sports", }; /// A system administrator. diff --git a/lib/src/data/schedule/day.dart b/lib/src/data/schedule/day.dart index 9eec997af..97d133185 100644 --- a/lib/src/data/schedule/day.dart +++ b/lib/src/data/schedule/day.dart @@ -16,8 +16,10 @@ class Day { /// /// Each element of [data]'s months should be a JSON representation of a [Day]. /// See [Day.fromJson] for how to represent a Day in JSON. - static List> getCalendar(List>> data) => [ - for (final List> month in data) + static List> getCalendar( + List?>> data + ) => [ + for (final List?> month in data) getMonth(month) ]; diff --git a/lib/src/data/sports.dart b/lib/src/data/sports.dart index ee68555fa..fbb126e32 100644 --- a/lib/src/data/sports.dart +++ b/lib/src/data/sports.dart @@ -239,7 +239,7 @@ class SportsGame { /// Returns a new [SportsGame] with the scores switched out. /// /// This method allows [SportsGame]s to stay immutable. - SportsGame replaceScores(Scores newScores) => SportsGame( + SportsGame replaceScores(Scores? newScores) => SportsGame( sport: sport, team: team, isHome: isHome, diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index 2b8cd49e9..ce59c158b 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -30,7 +30,7 @@ class Schedule extends Model { /// /// This timer fires once every [timerInterval], and calls [onNewPeriod] /// when it does. - late Timer? timer; + Timer? timer; /// The [Day] that represents today. Day? today; diff --git a/lib/src/models/data/user.dart b/lib/src/models/data/user.dart index 246756114..d99904348 100644 --- a/lib/src/models/data/user.dart +++ b/lib/src/models/data/user.dart @@ -39,7 +39,8 @@ class UserModel extends Model { if (await Auth.isAdmin) { admin = Admin.fromJson( await Services.instance.database.admin, - await Auth.adminScopes, + // if this object is created, the user is an admin + (await Auth.adminScopes)!, ); } } diff --git a/lib/src/models/view/calendar_editor.dart b/lib/src/models/view/calendar_editor.dart index 6676353a3..6d3f7ed0e 100644 --- a/lib/src/models/view/calendar_editor.dart +++ b/lib/src/models/view/calendar_editor.dart @@ -66,7 +66,7 @@ class CalendarEditor with ChangeNotifier { .cloudDatabase .getCalendarStream(month + 1) .listen( - (List> cal) { + (List?> cal) { calendar [month] = Day.getMonth(cal); calendar [month] = layoutMonth(month); notifyListeners(); diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index bf54b123c..d7a34b785 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -18,7 +18,7 @@ class ScheduleModel with ChangeNotifier { final Schedule schedule; /// The day whose schedule is being shown in the UI. - Day? day; + late Day day; /// The selected date from the calendar. /// @@ -36,15 +36,13 @@ class ScheduleModel with ChangeNotifier { name: schedule.user.schedule.keys.first, special: defaultSpecial ); - day = schedule.hasSchool - ? schedule.today - : defaultDay; + day = schedule.today ?? defaultDay; } /// Attempts to set the UI to the schedule of the given day. /// /// If there is no school on that day, then [ArgumentError] is thrown. - set date (DateTime date) { + set date(DateTime date) { // Get rid of time final DateTime justDate = DateTime.utc ( date.year, @@ -71,16 +69,16 @@ class ScheduleModel with ChangeNotifier { Special? newSpecial, void Function()? onInvalidSchedule, }) { - final String name = newName ?? day?.name ?? defaultDay.name; - final Special special = newSpecial ?? day?.special ?? defaultSpecial; + final String name = newName ?? day.name; + final Special special = newSpecial ?? day.special; day = Day(name: name, special: special); notifyListeners(); try { // Just to see if the computation is possible. // TODO: Move the logic from ClassList here. - Models.instance.schedule.user.getPeriods(day!); + Models.instance.schedule.user.getPeriods(day); } on RangeError { // ignore: avoid_catching_errors - day = Day(name: day!.name, special: defaultSpecial); + day = Day(name: day.name, special: defaultSpecial); if (onInvalidSchedule != null) { onInvalidSchedule(); } diff --git a/lib/src/pages/admin.dart b/lib/src/pages/admin.dart index 96cfe5d1e..ae21b931f 100644 --- a/lib/src/pages/admin.dart +++ b/lib/src/pages/admin.dart @@ -1,9 +1,9 @@ import "package:flutter/material.dart"; -import "package:ramaz/constants.dart"; +import "package:ramaz/data.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/services.dart"; -import "package:ramaz/widgets.dart"; +import "package:ramaz/models.dart"; /// A widget to represent a calendar icon. /// @@ -72,10 +72,10 @@ class AdminMenuItem extends StatelessWidget { /// Creates a menu item for the admin console. const AdminMenuItem({ - @required this.icon, - @required this.label, - @required this.description, - @required this.routeName + required this.icon, + required this.label, + required this.description, + required this.routeName }); @override @@ -103,21 +103,19 @@ class AdminHomePage extends StatefulWidget { /// This state takes care of loading [Auth.isCalendarAdmin] and /// [Auth.isSportsAdmin] and then displaying the appropriate [AdminMenuItem]s. class AdminHomePageState extends State { - bool _isCalendarAdmin, _isSportsAdmin; + /// The scopes this admin is allowed to access. + late final List scopes; @override void initState() { super.initState(); - Auth.isCalendarAdmin.then( - (bool value) => setState(() => _isCalendarAdmin = value) - ); - Auth.isSportsAdmin.then( - (bool value) => setState(() => _isSportsAdmin = value) - ); + // If the user is on this page, they are an admin + // And if they are an admin, UserModel.admin != null + scopes = Models.instance.user.admin!.scopes; } @override - Widget build(BuildContext context) => AdaptiveScaffold( + Widget build(BuildContext context) => Scaffold( drawer: NavigationDrawer(), appBar: AppBar( title: const Text("Admin Console"), @@ -137,19 +135,19 @@ class AdminHomePageState extends State { style: Theme.of(context).textTheme.headline5, ), const SizedBox(height: 20), - if (_isCalendarAdmin ?? false) const AdminMenuItem( + if (scopes.contains(Scope.calendar)) const AdminMenuItem( label: "Calendar", icon: Icons.today, description: "Modify the calendar", routeName: Routes.calendar, ), - if (_isCalendarAdmin ?? false) const AdminMenuItem( + if (scopes.contains(Scope.calendar)) const AdminMenuItem( label: "Schedules", icon: Icons.schedule, description: "Manage your custom schedules", routeName: Routes.specials, ), - if (_isSportsAdmin ?? false) const AdminMenuItem( + if (scopes.contains(Scope.sports)) const AdminMenuItem( icon: Icons.directions_run, label: "Sports", description: "Add new sports games and record scores", diff --git a/lib/src/pages/builders/day_builder.dart b/lib/src/pages/builders/day_builder.dart index 1af99497b..4f30a5e94 100644 --- a/lib/src/pages/builders/day_builder.dart +++ b/lib/src/pages/builders/day_builder.dart @@ -4,24 +4,21 @@ import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; import "package:ramaz/widgets.dart"; -import "special_builder.dart"; - /// A widget to guide the admin in modifying a day in the calendar. /// /// Creates a pop-up that allows the admin to set the dayName and [Special] -/// for a given day in the calendar, even providing an option to create a custom -/// [Special]. +/// for a given day in the calendar. /// /// If [day] is provided, then the fields [DayBuilderModel.name], /// [DayBuilderModel.special], are set to `day.name` ([Day.name]) and /// `day.special` ([Day.special]), respectively. class DayBuilder extends StatelessWidget { /// Returns the [Day] created by this widget. - static Future getDay({ - @required BuildContext context, - @required DateTime date, - @required Day day, - }) => showDialog( + static Future getDay({ + required BuildContext context, + required DateTime date, + @required Day? day, + }) => showDialog( context: context, builder: (_) => DayBuilder(date: date, day: day), ); @@ -30,23 +27,23 @@ class DayBuilder extends StatelessWidget { final DateTime date; /// The day to edit, if it already exists. - final Day day; + final Day? day; /// Creates a widget to guide the user in creating a [Day] const DayBuilder({ - @required this.date, - @required this.day, + required this.date, + this.day, }); @override - Widget build (BuildContext context) => ModelListener( + Widget build(BuildContext context) => ModelListener( model: () => DayBuilderModel(day), // ignore: sort_child_properties_last - child: FlatButton( + child: TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text("Cancel"), ), - builder: (_, DayBuilderModel model, Widget cancel) => AlertDialog( + builder: (_, DayBuilderModel model, Widget? cancel) => AlertDialog( title: const Text("Edit day"), content: Column ( mainAxisSize: MainAxisSize.min, @@ -69,7 +66,7 @@ class DayBuilder extends StatelessWidget { value: model.name, hint: const Text("Day"), onChanged: !model.hasSchool ? null : - (String value) => model.name = value, + (String? value) => model.name = value, items: [ for (final String dayName in Models.instance.schedule.user.dayNames) DropdownMenuItem( @@ -94,12 +91,7 @@ class DayBuilder extends StatelessWidget { ? model.special : null, hint: const Text("Schedule"), onChanged: !model.hasSchool ? null : - (Special special) async { - if (special.name == null && special.periods == null) { - special = await SpecialBuilder.buildSpecial(context); - } - model.special = special; - }, + (Special? special) => model.special = special ?? model.special, items: [ for ( final Special special in @@ -108,17 +100,6 @@ class DayBuilder extends StatelessWidget { value: special, child: Text(special.name), ), - DropdownMenuItem( - value: const Special(null, null), - child: SizedBox( - child: Row( - children: const [ - Text("Make new schedule"), - Icon(Icons.add_circle_outline) - ] - ) - ) - ) ], ) ] @@ -127,8 +108,8 @@ class DayBuilder extends StatelessWidget { ] ), actions: [ - cancel, - RaisedButton( + cancel!, + ElevatedButton( onPressed: !model.ready ? null : () => Navigator.of(context).pop(model.day), child: const Text("Save", style: TextStyle(color: Colors.white)), diff --git a/lib/src/pages/builders/reminder_builder.dart b/lib/src/pages/builders/reminder_builder.dart index 680eecc48..cda688ef1 100644 --- a/lib/src/pages/builders/reminder_builder.dart +++ b/lib/src/pages/builders/reminder_builder.dart @@ -9,9 +9,9 @@ import "package:ramaz/widgets.dart"; /// This widget must be a [StatefulWidget] in order to avoid recreating a /// [TextEditingController] every time the widget tree is rebuilt. class ReminderBuilder extends StatefulWidget { - static void _noop(){} - static final Color _disabledColor = const RaisedButton(onPressed: _noop) - .disabledTextColor; + // static void _noop(){} + // static final Color _disabledColor = const RaisedButton(onPressed: _noop) + // .disabledTextColor; /// Trims a string down to a certain length. /// @@ -20,49 +20,22 @@ class ReminderBuilder extends StatefulWidget { static String trimString (String text, int length) => text.length > length ? text.substring(0, length) : text; - /// Gets the text color for a [MaterialButton]. - /// - /// Due to a bug in Flutter v1.9, [RaisedButton]s in [ButtonBar]s in - /// [AlertDialog]s do not respect [MaterialApp.theme.buttonTheme.textTheme]. - /// This function creates a new [RaisedButton] (outside of an [AlertDialog]) - /// and returns its text color. - static Color getButtonTextColor( - BuildContext context, - Brightness brightness, - {bool enabled} - ) { - if (!enabled) { - return _disabledColor; - } - switch (Theme.of(context).buttonTheme.textTheme) { - case ButtonTextTheme.normal: return brightness == Brightness.dark - ? Colors.white : Colors.black87; - case ButtonTextTheme.accent: return Theme.of(context).accentColor; - case ButtonTextTheme.primary: return Theme.of(context).primaryColor; - default: throw ArgumentError.notNull( - "MaterialApp.theme.buttonTheme.textTheme" - ); - } - } - /// Opens a [ReminderBuilder] pop-up to create or modify a [Reminder]. - static Future buildReminder( - BuildContext context, [Reminder reminder] - ) => showDialog( + static Future buildReminder( + BuildContext context, [Reminder? reminder] + ) => showDialog( context: context, - builder: (_) => ReminderBuilder(reminder: reminder), + builder: (_) => ReminderBuilder(reminder), ); /// A reminder to modify. /// /// A [ReminderBuilder] can either create a new [Reminder] from scratch or /// modify an existing reminder (auto-fill its properties). - final Reminder reminder; + final Reminder? reminder; /// Creates a widget to create or modify a [Reminder]. - const ReminderBuilder({ - this.reminder - }); + const ReminderBuilder(this.reminder); @override ReminderBuilderState createState() => ReminderBuilderState(); @@ -79,7 +52,7 @@ class ReminderBuilderState extends State { @override void initState() { super.initState(); - controller.text = widget.reminder?.message; + controller.text = widget.reminder?.message ?? ""; } @override @@ -88,38 +61,18 @@ class ReminderBuilderState extends State { // ignore: sort_child_properties_last child: TextButton( onPressed: Navigator.of(context).pop, - child: Text ( - "Cancel", - style: TextStyle ( - color: ReminderBuilder.getButtonTextColor( - context, - Theme.of(context).brightness, - enabled: true - ), - ) - ), + child: const Text("Cancel"), ), - builder: (BuildContext context, RemindersBuilderModel model, Widget back) => + builder: (BuildContext context, RemindersBuilderModel model, Widget? back) => AlertDialog( title: Text (widget.reminder == null ? "Create reminder" : "Edit reminder"), actions: [ - back, + back!, ElevatedButton( onPressed: model.ready ? () => Navigator.of(context).pop(model.build()) : null, - child: Text ( - "Save", - style: TextStyle ( - color: ReminderBuilder.getButtonTextColor( - context, - ThemeData.estimateBrightnessForColor( - Theme.of(context).buttonColor - ), - enabled: model.ready, - ), - ) - ), + child: const Text("Save"), ) ], content: Column ( @@ -134,7 +87,8 @@ class ReminderBuilderState extends State { RadioListTile ( value: ReminderTimeType.period, groupValue: model.type, - onChanged: model.toggleRepeatType, + // if toggleable is false (default), the value can never be null + onChanged: (value) => model.toggleRepeatType(value!), title: Text ( "${model.shouldRepeat ? 'Repeats every' : 'On'} period" ), @@ -142,7 +96,8 @@ class ReminderBuilderState extends State { RadioListTile ( value: ReminderTimeType.subject, groupValue: model.type, - onChanged: model.toggleRepeatType, + // if toggleable is false (default), the value can never be null + onChanged: (value) => model.toggleRepeatType(value!), title: Text ( "${model.shouldRepeat ? 'Repeats every' : 'On'} subject" ), @@ -159,7 +114,11 @@ class ReminderBuilderState extends State { child: Text(dayName), ), ], - onChanged: model.changeDay, + onChanged: (String? value) { + if (value != null) { + model.changeDay(value); + } + }, value: model.dayName, hint: const Text("Day"), ), @@ -174,7 +133,11 @@ class ReminderBuilderState extends State { child: Text (period), ) ], - onChanged: model.changePeriod, + onChanged: (String? value) { + if (value != null) { + model.changePeriod(value); + } + }, value: model.period, hint: const Text ("Period"), ) @@ -190,7 +153,11 @@ class ReminderBuilderState extends State { child: Text("${ReminderBuilder.trimString(course, 14)}..."), ) ], - onChanged: model.changeCourse, + onChanged: (String? value) { + if (value != null) { + model.changeCourse(value); + } + }, value: model.course, isDense: true, hint: const Text ("Class"), diff --git a/lib/src/pages/builders/special_builder.dart b/lib/src/pages/builders/special_builder.dart index cb7623068..1e23b7e86 100644 --- a/lib/src/pages/builders/special_builder.dart +++ b/lib/src/pages/builders/special_builder.dart @@ -10,19 +10,19 @@ import "package:ramaz/widgets.dart"; /// an existing [Special] by passing it as a parameter to [SpecialBuilder()]. class SpecialBuilder extends StatefulWidget { /// Returns the [Special] created by this widget. - static Future buildSpecial( + static Future buildSpecial( BuildContext context, - [Special preset] + [Special? preset] ) => showDialog( context: context, - builder: (_) => SpecialBuilder(preset: preset), + builder: (_) => SpecialBuilder(preset), ); /// The [Special] to base this [Special] on. - final Special preset; + final Special? preset; /// Creates a widget to guide the user in creating a [Special]. - const SpecialBuilder({this.preset}); + const SpecialBuilder([this.preset]); @override SpecialBuilderState createState() => SpecialBuilderState(); @@ -47,13 +47,13 @@ class SpecialBuilderState extends State { @override void initState() { super.initState(); - controller.text = widget.preset?.name; + controller.text = widget.preset?.name ?? ""; } @override Widget build(BuildContext context) => ModelListener( model: () => SpecialBuilderModel()..usePreset(widget.preset), - builder: (_, SpecialBuilderModel model, Widget cancel) => Scaffold( + builder: (_, SpecialBuilderModel model, Widget? cancel) => Scaffold( appBar: AppBar( title: const Text("Make new schedule"), actions: [ @@ -61,7 +61,7 @@ class SpecialBuilderState extends State { icon: const Icon(Icons.sync), tooltip: "Use preset", onPressed: () async { - final Special special = await showModalBottomSheet( + final Special? special = await showModalBottomSheet( context: context, builder: (BuildContext context) => ListView( children: [ @@ -80,7 +80,8 @@ class SpecialBuilderState extends State { const Divider(), for ( final Special special in - Models.instance.user.admin.specials + // only admins can access this scren + Models.instance.user.admin!.specials ) ListTile( title: Text (special.name), onTap: () => Navigator.of(context).pop(special), @@ -88,8 +89,10 @@ class SpecialBuilderState extends State { ] ) ); - controller.text = special.name; - model.usePreset(special); + if (special != null) { + controller.text = special.name; + model.usePreset(special); + } } ), ] @@ -132,7 +135,7 @@ class SpecialBuilderState extends State { title: const Text("Homeroom"), trailing: DropdownButton( value: model.homeroom, - onChanged: (int index) => model.homeroom = index, + onChanged: (int? index) => model.homeroom = index, items: [ const DropdownMenuItem( value: null, @@ -150,7 +153,7 @@ class SpecialBuilderState extends State { title: const Text("Mincha"), trailing: DropdownButton( value: model.mincha, - onChanged: (int index) => model.mincha = index, + onChanged: (int? index) => model.mincha = index, items: [ const DropdownMenuItem( value: null, @@ -173,13 +176,13 @@ class SpecialBuilderState extends State { ), Row( children: [ - FlatButton.icon( + TextButton.icon( icon: const Icon (Icons.add), label: const Text("Add"), onPressed: () => model.numPeriods++, ), if (model.numPeriods > 0) - FlatButton.icon( + TextButton.icon( icon: const Icon(Icons.remove), label: const Text("Remove"), onPressed: () => model.numPeriods-- diff --git a/lib/src/pages/builders/sports_builder.dart b/lib/src/pages/builders/sports_builder.dart index ac10143c2..bdba8f548 100644 --- a/lib/src/pages/builders/sports_builder.dart +++ b/lib/src/pages/builders/sports_builder.dart @@ -35,10 +35,10 @@ class FormRow extends StatelessWidget { /// displayed in a [Text] widget. Both widgets, when tapped, call /// [setNewValue]. FormRow.editable({ - @required this.title, - @required String value, - @required VoidCallback setNewValue, - @required IconData whenNull, + required this.title, + required VoidCallback setNewValue, + required IconData whenNull, + String? value, }) : sized = false, moreSpace = true, @@ -85,9 +85,9 @@ class FormRow extends StatelessWidget { /// managed by the view model. class SportsBuilder extends StatefulWidget { /// Opens a form for the user to - static Future createGame( + static Future createGame( BuildContext context, - [SportsGame parent] + [SportsGame? parent] ) => Navigator.of(context).push( MaterialPageRoute( builder: (BuildContext context) => SportsBuilder(parent), @@ -95,7 +95,7 @@ class SportsBuilder extends StatefulWidget { ); /// Fills all the properties on this page with the properties of this game. - final SportsGame parent; + final SportsGame? parent; /// Creates a page to build a [SportsGame]. /// @@ -119,8 +119,8 @@ class SportBuilderState extends State { @override void initState() { - teamController.text = widget.parent?.team; - opponentController.text = widget.parent?.opponent; + teamController.text = widget.parent?.team ?? ""; + opponentController.text = widget.parent?.opponent ?? ""; super.initState(); } @@ -145,7 +145,7 @@ class SportBuilderState extends State { DropdownButtonFormField( hint: const Text("Choose a sport"), value: model.sport, - onChanged: (Sport value) => model.sport = value, + onChanged: (Sport? value) => model.sport = value, items: [ for (final Sport sport in Sport.values) DropdownMenuItem( @@ -178,12 +178,13 @@ class SportBuilderState extends State { "Away game", Checkbox( value: model.away, - onChanged: (bool value) => model.away = value, + // If tristate == false (default), value never be null + onChanged: (bool? value) => model.away = value!, ), ), FormRow.editable( title: "Date", - value: SportsTile.formatDate(model.date, noNull: true), + value: SportsTile.formatDate(model.date), whenNull: Icons.date_range, setNewValue: () async => model.date = await pickDate( initialDate: DateTime.now(), @@ -216,7 +217,7 @@ class SportBuilderState extends State { "Tap on the card to change the scores", textScaleFactor: 0.9 ), - FlatButton( + TextButton( onPressed: () => model.scores = null, child: const Text("Clear"), ) @@ -231,11 +232,11 @@ class SportBuilderState extends State { ), ButtonBar( children: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text("Cancel"), ), - RaisedButton( + ElevatedButton( onPressed: !model.ready ? null : () => Navigator.of(context).pop(model.game), child: const Text("Save"), diff --git a/lib/src/pages/calendar.dart b/lib/src/pages/calendar.dart index a01fdd49a..c402b4db5 100644 --- a/lib/src/pages/calendar.dart +++ b/lib/src/pages/calendar.dart @@ -24,7 +24,7 @@ class CalendarPage extends StatelessWidget { ]; @override - Widget build(BuildContext context) => AdaptiveScaffold( + Widget build(BuildContext context) => Scaffold( appBar: AppBar(title: const Text("Calendar")), body: SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 5), @@ -54,8 +54,9 @@ class CalendarPage extends StatelessWidget { for (int _ = 0; _ < (model.paddings [month] ?? [0]) [0]; _++) CalendarTile.blank, for ( - final MapEntry entry in - model.calendar [month].asMap().entries + final MapEntry entry in + // ExpansionPanelRadio.body checks for nulls + model.calendar [month]!.asMap().entries ) GestureDetector( onTap: () async => model.updateDay( DateTime(model.years [month], month + 1, entry.key + 1), @@ -66,8 +67,8 @@ class CalendarPage extends StatelessWidget { ) ), child: CalendarTile( - date: entry?.key, - day: entry?.value, + date: entry.key, + day: entry.value, ) ), for (int _ = 0; _ < (model.paddings [month] ?? [0]) [1]; _++) diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index e0ecb7da2..504b9dabb 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -2,7 +2,6 @@ import "package:flutter/material.dart"; import "package:ramaz/pages.dart"; -import "package:ramaz/constants.dart"; // for route names import "package:ramaz/models.dart"; import "package:ramaz/services.dart"; import "package:ramaz/widgets.dart"; diff --git a/lib/src/pages/feedback.dart b/lib/src/pages/feedback.dart index c5a239a2e..db3d10d92 100644 --- a/lib/src/pages/feedback.dart +++ b/lib/src/pages/feedback.dart @@ -27,7 +27,8 @@ class FeedbackPage extends StatelessWidget { const SizedBox(height: 20), CheckboxListTile( value: model.anonymous, - onChanged: (bool value) => model.anonymous = value, + // If tristate == false (default), value != null + onChanged: (bool? value) => model.anonymous = value!, title: const Text("Make anonymous"), subtitle: const Text( "We won't be able to see your name or email. " @@ -35,7 +36,7 @@ class FeedbackPage extends StatelessWidget { ) ), const SizedBox(height: 50), - RaisedButton.icon( + ElevatedButton.icon( label: const Text ("Submit"), icon: const Icon(Icons.send), onPressed: !model.ready diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index 5d100ce95..eebc0e5d3 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -1,6 +1,4 @@ import "package:flutter/material.dart"; - -import "package:adaptive_components/adaptive_components.dart"; import "package:breakpoint_scaffold/breakpoint_scaffold.dart"; import "package:ramaz/models.dart"; @@ -33,7 +31,7 @@ class HomePage extends StatelessWidget { /// /// This has to be a separate function since it can recursively call itself. Future refresh(BuildContext context, HomeModel model) => model.refresh( - () => Scaffold.of(context).showSnackBar( + () => ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: const Text("No Internet"), action: SnackBarAction( @@ -47,105 +45,74 @@ class HomePage extends StatelessWidget { @override Widget build (BuildContext context) => ModelListener( model: () => HomeModel(), - builder: (_, HomeModel model, __) => ResponsiveScaffold.navBar( - // appBarBuilder: (isShowingSchedule) => AppBar( - appBar: AppBar( - title: const Text ("Home"), - actions: [ - // if (scheduleModel.hasSchool && !isShowingSchedule) Builder( - if (scheduleModel.hasSchool) ResponsiveBuilder( - builder: (BuildContext context, LayoutInfo info, __) => - info.hasStandardSideSheet ? Container() : FlatButton( - textColor: Colors.white, + builder: (_, HomeModel model, __) => ResponsiveBuilder( + builder: (_, LayoutInfo layout, __) => ResponsiveScaffold.navBar( + appBar: AppBar( + title: const Text ("Home"), + actions: [ + if (scheduleModel.hasSchool && !layout.hasStandardSideSheet) + TextButton( onPressed: () => Scaffold.of(context).openEndDrawer(), child: const Text ("Tap for schedule"), ) - ) - ], - ), - drawer: ResponsiveBuilder( - builder: (BuildContext context, LayoutInfo info, Widget drawer) => - info.hasStandardDrawer ? SizedBox(width: 256, child: drawer) : drawer, - child: NavigationDrawer(), - ), - // SizedBox(width: 256, child: NavigationDrawer()), - sideSheet: ResponsiveBuilder( - builder: (BuildContext context, LayoutInfo info, Widget schedule) => - !scheduleModel.hasSchool ? null : info.hasStandardSideSheet - ? SizedBox(width: 320, child: schedule) : Drawer(child: schedule), - child: ClassList( - day: scheduleModel.today, - periods: scheduleModel.nextPeriod == null - ? scheduleModel.periods - : scheduleModel.periods.getRange ( - (scheduleModel.periodIndex ?? -1) + 1, - scheduleModel.periods.length - ), - headerText: scheduleModel.period == null - ? "Today's Schedule" - : "Upcoming Classes" + ], ), - ), - navItems: const [ - NavigationItem(icon: Icon(Icons.calendar_today), label: "Today"), - NavigationItem(icon: Icon(Icons.schedule), label: "Schedule"), - NavigationItem(icon: Icon(Icons.notifications), label: "Reminders"), - ], - secondaryDrawer: NavigationDrawer(), - navIndex: 0, - onNavIndexChanged: (int value) {}, - body: Builder( - builder: (BuildContext context) => RefreshIndicator( - onRefresh: () => refresh(context, model), - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20), - children: [ - Text ( - "Today is XXX", - style: Theme.of(context).textTheme.headline3, - textAlign: TextAlign.center - ), - const SizedBox (height: 20), - Text( - scheduleModel.hasSchool - ? "Schedule: ${scheduleModel.today.special.name}" - : "There is no school today", - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.headline5, - ), - const SizedBox (height: 10), - ScheduleSlot( - children: [ - if (scheduleModel.hasSchool) NextClass( - reminders: remindersModel.currentReminders, - period: scheduleModel.period, - subject: scheduleModel.subjects [scheduleModel.period?.id], - modified: scheduleModel.today.isModified, - ), - if ( - scheduleModel.nextPeriod != null && - !scheduleModel.today.isModified - ) NextClass ( - next: true, - reminders: remindersModel.nextReminders, - period: scheduleModel.nextPeriod, - subject: scheduleModel.subjects [scheduleModel.nextPeriod?.id], - modified: scheduleModel.today.isModified, - ), - ] - ), - if (sportsModel.todayGames.isNotEmpty) ...[ - const SizedBox(height: 10), - Text( - "Sports games", - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.headline5, + drawer: layout.hasStandardDrawer + ? SizedBox(width: 256, child: NavigationDrawer()) + : NavigationDrawer(), + sideSheet: !scheduleModel.hasSchool || layout.hasStandardSideSheet + ? null + : Drawer( + child: ClassList( + // if there is school, then: + // scheduleModel.today != null + // scheduleModel.periods != null + day: scheduleModel.today!, + periods: scheduleModel.nextPeriod == null + ? scheduleModel.periods! + : scheduleModel.periods!.getRange ( + (scheduleModel.periodIndex ?? -1) + 1, + scheduleModel.periods!.length ), + headerText: scheduleModel.period == null + ? "Today's Schedule" + : "Upcoming Classes" + ), + ), + navItems: const [ + NavigationItem(icon: Icon(Icons.calendar_today), label: "Today"), + NavigationItem(icon: Icon(Icons.schedule), label: "Schedule"), + NavigationItem(icon: Icon(Icons.notifications), label: "Reminders"), + ], + secondaryDrawer: NavigationDrawer(), + navIndex: 0, + onNavIndexChanged: (int value) {}, + body: Builder( + builder: (BuildContext context) => RefreshIndicator( + onRefresh: () => refresh(context, model), + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20), + children: [ + Text ( + "Today is XXX", + style: Theme.of(context).textTheme.headline3, + textAlign: TextAlign.center + ), + const SizedBox (height: 20), + ScheduleSlot(), const SizedBox(height: 10), - for (final int index in sportsModel.todayGames) - SportsTile(sportsModel.games [index]) + if (sportsModel.todayGames.isNotEmpty) ...[ + Text( + "Sports games", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox(height: 10), + for (final int index in sportsModel.todayGames) + SportsTile(sportsModel.games [index]) + ] ] - ] + ) ) ) ) @@ -154,19 +121,55 @@ class HomePage extends StatelessWidget { } +/// Holds the schedule info on the home page. class ScheduleSlot extends StatelessWidget { - final List children; - const ScheduleSlot({@required this.children}); + /// The schedule data model. + late final Schedule scheduleModel; + + /// The reminders data model. + late final Reminders remindersModel; + + /// Displays schedule info on the home page. + ScheduleSlot() { + final Models models = Models.instance; + remindersModel = models.reminders; + scheduleModel = models.schedule; + } + + /// The [NextClass] widgets to display. + List get children => [ + if (scheduleModel.hasSchool) NextClass( + reminders: remindersModel.currentReminders, + period: scheduleModel.period, + subject: scheduleModel.subjects [scheduleModel.period?.id], + ), + if (scheduleModel.nextPeriod != null) NextClass( + next: true, + reminders: remindersModel.nextReminders, + period: scheduleModel.nextPeriod, + subject: scheduleModel.subjects [scheduleModel.nextPeriod?.id], + ), + ]; @override Widget build(BuildContext context) => ResponsiveBuilder( - builder: (_, LayoutInfo layout, __) => - layout.isDesktop && children.length > 1 - ? GridView.count( - shrinkWrap: true, - crossAxisCount: layout.isDesktop ? children.length : 1, - children: children - ) - : Column(children: children) + builder: (_, LayoutInfo layout, __) => Column( + children: [ + Text( + scheduleModel.hasSchool + // if there is school, then scheduleModel.today != null + ? "Schedule: ${scheduleModel.today!.special.name}" + : "There is no school today", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox (height: 10), + if (layout.isDesktop && children.length > 1) GridView.count( + shrinkWrap: true, + crossAxisCount: layout.isDesktop ? children.length : 1, + children: children + ) else Column(children: children) + ] + ) ); } diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index 84f3f5283..f3fab48bc 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -20,11 +20,14 @@ import "package:ramaz/widgets.dart"; /// This page holds methods that can safely clean the errors away before /// prompting the user to try again. class Login extends StatefulWidget { - final WidgetBuilder destinationPage; + /// The page to navigate to after a successful login. + final String destination; - const Login([this.destinationPage]); + /// Builds the login page + const Login({this.destination = Routes.home}); - @override LoginState createState() => LoginState(); + @override + LoginState createState() => LoginState(); } /// A state for the login page. @@ -67,7 +70,7 @@ class LoginState extends State { ), // const SizedBox(height: 100), const Spacer(flex: 1), - FlatButton.icon( + TextButton.icon( icon: Logos.google, label: const Text("Sign in with Google"), onPressed: () => signIn(context), @@ -88,7 +91,10 @@ class LoginState extends State { setState(() => isLoading = false); final Crashlytics crashlytics = Services.instance.crashlytics; await crashlytics.log("Attempted to log in"); - await crashlytics.setEmail(Auth.email); + final String? email = Auth.email; + if (email != null) { + await crashlytics.setEmail(email); + } // ignore: unawaited_futures showDialog ( context: context, @@ -100,13 +106,12 @@ class LoginState extends State { "(class of '21) for help" ), actions: [ - FlatButton ( + TextButton( onPressed: () => Navigator.of(dialogContext).pop(), child: const Text ("Cancel"), ), - RaisedButton ( - onPressed: () => launch ("mailto:leschesl@ramaz.org"), - color: Theme.of(dialogContext).primaryColorLight, + ElevatedButton( + onPressed: () => launch("mailto:leschesl@ramaz.org"), child: const Text ("leschesl@ramaz.org"), ) ] @@ -124,14 +129,14 @@ class LoginState extends State { /// errors. If a network error occurs, a simple [SnackBar] is shown. /// Otherwise, the error pop-up is shown (see [onError]). Future safely({ - @required Future Function() function, - @required void Function() onSuccess, - @required BuildContext scaffoldContext, + required Future Function() function, + required void Function() onSuccess, + required BuildContext scaffoldContext, }) async { try {await function();} on PlatformException catch (error, stack) { if (error.code == "ERROR_NETWORK_REQUEST_FAILED") { - Scaffold.of(scaffoldContext).showSnackBar ( + ScaffoldMessenger.of(scaffoldContext).showSnackBar( const SnackBar (content: Text ("No Internet")), ); return setState(() => isLoading = false); @@ -158,13 +163,7 @@ class LoginState extends State { }, onSuccess: () { setState(() => isLoading = false); - if (widget.destinationPage == null) { - Navigator.of(context).pushReplacementNamed(Routes.home); - } else { - Navigator.of(context).pushReplacement(MaterialPageRoute( - builder: widget.destinationPage - )); - } + Navigator.of(context).pushReplacementNamed(widget.destination); }, ); } diff --git a/lib/src/pages/reminders.dart b/lib/src/pages/reminders.dart index 7fa0a361d..4bfaeb8c3 100644 --- a/lib/src/pages/reminders.dart +++ b/lib/src/pages/reminders.dart @@ -1,6 +1,5 @@ import "package:flutter/material.dart"; -import "package:ramaz/constants.dart"; import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; @@ -19,32 +18,31 @@ class RemindersPage extends StatelessWidget { textAlign: TextAlign.center, ), ), - builder: - (BuildContext context, Reminders model, Widget empty) => AdaptiveScaffold( - bottomNavigationBar: Footer(), - drawer: NavigationDrawer(), - appBar: AppBar( - title: const Text ("Reminders"), - actions: [ - IconButton( - icon: const Icon(Icons.home), - onPressed: () => Navigator.of(context).pushReplacementNamed(Routes.home) - ) - ] - ), - floatingActionButton: FloatingActionButton( - onPressed: () async => - model.addReminder(await ReminderBuilder.buildReminder(context)), - child: const Icon (Icons.note_add), - ), - body: model.reminders.isEmpty - ? empty - : ListView.separated ( - itemCount: model.reminders.length, - separatorBuilder: (_, __) => const Divider(), - itemBuilder: (BuildContext context, int index) => - ReminderTile(index: index), + builder: (_, Reminders model, Widget? empty) => Scaffold( + bottomNavigationBar: Footer(), + drawer: NavigationDrawer(), + appBar: AppBar( + title: const Text ("Reminders"), + actions: [ + IconButton( + icon: const Icon(Icons.home), + onPressed: () => Navigator.of(context).pushReplacementNamed(Routes.home) ) - ) + ] + ), + floatingActionButton: FloatingActionButton( + onPressed: () async => + model.addReminder(await ReminderBuilder.buildReminder(context)), + child: const Icon (Icons.note_add), + ), + body: model.reminders.isEmpty + ? empty + : ListView.separated ( + itemCount: model.reminders.length, + separatorBuilder: (_, __) => const Divider(), + itemBuilder: (BuildContext context, int index) => + ReminderTile(index: index), + ) + ) ); } diff --git a/lib/src/pages/route_initializer.dart b/lib/src/pages/route_initializer.dart index 332fdb89e..725faa6c3 100644 --- a/lib/src/pages/route_initializer.dart +++ b/lib/src/pages/route_initializer.dart @@ -3,16 +3,26 @@ import "package:ramaz/pages.dart"; import "package:ramaz/models.dart"; import "package:ramaz/services.dart"; +/// A route that performs initialization logic first. class RouteInitializer extends StatefulWidget { - static bool alwaysTrue () => true; + /// A dummy predicate that always returns true. + static bool alwaysTrue() => true; + /// Determines if the user is allowed to be on the given page. final bool Function() isAllowed; + + /// Builds the contents of the page. final WidgetBuilder builder; + + /// The route to navigate to if the user is not authorized. final String onFailure; + + /// The route to navigate to if there is an error. final String onError; + /// Navigation with authorization and error-handling. const RouteInitializer({ - @required this.builder, + required this.builder, this.onFailure = Routes.login, this.onError = Routes.login, this.isAllowed = alwaysTrue, @@ -22,8 +32,10 @@ class RouteInitializer extends StatefulWidget { RouteInitializerState createState() => RouteInitializerState(); } +/// The state for a [RouteInitializer]. class RouteInitializerState extends State { - Future initFuture; + /// The future for initializing the backend. + late Future initFuture; @override void initState() { @@ -31,14 +43,20 @@ class RouteInitializerState extends State { initFuture = init(); } + /// Initializes the app's backends. + /// + /// No-op if the backend is already initialized. Future init() async { final NavigatorState nav = Navigator.of(context); try { + if (Models.instance.isReady) { + return; + } await Services.instance.init(); if (Auth.isSignedIn) { await Models.instance.init(); - } - } catch (error) { // + } + } catch (error) { await nav.pushReplacementNamed(widget.onError); } if (!widget.isAllowed()) { @@ -54,4 +72,4 @@ class RouteInitializerState extends State { ? widget.builder(context) : const Center(child: CircularProgressIndicator()) ); -} \ No newline at end of file +} diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index 45b1cde88..091585148 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -1,7 +1,6 @@ // ignore_for_file: prefer_const_constructors_in_immutables import "package:flutter/material.dart"; -import "package:ramaz/constants.dart"; import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; @@ -10,8 +9,8 @@ import "package:ramaz/widgets.dart"; /// A page to allow the user to explore their schedule. class SchedulePage extends StatelessWidget { /// Lets the user know that they chose an invalid schedule combination. - void handleInvalidSchedule(BuildContext context) => Scaffold.of(context) - .showSnackBar( + void handleInvalidSchedule(BuildContext context) => + ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("Invalid schedule")) ); @@ -19,22 +18,8 @@ class SchedulePage extends StatelessWidget { Widget build (BuildContext context) => ModelListener( model: () => ScheduleModel(), // ignore: sort_child_properties_last - builder: ( - BuildContext context, - ScheduleModel model, - Widget _ - ) => AdaptiveScaffold( - appBar: AppBar ( - title: const Text ("Schedule"), - actions: [ - if (ModalRoute.of(context).isFirst) - IconButton ( - icon: const Icon(Icons.home), - onPressed: () => Navigator.of(context) - .pushReplacementNamed(Routes.home) - ) - ], - ), + builder: (_, ScheduleModel model, __) => Scaffold( + appBar: AppBar (title: const Text ("Schedule")), bottomNavigationBar: Footer(), floatingActionButton: Builder( builder: (BuildContext context) => FloatingActionButton( @@ -42,7 +27,7 @@ class SchedulePage extends StatelessWidget { child: const Icon (Icons.calendar_today), ) ), - drawer: ModalRoute.of(context).isFirst ? NavigationDrawer() : null, + drawer: Navigator.of(context).canPop() ? null : NavigationDrawer(), body: Builder( builder: (BuildContext context) => Column( children: [ @@ -50,7 +35,7 @@ class SchedulePage extends StatelessWidget { title: const Text ("Day"), trailing: DropdownButton ( value: model.day.name, - onChanged: (String value) => model.update( + onChanged: (String? value) => model.update( newName: value, onInvalidSchedule: () => handleInvalidSchedule(context), ), @@ -67,7 +52,7 @@ class SchedulePage extends StatelessWidget { title: const Text ("Schedule"), trailing: DropdownButton ( value: model.day.special, - onChanged: (Special special) => model.update( + onChanged: (Special? special) => model.update( newSpecial: special, onInvalidSchedule: () => handleInvalidSchedule(context), ), @@ -88,7 +73,12 @@ class SchedulePage extends StatelessWidget { const SizedBox (height: 20), const Divider(), const SizedBox (height: 20), - Expanded (child: ClassList(day: model.day)), + Expanded( + child: ClassList( + day: model.day, + periods: Models.instance.user.data.getPeriods(model.day) + ) + ), ] ) ) @@ -99,16 +89,17 @@ class SchedulePage extends StatelessWidget { /// /// If there is no school on that day, a [SnackBar] will be shown. Future viewDay(ScheduleModel model, BuildContext context) async { - final DateTime selected = await pickDate ( + final DateTime? selected = await pickDate( context: context, initialDate: model.date, ); if (selected == null) { return; } - try {model.date = selected;} - on Exception { - Scaffold.of(context).showSnackBar( + try { + model.date = selected; + } on Exception { // user picked a day with no school + ScaffoldMessenger.of(context).showSnackBar( const SnackBar ( content: Text ("There is no school on this day") ) diff --git a/lib/src/pages/specials.dart b/lib/src/pages/specials.dart index 90b5d9cb9..5c3a918a3 100644 --- a/lib/src/pages/specials.dart +++ b/lib/src/pages/specials.dart @@ -6,6 +6,8 @@ import "package:ramaz/widgets.dart"; /// A page to show the admin's custom specials. class SpecialPage extends StatelessWidget { + // If the user is on this page, they are an admin. + // So, model.admin != null @override Widget build(BuildContext context) => ModelListener( model: () => Models.instance.user, @@ -22,7 +24,7 @@ class SpecialPage extends StatelessWidget { ), body: Padding( padding: const EdgeInsets.all(20), - child: model.admin.specials.isEmpty + child: model.admin!.specials.isEmpty ? const Center ( child: Text ( "You don't have any schedules yet, but you can make one!", @@ -32,9 +34,9 @@ class SpecialPage extends StatelessWidget { ) : ListView( children: [ - for (int index = 0; index < model.admin.specials.length; index++) + for (int index = 0; index < model.admin!.specials.length; index++) ListTile( - title: Text (model.admin.specials [index].name), + title: Text (model.admin!.specials [index].name), trailing: IconButton( icon: const Icon(Icons.remove_circle), onPressed: () => model.removeSpecialFromAdmin(index), @@ -43,7 +45,7 @@ class SpecialPage extends StatelessWidget { index, await SpecialBuilder.buildSpecial( context, - model.admin.specials [index] + model.admin!.specials [index] ), ) ) diff --git a/lib/src/pages/splash.dart b/lib/src/pages/splash.dart index 953635daa..c2c788307 100644 --- a/lib/src/pages/splash.dart +++ b/lib/src/pages/splash.dart @@ -1,133 +1,133 @@ -// ignore_for_file: prefer_const_constructors_in_immutables -import "dart:async"; +// // ignore_for_file: prefer_const_constructors_in_immutables +// import "dart:async"; -import "package:flutter/material.dart"; -import "package:flutter/foundation.dart" show kDebugMode; -import "package:flutter/services.dart"; +// import "package:flutter/material.dart"; +// import "package:flutter/foundation.dart" show kDebugMode; +// import "package:flutter/services.dart"; -import "package:ramaz/app.dart"; -import "package:ramaz/models.dart"; -import "package:ramaz/services.dart"; -import "package:ramaz/widgets.dart"; +// import "package:ramaz/app.dart"; +// import "package:ramaz/models.dart"; +// import "package:ramaz/services.dart"; +// import "package:ramaz/widgets.dart"; -/// A splash screen that discreetly loads the device's brightness. -class SplashScreen extends StatefulWidget { - @override - SplashScreenState createState() => SplashScreenState(); -} +// /// A splash screen that discreetly loads the device's brightness. +// class SplashScreen extends StatefulWidget { +// @override +// SplashScreenState createState() => SplashScreenState(); +// } -class SplashScreenState extends State { - bool firstTry = true; - bool hasError = false; +// class SplashScreenState extends State { +// bool firstTry = true; +// bool hasError = false; - Brightness brightness; - bool isSignedIn; - bool isLoading = false; - String error; +// Brightness brightness; +// bool isSignedIn; +// bool isLoading = false; +// String error; - @override - void initState() { - super.initState(); - SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - init(); - } +// @override +// void initState() { +// super.initState(); +// SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); +// init(); +// } - Future init() async { - await initServices(); - initBrightness(); - if (isSignedIn) { - try { - await Models.instance.init(); - } catch (code, stack) { // ignore: avoid_catches_without_on_clauses - debugPrint("[SplashScreenState.init]: Error loading data"); - if (!firstTry && !kDebugMode) { - debugPrint(" Wiping data and trying again"); - await Services.instance.database.signOut(); - firstTry = false; - return init(); - } else { - setState(() { - isLoading = false; - hasError = true; - error = "$code\n$stack"; - }); - rethrow; - } - } - } - await launchApp(); - } +// Future init() async { +// await initServices(); +// initBrightness(); +// if (isSignedIn) { +// try { +// await Models.instance.init(); +// } catch (code, stack) { // ignore: avoid_catches_without_on_clauses +// debugPrint("[SplashScreenState.init]: Error loading data"); +// if (!firstTry && !kDebugMode) { +// debugPrint(" Wiping data and trying again"); +// await Services.instance.database.signOut(); +// firstTry = false; +// return init(); +// } else { +// setState(() { +// isLoading = false; +// hasError = true; +// error = "$code\n$stack"; +// }); +// rethrow; +// } +// } +// } +// await launchApp(); +// } - void initBrightness() { - final bool isLightMode = Services.instance.prefs.brightness; - final Brightness brightness = isLightMode == null - ? MediaQuery.of(context).platformBrightness - : isLightMode ? Brightness.light : Brightness.dark; - ThemeChanger.of(context).brightness = brightness; - } +// void initBrightness() { +// final bool isLightMode = Services.instance.prefs.brightness; +// final Brightness brightness = isLightMode == null +// ? MediaQuery.of(context).platformBrightness +// : isLightMode ? Brightness.light : Brightness.dark; +// ThemeChanger.of(context).brightness = brightness; +// } - Future initServices() async { - // This initializes services -- it is always safe. - await Services.instance.init(); - isSignedIn = Services.instance.database.isSignedIn; - } +// Future initServices() async { +// // This initializes services -- it is always safe. +// await Services.instance.init(); +// isSignedIn = Services.instance.database.isSignedIn; +// } - Future launchApp() async { - final Crashlytics crashlytics = Services.instance.crashlytics; - await crashlytics.toggle(!kDebugMode); - FlutterError.onError = crashlytics.recordFlutterError; - runZonedGuarded( - () => runApp(RamLife(isSignedIn: isSignedIn)), - crashlytics.recordError, - ); - } +// Future launchApp() async { +// final Crashlytics crashlytics = Services.instance.crashlytics; +// await crashlytics.toggle(!kDebugMode); +// FlutterError.onError = crashlytics.recordFlutterError; +// runZonedGuarded( +// () => runApp(RamLife(isSignedIn: isSignedIn)), +// crashlytics.recordError, +// ); +// } - @override - Widget build (BuildContext context) => Scaffold( - body: !hasError - ? const Center(child: RamazLogos.ramSquareWords) - : Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Column( - children: [ - if (isLoading) - const LinearProgressIndicator(), - const Spacer(flex: 5), - Text( - "RamLife is having difficulties starting. Make sure your app " - "is updated and try again.", - style: Theme.of(context).textTheme.headline4, - textAlign: TextAlign.center, - ), - const Spacer(flex: 2), - OutlineButton( - onPressed: () async { - setState(() => isLoading = true); - await Services.instance.database.signOut(); - await init(); - }, - child: const Text("Reset"), - ), - const Spacer(flex: 1), - Text( - "The exact error is below", - style: Theme.of(context).textTheme.subtitle1, - ), - const SizedBox(height: 30), - SizedBox( - height: 200, - child: SingleChildScrollView( - child: Text( - error, - style: Theme.of(context).textTheme.caption.copyWith( - color: Theme.of(context).colorScheme.error, - ), - ), - ), - ), - const Spacer(flex: 3), - ] - ) - ) - ); -} \ No newline at end of file +// @override +// Widget build (BuildContext context) => Scaffold( +// body: !hasError +// ? const Center(child: RamazLogos.ramSquareWords) +// : Padding( +// padding: const EdgeInsets.symmetric(horizontal: 20), +// child: Column( +// children: [ +// if (isLoading) +// const LinearProgressIndicator(), +// const Spacer(flex: 5), +// Text( +// "RamLife is having difficulties starting. Make sure your app " +// "is updated and try again.", +// style: Theme.of(context).textTheme.headline4, +// textAlign: TextAlign.center, +// ), +// const Spacer(flex: 2), +// OutlineButton( +// onPressed: () async { +// setState(() => isLoading = true); +// await Services.instance.database.signOut(); +// await init(); +// }, +// child: const Text("Reset"), +// ), +// const Spacer(flex: 1), +// Text( +// "The exact error is below", +// style: Theme.of(context).textTheme.subtitle1, +// ), +// const SizedBox(height: 30), +// SizedBox( +// height: 200, +// child: SingleChildScrollView( +// child: Text( +// error, +// style: Theme.of(context).textTheme.caption.copyWith( +// color: Theme.of(context).colorScheme.error, +// ), +// ), +// ), +// ), +// const Spacer(flex: 3), +// ] +// ) +// ) +// ); +// } \ No newline at end of file diff --git a/lib/src/pages/sports.dart b/lib/src/pages/sports.dart index 1c1d9d8e0..e9079120b 100644 --- a/lib/src/pages/sports.dart +++ b/lib/src/pages/sports.dart @@ -25,7 +25,7 @@ class GenericSportsView extends StatelessWidget { /// /// This can be any type as long as it can be used in [builder] to build /// [SportsTile]s. - final Iterable recents; + final List recents; /// Builds a list of [SportsTile]s using [upcoming] and [recents]. final Widget Function(T) builder; @@ -38,11 +38,11 @@ class GenericSportsView extends StatelessWidget { /// Creates a list of [SportsTile]s. const GenericSportsView({ - @required this.upcoming, - @required this.recents, - @required this.builder, - @required this.onRefresh, - @required this.loading, + required this.upcoming, + required this.recents, + required this.builder, + required this.onRefresh, + required this.loading, }); @override @@ -71,7 +71,7 @@ class SportsPage extends StatelessWidget { length: 2, child: ModelListener( model: () => SportsModel(Models.instance.sports), - builder: (BuildContext context, SportsModel model, _) => AdaptiveScaffold( + builder: (_, SportsModel model, __) => Scaffold( appBar: AppBar( title: const Text("Sports"), bottom: const TabBar( @@ -159,16 +159,15 @@ class SportsPage extends StatelessWidget { ) ); } - return null; } /// Opens a menu with options for the selected game. /// /// This menu can only be accessed by administrators. static void openMenu({ - @required BuildContext context, - @required int index, - @required SportsModel model + required BuildContext context, + required int index, + required SportsModel model }) => showDialog( context: context, builder: (BuildContext newContext) => SimpleDialog( @@ -177,7 +176,7 @@ class SportsPage extends StatelessWidget { SimpleDialogOption( onPressed: () async { Navigator.of(newContext).pop(); - final Scores scores = await SportsScoreUpdater.updateScores( + final Scores? scores = await SportsScoreUpdater.updateScores( context, model.data.games [index] ); if (scores == null) { @@ -222,24 +221,24 @@ class SportsPage extends StatelessWidget { SimpleDialogOption( onPressed: () async { Navigator.of(newContext).pop(); - final bool confirm = await showDialog( + final bool? confirm = await showDialog( context: context, builder: (BuildContext context) => AlertDialog( title: const Text("Confirm"), content: const Text("Are you sure you want to delete this game?"), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(false), child: const Text("Cancel"), ), - RaisedButton( + ElevatedButton( onPressed: () => Navigator.of(context).pop(true), child: const Text("Confirm"), ) ] ) ); - if (confirm) { + if (confirm ?? false) { model.loading = true; await Models.instance.sports.delete(index); model.loading = false; diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index a49d9b228..612256c46 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -85,7 +85,7 @@ class ClassList extends StatelessWidget { /// A list of periods for today. /// /// Comes from using [day] with [User.getPeriods]. - final Iterable? periods; + final Iterable periods; /// The header for this list. May be null. final String? headerText; @@ -93,13 +93,10 @@ class ClassList extends StatelessWidget { /// Creates a list of [ClassPanel] widgets to represent periods in a day. const ClassList ({ required this.day, - this.periods, + required this.periods, this.headerText, }); - Iterable _getPeriods(BuildContext context) => - periods ?? Models.instance.schedule.user.getPeriods(day); - @override Widget build(BuildContext context) => ModelListener( model: () => Models.instance.reminders, @@ -114,12 +111,12 @@ class ClassList extends StatelessWidget { ) ) ), - builder: (_, __, Widget header) => ListView( + builder: (_, __, Widget? header) => ListView( shrinkWrap: true, children: [ - if (headerText != null) header, + if (headerText != null) header!, // child is supplied ...[ - for (final Period period in _getPeriods(context)) + for (final Period period in periods) getPanel(period) ], ] diff --git a/lib/src/widgets/generic/footer.dart b/lib/src/widgets/generic/footer.dart index 8de104bb3..febfda8e6 100644 --- a/lib/src/widgets/generic/footer.dart +++ b/lib/src/widgets/generic/footer.dart @@ -21,8 +21,8 @@ class Footer extends StatelessWidget { dispose: false, // ignore: sort_child_properties_last child: Container(height: 0, width: 0), - builder: (BuildContext context, Schedule schedule, Widget blank) => - schedule.nextPeriod == null ? blank : BottomSheet ( + builder: (_, Schedule schedule, Widget? blank) => + schedule.nextPeriod == null ? blank! : BottomSheet ( enableDrag: false, onClosing: () {}, builder: (BuildContext context) => GestureDetector( diff --git a/lib/src/widgets/generic/icons.dart b/lib/src/widgets/generic/icons.dart index 92a898438..4537cd066 100644 --- a/lib/src/widgets/generic/icons.dart +++ b/lib/src/widgets/generic/icons.dart @@ -78,8 +78,8 @@ class RamazLogos { /// The light blue, square Ramaz logo. /// /// https://pbs.twimg.com/profile_images/378800000152983492/5724a8d14e67b53234ed96e3235fe526.jpeg - static const Widget teal = LoadingImage ( - AssetImage("images/logos/ramaz/teal.jpg"), + static const Widget teal = LoadingImage( + image: AssetImage("images/logos/ramaz/teal.jpg"), aspectRatio: 1 ); @@ -87,8 +87,8 @@ class RamazLogos { /// /// Like https://www.the-rampage.org/wp-content/uploads/2019/08/IMG_0432.png, /// but with the word Ramaz underneath. - static const Widget ramSquareWords = LoadingImage ( - AssetImage("images/logos/ramaz/ram_square_words.png"), + static const Widget ramSquareWords = LoadingImage( + image: AssetImage("images/logos/ramaz/ram_square_words.png"), aspectRatio: 0.9276218611521418 ); @@ -96,7 +96,7 @@ class RamazLogos { /// /// https://www.the-rampage.org/wp-content/uploads/2019/08/IMG_0432.png static const Widget ramSquare = LoadingImage( - AssetImage("images/logos/ramaz/ram_square.png"), + image: AssetImage("images/logos/ramaz/ram_square.png"), aspectRatio: 1.0666666666666667 ); @@ -105,8 +105,8 @@ class RamazLogos { /// https://www.the-rampage.org/wp-content/uploads/2019/08/IMG_0432.png /// with https://upload.wikimedia.org/wikipedia/commons/a/aa/RamazNewLogo_BLUE_RGB_Large72dpi.jpg /// next to it. - static const Widget ramRectangle = LoadingImage ( - AssetImage("images/logos/ramaz/ram_rectangle.png"), + static const Widget ramRectangle = LoadingImage( + image: AssetImage("images/logos/ramaz/ram_rectangle.png"), aspectRatio: 2.8915864378401004 ); } From e2330b0b0ec195c550438f1ead7d63de5cbcd336 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 26 Mar 2021 04:19:13 -0400 Subject: [PATCH 104/251] Cleanup on Web -- successful login! --- lib/app.dart | 15 +- lib/models.dart | 38 +++-- lib/src/data/admin.dart | 5 +- lib/src/data/contact_info.dart | 4 +- lib/src/data/user.dart | 26 +++- lib/src/models/data/schedule.dart | 3 +- lib/src/models/data/sports.dart | 19 +-- lib/src/pages/login.dart | 4 +- lib/src/pages/route_initializer.dart | 13 +- lib/src/pages/splash.dart | 133 ------------------ lib/src/services/crashlytics/stub.dart | 5 +- .../widgets/generic/adaptive_scaffold.dart | 109 -------------- 12 files changed, 79 insertions(+), 295 deletions(-) delete mode 100644 lib/src/pages/splash.dart delete mode 100644 lib/src/widgets/generic/adaptive_scaffold.dart diff --git a/lib/app.dart b/lib/app.dart index bf48539d5..cf7a410e5 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -6,16 +6,10 @@ import "package:ramaz/widgets.dart"; import "package:ramaz/services.dart"; /// The main app widget. -class RamLife extends StatefulWidget { - /// Creates the main app widget. +class RamLife extends StatelessWidget { + /// Provides a const constructor. const RamLife(); - @override - RamLifeState createState() => RamLifeState(); -} - -/// The state for the app. -class RamLifeState extends State { @override Widget build (BuildContext context) => ThemeChanger( defaultBrightness: Brightness.light, @@ -84,7 +78,10 @@ class RamLifeState extends State { color: RamazColors.blue, theme: theme, routes: { - Routes.login: (_) => const Login(), + Routes.login: (_) => RouteInitializer( + builder: (_) => Login(), + onError: null, // the default IS the login page + ), Routes.home: enforceLogin((_) => HomePage()), Routes.schedule: enforceLogin((_) => SchedulePage()), Routes.reminders: enforceLogin((_) => RemindersPage()), diff --git a/lib/models.dart b/lib/models.dart index 9340ead9c..08c5e07ec 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -24,6 +24,8 @@ /// state should depend on their corresponding view model. library models; +import "package:ramaz/services.dart"; + import "src/models/data/model.dart"; import "src/models/data/reminders.dart"; import "src/models/data/schedule.dart"; @@ -61,27 +63,40 @@ class Models extends Model { /// The singleton instance of this class. static Models instance = Models(); + Reminders? _reminders; + Schedule? _schedule; + Sports? _sports; + UserModel? _user; + /// The reminders data model. - Reminders reminders = Reminders(); + Reminders get reminders => _reminders ??= Reminders(); /// The schedule data model. - Schedule schedule = Schedule(); + Schedule get schedule => _schedule ??= Schedule(); /// The sports data model. - Sports sports = Sports(); + Sports get sports => _sports ??= Sports(); /// The user data model. - UserModel user = UserModel(); + UserModel get user => _user ??= UserModel(); /// Whether the data models have been initialized. bool isReady = false; @override Future init() async { + if (isReady) { + return; + } + final Crashlytics crashlytics = Services.instance.crashlytics; + await crashlytics.log("Initializing user model"); await user.init(); + await crashlytics.log("Initializing reminders model"); await reminders.init(); + await crashlytics.log("Initializing schedule model"); await schedule.init(); - await sports.init(refresh: true); + await crashlytics.log("Initializing sports model"); + await sports.init(); isReady = true; } @@ -89,10 +104,15 @@ class Models extends Model { // This object can be revived using [init]. // ignore: must_call_super void dispose() { - schedule.dispose(); - reminders.dispose(); - sports.dispose(); - user.dispose(); + _schedule?.dispose(); + _reminders?.dispose(); + _sports?.dispose(); + _user?.dispose(); + // These data models have been disposed and cannot be used again + _reminders = null; + _schedule = null; + _sports = null; + _user = null; isReady = false; } } diff --git a/lib/src/data/admin.dart b/lib/src/data/admin.dart index e231c2ef8..44baad54c 100644 --- a/lib/src/data/admin.dart +++ b/lib/src/data/admin.dart @@ -13,7 +13,7 @@ enum Scope { /// The admin can access and modify student schedules. schedule, - // THe admin can create and update sports games. + /// The admin can create and update sports games. sports, } @@ -61,7 +61,8 @@ class Admin { Admin.fromJson(Map json, List _scopes) : scopes = [ for (String scope in _scopes) - stringToScope [scope]! + if (stringToScope.containsKey(scope)) + stringToScope [scope]! ], email = json ["email"], specials = [ diff --git a/lib/src/data/contact_info.dart b/lib/src/data/contact_info.dart index cc385bd27..9abe5b274 100644 --- a/lib/src/data/contact_info.dart +++ b/lib/src/data/contact_info.dart @@ -15,13 +15,13 @@ class ContactInfo { /// /// This is filled in voluntary by the user, and cannot be retrieved from the /// database. So this field will start off null, and be populated over time. - final String phoneNumber; + final String? phoneNumber; /// Bundles personal info about the user. ContactInfo({ required this.name, required this.email, - required this.phoneNumber, + this.phoneNumber, }); /// Creates a contact from JSON. diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index 40da7ee31..974e0ac24 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -82,22 +82,34 @@ class User { this.advisory, }); + /// Gets a value from JSON, throwing if null. + /// + /// This function is needed since null checks don't run on dynamic values. + static dynamic safeJson(Map json, String key) { + final dynamic value = json [key]; + if (value == null) { + throw ArgumentError.notNull(key); + } else { + return value; + } + } + /// Creates a new user from JSON. User.fromJson(Map json) : - dayNames = List.from(json ["dayNames"]), + // dayNames = List.from(json ["dayNames"]), + dayNames = List.from(safeJson(json, "dayNames")), schedule = { - for (final String dayName in [...json ["dayNames"]]) + for (final String dayName in safeJson(json, "dayNames")) dayName: PeriodData.getList(json [dayName]) }, advisory = json ["advisory"] == null ? null : Advisory.fromJson( - Map.from(json ["advisory"]) + Map.from(safeJson(json, "advisory")) ), contactInfo = ContactInfo.fromJson( - Map.from(json ["contactInfo"]) + Map.from(safeJson(json, "contactInfo")) ), - grade = intToGrade [json ["grade"]], - registeredClubs = json ["registeredClubs"] == null - ? [] : List.from(json ["registeredClubs"]); + grade = intToGrade [safeJson(json, "grade")], + registeredClubs = List.from(json ["registeredClubs"] ?? []); /// Gets the unique section IDs for the courses this user is enrolled in. /// diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index ce59c158b..f1278d97f 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -112,7 +112,8 @@ class Schedule extends Model { /// Updates the current period. void onNewPeriod({bool first = false}) { - final DateTime newDate = DateTime.now(); + // final DateTime newDate = DateTime.now(); + final DateTime newDate = DateTime(2021, 03, 27); // Day changed. Probably midnight. if (newDate.day != now.day) { diff --git a/lib/src/models/data/sports.dart b/lib/src/models/data/sports.dart index 35f2ea261..52d6f8df9 100644 --- a/lib/src/models/data/sports.dart +++ b/lib/src/models/data/sports.dart @@ -28,20 +28,13 @@ class Sports extends Model { /// Loads data from the device and @override - Future init({bool refresh = false}) async { + Future init() async { + print("Creating sports model"); timer = Timer.periodic(_minute, (_) => todayGames = getTodayGames()); - if (refresh) { - games = SportsGame.fromList(await Services.instance.database.sports); - todayGames = getTodayGames(); - now = DateTime.now(); - } else { - final DateTime newDate = DateTime.now(); - if (!newDate.isSameDay(now)) { - todayGames = getTodayGames(); - now = newDate; - } - } - notifyListeners(); + games = SportsGame.fromList(await Services.instance.database.sports); + todayGames = getTodayGames(); + now = DateTime.now(); + print("Finished sports model"); } /// Returns a list of all the games taking place today. diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index f3fab48bc..a1de56867 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -24,7 +24,7 @@ class Login extends StatefulWidget { final String destination; /// Builds the login page - const Login({this.destination = Routes.home}); + Login({this.destination = Routes.home}); @override LoginState createState() => LoginState(); @@ -90,7 +90,7 @@ class LoginState extends State { Future onError(dynamic error, StackTrace stack) async { setState(() => isLoading = false); final Crashlytics crashlytics = Services.instance.crashlytics; - await crashlytics.log("Attempted to log in"); + await crashlytics.log("Login failed"); final String? email = Auth.email; if (email != null) { await crashlytics.setEmail(email); diff --git a/lib/src/pages/route_initializer.dart b/lib/src/pages/route_initializer.dart index 725faa6c3..0e5c89498 100644 --- a/lib/src/pages/route_initializer.dart +++ b/lib/src/pages/route_initializer.dart @@ -18,7 +18,7 @@ class RouteInitializer extends StatefulWidget { final String onFailure; /// The route to navigate to if there is an error. - final String onError; + final String? onError; /// Navigation with authorization and error-handling. const RouteInitializer({ @@ -49,15 +49,16 @@ class RouteInitializerState extends State { Future init() async { final NavigatorState nav = Navigator.of(context); try { - if (Models.instance.isReady) { - return; - } await Services.instance.init(); - if (Auth.isSignedIn) { + if (Auth.isSignedIn && !Models.instance.isReady) { await Models.instance.init(); } } catch (error) { - await nav.pushReplacementNamed(widget.onError); + await Services.instance.crashlytics.log("Error. Disposing models"); + Models.instance.dispose(); + if (widget.onError != null) { + await nav.pushReplacementNamed(widget.onError!); + } } if (!widget.isAllowed()) { await nav.pushReplacementNamed(widget.onFailure); diff --git a/lib/src/pages/splash.dart b/lib/src/pages/splash.dart deleted file mode 100644 index c2c788307..000000000 --- a/lib/src/pages/splash.dart +++ /dev/null @@ -1,133 +0,0 @@ -// // ignore_for_file: prefer_const_constructors_in_immutables -// import "dart:async"; - -// import "package:flutter/material.dart"; -// import "package:flutter/foundation.dart" show kDebugMode; -// import "package:flutter/services.dart"; - -// import "package:ramaz/app.dart"; -// import "package:ramaz/models.dart"; -// import "package:ramaz/services.dart"; -// import "package:ramaz/widgets.dart"; - -// /// A splash screen that discreetly loads the device's brightness. -// class SplashScreen extends StatefulWidget { -// @override -// SplashScreenState createState() => SplashScreenState(); -// } - -// class SplashScreenState extends State { -// bool firstTry = true; -// bool hasError = false; - -// Brightness brightness; -// bool isSignedIn; -// bool isLoading = false; -// String error; - -// @override -// void initState() { -// super.initState(); -// SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); -// init(); -// } - -// Future init() async { -// await initServices(); -// initBrightness(); -// if (isSignedIn) { -// try { -// await Models.instance.init(); -// } catch (code, stack) { // ignore: avoid_catches_without_on_clauses -// debugPrint("[SplashScreenState.init]: Error loading data"); -// if (!firstTry && !kDebugMode) { -// debugPrint(" Wiping data and trying again"); -// await Services.instance.database.signOut(); -// firstTry = false; -// return init(); -// } else { -// setState(() { -// isLoading = false; -// hasError = true; -// error = "$code\n$stack"; -// }); -// rethrow; -// } -// } -// } -// await launchApp(); -// } - -// void initBrightness() { -// final bool isLightMode = Services.instance.prefs.brightness; -// final Brightness brightness = isLightMode == null -// ? MediaQuery.of(context).platformBrightness -// : isLightMode ? Brightness.light : Brightness.dark; -// ThemeChanger.of(context).brightness = brightness; -// } - -// Future initServices() async { -// // This initializes services -- it is always safe. -// await Services.instance.init(); -// isSignedIn = Services.instance.database.isSignedIn; -// } - -// Future launchApp() async { -// final Crashlytics crashlytics = Services.instance.crashlytics; -// await crashlytics.toggle(!kDebugMode); -// FlutterError.onError = crashlytics.recordFlutterError; -// runZonedGuarded( -// () => runApp(RamLife(isSignedIn: isSignedIn)), -// crashlytics.recordError, -// ); -// } - -// @override -// Widget build (BuildContext context) => Scaffold( -// body: !hasError -// ? const Center(child: RamazLogos.ramSquareWords) -// : Padding( -// padding: const EdgeInsets.symmetric(horizontal: 20), -// child: Column( -// children: [ -// if (isLoading) -// const LinearProgressIndicator(), -// const Spacer(flex: 5), -// Text( -// "RamLife is having difficulties starting. Make sure your app " -// "is updated and try again.", -// style: Theme.of(context).textTheme.headline4, -// textAlign: TextAlign.center, -// ), -// const Spacer(flex: 2), -// OutlineButton( -// onPressed: () async { -// setState(() => isLoading = true); -// await Services.instance.database.signOut(); -// await init(); -// }, -// child: const Text("Reset"), -// ), -// const Spacer(flex: 1), -// Text( -// "The exact error is below", -// style: Theme.of(context).textTheme.subtitle1, -// ), -// const SizedBox(height: 30), -// SizedBox( -// height: 200, -// child: SingleChildScrollView( -// child: Text( -// error, -// style: Theme.of(context).textTheme.caption.copyWith( -// color: Theme.of(context).colorScheme.error, -// ), -// ), -// ), -// ), -// const Spacer(flex: 3), -// ] -// ) -// ) -// ); -// } \ No newline at end of file diff --git a/lib/src/services/crashlytics/stub.dart b/lib/src/services/crashlytics/stub.dart index 70812fa12..b68530cfe 100644 --- a/lib/src/services/crashlytics/stub.dart +++ b/lib/src/services/crashlytics/stub.dart @@ -20,7 +20,7 @@ class CrashlyticsStub extends Crashlytics { dynamic exception, StackTrace stack, {dynamic context} - ) async => throw exception; + ) => Future.error(exception, stack); // keeps the stack trace @override Future recordFlutterError ( @@ -32,7 +32,8 @@ class CrashlyticsStub extends Crashlytics { Future setEmail(String email) async {} @override - Future log(String message) async {} + // ignore: avoid_print + Future log(String message) async => print(message); @override Future toggle(bool value) async {} diff --git a/lib/src/widgets/generic/adaptive_scaffold.dart b/lib/src/widgets/generic/adaptive_scaffold.dart deleted file mode 100644 index a12651afa..000000000 --- a/lib/src/widgets/generic/adaptive_scaffold.dart +++ /dev/null @@ -1,109 +0,0 @@ -// import "package:flutter/material.dart"; - -// class AdaptiveScaffold extends StatelessWidget { -// static const double largeScreenWidth = 768; -// static const double drawerWidth = 256; -// // static const double drawerWidth = 320; -// static const double endDrawerWidth = 320; - -// final Widget body; -// final Widget drawer; -// final Widget endDrawer; -// final Widget floatingActionButton; -// final Widget bottomNavigationBar; -// final AppBar appBar; -// final AppBar Function(bool) appBarBuilder; - -// const AdaptiveScaffold({ -// @required this.body, -// this.appBar, -// this.appBarBuilder, -// this.drawer, -// this.endDrawer, -// this.floatingActionButton, -// this.bottomNavigationBar, -// }); - -// @override -// Widget build(BuildContext context) { -// final double width = MediaQuery.of(context).size.width; -// final bool shouldShowDrawer = -// width >= largeScreenWidth + drawerWidth && drawer != null; -// final bool shouldShowEndDrawer = width >= -// largeScreenWidth + (drawer == null ? 0 : drawerWidth) + endDrawerWidth -// && endDrawer != null; -// final AppBar appBar = this.appBar ?? appBarBuilder(shouldShowEndDrawer); - -// return Scaffold( -// drawer: shouldShowDrawer ? null : drawer, -// endDrawer: shouldShowEndDrawer ? null : endDrawer, -// appBar: appBar, -// floatingActionButton: floatingActionButton, -// bottomNavigationBar: bottomNavigationBar, -// body: !shouldShowDrawer -// ? body -// : StandardDrawerBody( -// appBar: appBar, -// drawer: drawer, -// endDrawer: shouldShowEndDrawer ? null : endDrawer, -// body: !shouldShowEndDrawer -// ? body -// : StandardEndDrawerBody( -// body: body, -// endDrawer: endDrawer, -// ) -// ) -// ); -// } -// } - -// class StandardEndDrawerBody extends StatelessWidget { -// final Widget body; -// final Widget endDrawer; - -// const StandardEndDrawerBody({ -// @required this.body, -// @required this.endDrawer, -// }); - -// @override -// Widget build(BuildContext context) => Row( -// children: [ -// Expanded(child: body), -// Container( -// width: AdaptiveScaffold.endDrawerWidth, -// child: endDrawer, -// ) -// ] -// ); -// } - -// class StandardDrawerBody extends StatelessWidget { -// final Widget body; -// final Widget drawer; -// final AppBar appBar; -// final Widget endDrawer; - -// const StandardDrawerBody({ -// @required this.body, -// @required this.drawer, -// @required this.appBar, -// @required this.endDrawer, -// }); - -// @override -// Widget build(BuildContext context) => Row( -// mainAxisSize: MainAxisSize.min, -// children: [ -// Container( -// width: AdaptiveScaffold.drawerWidth, -// child: Drawer(elevation: 0, child: drawer) -// ), -// Flexible( -// fit: FlexFit.loose, -// child: body, -// ), -// ] -// ); -// } - From 45790f2cafe3e29c161e04480a0bb3c05e358f13 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 26 Mar 2021 04:20:22 -0400 Subject: [PATCH 105/251] Updated firebase scripts for nnbd --- firebase/firestore/build.yaml | 1 + .../firestore/lib/src/services/firestore.dart | 2 +- firebase/firestore/node/admins.dart | 2 ++ firebase/firestore/node/calendar.dart | 2 ++ firebase/firestore/node/faculty.dart | 2 ++ firebase/firestore/node/feedback.dart | 2 ++ firebase/firestore/node/sections.dart | 2 ++ firebase/firestore/node/students.dart | 2 ++ firebase/firestore/node/zoom_links.dart | 2 ++ firebase/firestore/pubspec.yaml | 35 +++++++++++++------ 10 files changed, 41 insertions(+), 11 deletions(-) diff --git a/firebase/firestore/build.yaml b/firebase/firestore/build.yaml index 9b77e7c65..79f7df082 100644 --- a/firebase/firestore/build.yaml +++ b/firebase/firestore/build.yaml @@ -1,6 +1,7 @@ targets: $default: sources: + - $package$ - "lib/**" - "node/**" # main.dart MUST be in node folder. # - "test/**" diff --git a/firebase/firestore/lib/src/services/firestore.dart b/firebase/firestore/lib/src/services/firestore.dart index 131b23910..5b0bf7f02 100644 --- a/firebase/firestore/lib/src/services/firestore.dart +++ b/firebase/firestore/lib/src/services/firestore.dart @@ -121,7 +121,7 @@ class Firestore { "month": month, "calendar": [ for (final Day day in calendar) - day.json + day?.json ], } ) diff --git a/firebase/firestore/node/admins.dart b/firebase/firestore/node/admins.dart index fb233701e..22cae71d5 100644 --- a/firebase/firestore/node/admins.dart +++ b/firebase/firestore/node/admins.dart @@ -1,3 +1,5 @@ +// @dart=2.9 + import "package:firestore/helpers.dart"; import "package:firestore/services.dart"; diff --git a/firebase/firestore/node/calendar.dart b/firebase/firestore/node/calendar.dart index 5bf5061c7..cf6493850 100644 --- a/firebase/firestore/node/calendar.dart +++ b/firebase/firestore/node/calendar.dart @@ -1,3 +1,5 @@ +// @dart=2.9 + import "package:firestore/data.dart"; import "package:firestore/helpers.dart"; import "package:firestore/services.dart"; diff --git a/firebase/firestore/node/faculty.dart b/firebase/firestore/node/faculty.dart index 61bd2a7e3..02b8dfff3 100644 --- a/firebase/firestore/node/faculty.dart +++ b/firebase/firestore/node/faculty.dart @@ -1,3 +1,5 @@ +// @dart=2.9 + import "package:firestore/data.dart"; import "package:firestore/helpers.dart"; import "package:firestore/faculty.dart"; diff --git a/firebase/firestore/node/feedback.dart b/firebase/firestore/node/feedback.dart index f0d8590ce..db18930ce 100644 --- a/firebase/firestore/node/feedback.dart +++ b/firebase/firestore/node/feedback.dart @@ -1,3 +1,5 @@ +// @dart=2.9 + import "package:firestore/data.dart"; import "package:firestore/helpers.dart"; import "package:firestore/services.dart"; diff --git a/firebase/firestore/node/sections.dart b/firebase/firestore/node/sections.dart index 274807983..ae924eeb5 100644 --- a/firebase/firestore/node/sections.dart +++ b/firebase/firestore/node/sections.dart @@ -1,3 +1,5 @@ +// @dart=2.9 + import "package:firestore/data.dart"; import "package:firestore/helpers.dart"; import "package:firestore/sections.dart"; diff --git a/firebase/firestore/node/students.dart b/firebase/firestore/node/students.dart index 49af3e3ef..18c27da41 100644 --- a/firebase/firestore/node/students.dart +++ b/firebase/firestore/node/students.dart @@ -1,3 +1,5 @@ +// @dart=2.9 + import "package:firestore/constants.dart"; import "package:firestore/data.dart"; import "package:firestore/helpers.dart"; diff --git a/firebase/firestore/node/zoom_links.dart b/firebase/firestore/node/zoom_links.dart index c9af066d9..2c259c216 100644 --- a/firebase/firestore/node/zoom_links.dart +++ b/firebase/firestore/node/zoom_links.dart @@ -1,3 +1,5 @@ +// @dart=2.9 + import "package:firestore/data.dart"; import "package:firestore/helpers.dart"; import "package:firestore/services.dart"; diff --git a/firebase/firestore/pubspec.yaml b/firebase/firestore/pubspec.yaml index 42e45dab3..b240cc685 100644 --- a/firebase/firestore/pubspec.yaml +++ b/firebase/firestore/pubspec.yaml @@ -4,18 +4,33 @@ description: A sample command-line application. # homepage: https://www.example.com environment: - sdk: '>=2.7.0 <3.0.0' + sdk: '>=2.9.0 <3.0.0' dependencies: - meta: any - # prior to 2.1.0, the values for custom claims had to be Strings - # (I changed that with my own PR -- be the change you want to see in the world) firebase_admin_interop: ^2.1.0 - node_io: ^1.1.1 - build_runner: any - build_node_compilers: any - node_interop: any - yaml: any + meta: ^1.3.0 + node_interop: <=1.2.1 + node_io: ^1.2.0 + yaml: ^2.1.2 + +dependency_overrides: + build_node_compilers: + git: + url: https://github.com/pulyaevskiy/node-interop.git + path: build_node_compilers + node_io: + git: + url: https://github.com/pulyaevskiy/node-interop.git + path: node_io + #node_interop: + # git: + # url: https://github.com/pulyaevskiy/node-interop.git + # path: node_interop + # version: <=1.2.1 + + +dev_dependencies: + build_node_compilers: ^0.3.2 + build_runner: ^1.0.0 -# dev_dependencies: # test: ^1.6.0 From 669f47e3e5ed02d88450b68cd48605e1bb30e5c0 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 26 Mar 2021 18:51:39 -0400 Subject: [PATCH 106/251] Redid home page to include DashboardPage, SchedulePage, ReminderPage --- lib/app.dart | 56 +++++---- lib/pages.dart | 2 +- lib/src/models/data/sports.dart | 2 - lib/src/pages/drawer.dart | 35 +++--- lib/src/pages/home.dart | 148 ++++++++++++------------ lib/src/pages/new_home.dart | 56 +++++++++ lib/src/pages/reminders.dart | 55 ++++----- lib/src/pages/responsive_page.dart | 10 ++ lib/src/pages/route_initializer.dart | 16 +-- lib/src/pages/schedule.dart | 163 ++++++++++++++------------- lib/widgets.dart | 1 - 11 files changed, 318 insertions(+), 226 deletions(-) create mode 100644 lib/src/pages/new_home.dart create mode 100644 lib/src/pages/responsive_page.dart diff --git a/lib/app.dart b/lib/app.dart index cf7a410e5..ab075da6d 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -3,10 +3,22 @@ import "package:flutter/material.dart"; import "package:ramaz/constants.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; -import "package:ramaz/services.dart"; /// The main app widget. class RamLife extends StatelessWidget { + /// The routes for this app. + static final Map routes = { + Routes.login: (_) => Login(), + Routes.home: (_) => const HomePage(), + Routes.schedule: (_) => const HomePage(pageIndex: 1), + Routes.reminders: (_) => const HomePage(pageIndex: 2), + Routes.feedback: (_) => FeedbackPage(), + Routes.calendar: (_) => CalendarPage(), + Routes.specials: (_) => SpecialPage(), + Routes.admin: (_) => AdminHomePage(), + Routes.sports: (_) => SportsPage(), + }; + /// Provides a const constructor. const RamLife(); @@ -77,27 +89,25 @@ class RamLife extends StatelessWidget { title: "Ram Life", color: RamazColors.blue, theme: theme, - routes: { - Routes.login: (_) => RouteInitializer( - builder: (_) => Login(), - onError: null, // the default IS the login page - ), - Routes.home: enforceLogin((_) => HomePage()), - Routes.schedule: enforceLogin((_) => SchedulePage()), - Routes.reminders: enforceLogin((_) => RemindersPage()), - Routes.feedback: enforceLogin((_) => FeedbackPage()), - Routes.calendar: enforceLogin((_) => CalendarPage()), - Routes.specials: enforceLogin((_) => SpecialPage()), - Routes.admin: enforceLogin((_) => AdminHomePage()), - Routes.sports: enforceLogin((_) => SportsPage()), - } + onGenerateRoute: (RouteSettings settings) => PageRouteBuilder( + settings: settings, + transitionDuration: Duration.zero, + pageBuilder: (BuildContext context, __, ___) { + final String routeName = + (settings.name == null || !routes.containsKey(settings.name)) + ? Routes.home : settings.name!; + return settings.name == Routes.login + ? RouteInitializer( + // If this page is Routes.login, don't set an error handler. + onError: null , + isAllowed: () => true, + child: routes [routeName]! (context), + ) + : RouteInitializer( + child: routes [routeName]! (context), + ); + }, + ) ) ); - - /// Enforces the user be signed in. - WidgetBuilder enforceLogin(WidgetBuilder builder) => - (_) => RouteInitializer( - isAllowed: () => Auth.isSignedIn, - builder: builder, - ); -} \ No newline at end of file +} diff --git a/lib/pages.dart b/lib/pages.dart index 037a8dab8..c95b00122 100644 --- a/lib/pages.dart +++ b/lib/pages.dart @@ -8,13 +8,13 @@ export "src/pages/builders/sports_builder.dart"; export "src/pages/calendar.dart"; export "src/pages/drawer.dart"; export "src/pages/feedback.dart"; +export "src/pages/new_home.dart"; export "src/pages/home.dart"; export "src/pages/login.dart"; export "src/pages/reminders.dart"; export "src/pages/route_initializer.dart"; export "src/pages/schedule.dart"; export "src/pages/specials.dart"; -export "src/pages/splash.dart"; export "src/pages/sports.dart"; /// Route names for each page in the app. diff --git a/lib/src/models/data/sports.dart b/lib/src/models/data/sports.dart index 52d6f8df9..527b2e2b3 100644 --- a/lib/src/models/data/sports.dart +++ b/lib/src/models/data/sports.dart @@ -29,12 +29,10 @@ class Sports extends Model { /// Loads data from the device and @override Future init() async { - print("Creating sports model"); timer = Timer.periodic(_minute, (_) => todayGames = getTodayGames()); games = SportsGame.fromList(await Services.instance.database.sports); todayGames = getTodayGames(); now = DateTime.now(); - print("Finished sports model"); } /// Returns a list of all the games taking place today. diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index 504b9dabb..5ca3f81c0 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -12,6 +12,9 @@ class NavigationDrawer extends StatelessWidget { static Future Function() pushRoute(BuildContext context, String name) => () => Navigator.of(context).pushReplacementNamed(name); + final bool isOnHomePage; + const NavigationDrawer({this.isOnHomePage = false}); + @override Widget build (BuildContext context) => Drawer ( child: LayoutBuilder( builder: ( @@ -26,21 +29,23 @@ class NavigationDrawer extends StatelessWidget { child: Column( children: [ DrawerHeader (child: RamazLogos.ramSquare), - ListTile ( - title: const Text ("Home"), - leading: Icon (Icons.home), - onTap: pushRoute(context, Routes.home), - ), - ListTile ( - title: const Text ("Schedule"), - leading: Icon (Icons.schedule), - onTap: pushRoute(context, Routes.schedule), - ), - ListTile ( - title: const Text ("Reminders"), - leading: Icon (Icons.note), - onTap: pushRoute(context, Routes.reminders), - ), + if (!isOnHomePage) ...[ + ListTile ( + title: const Text ("Dashboard"), + leading: Icon (Icons.dashboard), + onTap: pushRoute(context, Routes.home), + ), + ListTile ( + title: const Text ("Schedule"), + leading: Icon (Icons.schedule), + onTap: pushRoute(context, Routes.schedule), + ), + ListTile ( + title: const Text ("Reminders"), + leading: Icon (Icons.note), + onTap: pushRoute(context, Routes.reminders), + ), + ], // ListTile ( // title: Text ("Sports"), // leading: Icon (Icons.directions_run), diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index eebc0e5d3..e80d0c049 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -2,11 +2,16 @@ import "package:flutter/material.dart"; import "package:breakpoint_scaffold/breakpoint_scaffold.dart"; import "package:ramaz/models.dart"; -import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; -/// The homepage of the app. -class HomePage extends StatelessWidget { +import "responsive_page.dart"; + +const List weekdayNames = [ + "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" +]; + +/// A page to show all relevant info at a glance. +class DashboardPage extends StatelessWidget { /// The reminders data model. final Reminders remindersModel; @@ -19,7 +24,7 @@ class HomePage extends StatelessWidget { /// The home page. /// /// Listens to [Schedule] (and by extension, [Reminders]) and [Sports]. - HomePage() : + DashboardPage() : scheduleModel = Models.instance.schedule, remindersModel = Models.instance.reminders, sportsModel = Models.instance.sports; @@ -43,78 +48,36 @@ class HomePage extends StatelessWidget { ); @override - Widget build (BuildContext context) => ModelListener( + Widget build (BuildContext context) => ModelListener( model: () => HomeModel(), - builder: (_, HomeModel model, __) => ResponsiveBuilder( - builder: (_, LayoutInfo layout, __) => ResponsiveScaffold.navBar( - appBar: AppBar( - title: const Text ("Home"), - actions: [ - if (scheduleModel.hasSchool && !layout.hasStandardSideSheet) - TextButton( - onPressed: () => Scaffold.of(context).openEndDrawer(), - child: const Text ("Tap for schedule"), - ) + builder: (BuildContext context, HomeModel model, _) => RefreshIndicator( + onRefresh: () => refresh(context, model), + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20), + children: [ + Text ( + scheduleModel.today == null + ? "There is no school today" + : "Today is ${scheduleModel.today!.name}", + style: Theme.of(context).textTheme.headline3, + textAlign: TextAlign.center + ), + const SizedBox (height: 20), + if (scheduleModel.hasSchool) ...[ + ScheduleSlot(), + const SizedBox(height: 10), ], - ), - drawer: layout.hasStandardDrawer - ? SizedBox(width: 256, child: NavigationDrawer()) - : NavigationDrawer(), - sideSheet: !scheduleModel.hasSchool || layout.hasStandardSideSheet - ? null - : Drawer( - child: ClassList( - // if there is school, then: - // scheduleModel.today != null - // scheduleModel.periods != null - day: scheduleModel.today!, - periods: scheduleModel.nextPeriod == null - ? scheduleModel.periods! - : scheduleModel.periods!.getRange ( - (scheduleModel.periodIndex ?? -1) + 1, - scheduleModel.periods!.length - ), - headerText: scheduleModel.period == null - ? "Today's Schedule" - : "Upcoming Classes" + if (sportsModel.todayGames.isNotEmpty) ...[ + Text( + "Sports games", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline5, ), - ), - navItems: const [ - NavigationItem(icon: Icon(Icons.calendar_today), label: "Today"), - NavigationItem(icon: Icon(Icons.schedule), label: "Schedule"), - NavigationItem(icon: Icon(Icons.notifications), label: "Reminders"), - ], - secondaryDrawer: NavigationDrawer(), - navIndex: 0, - onNavIndexChanged: (int value) {}, - body: Builder( - builder: (BuildContext context) => RefreshIndicator( - onRefresh: () => refresh(context, model), - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20), - children: [ - Text ( - "Today is XXX", - style: Theme.of(context).textTheme.headline3, - textAlign: TextAlign.center - ), - const SizedBox (height: 20), - ScheduleSlot(), - const SizedBox(height: 10), - if (sportsModel.todayGames.isNotEmpty) ...[ - Text( - "Sports games", - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.headline5, - ), - const SizedBox(height: 10), - for (final int index in sportsModel.todayGames) - SportsTile(sportsModel.games [index]) - ] - ] - ) - ) - ) + const SizedBox(height: 10), + for (final int index in sportsModel.todayGames) + SportsTile(sportsModel.games [index]) + ] + ] ) ) ); @@ -173,3 +136,42 @@ class ScheduleSlot extends StatelessWidget { ) ); } + +class Dashboard extends ResponsivePage { + final Schedule model; + Dashboard() : model = Models.instance.schedule; + + @override + AppBar get appBar => AppBar( + title: const Text("Dashboard"), + actions: [ + if (model.hasSchool) + Builder( + builder: (BuildContext context) => TextButton( + onPressed: () => Scaffold.of(context).openEndDrawer(), + child: const Text ("Tap for schedule"), + ) + ) + ] + ); + + @override + Widget? get sideSheet => !model.hasSchool ? null : ClassList( + // if there is school, then: + // scheduleModel.today != null + // scheduleModel.periods != null + day: model.today!, + periods: model.nextPeriod == null + ? model.periods! + : model.periods!.getRange ( + (model.periodIndex ?? -1) + 1, + model.periods!.length + ), + headerText: model.period == null + ? "Today's Schedule" + : "Upcoming Classes" + ); + + @override + WidgetBuilder get builder => (_) => DashboardPage(); +} diff --git a/lib/src/pages/new_home.dart b/lib/src/pages/new_home.dart new file mode 100644 index 000000000..69558575d --- /dev/null +++ b/lib/src/pages/new_home.dart @@ -0,0 +1,56 @@ +import "package:flutter/material.dart"; +import "package:breakpoint_scaffold/breakpoint_scaffold.dart"; + +import "package:ramaz/models.dart"; + +import "drawer.dart"; +import "home.dart"; +import "reminders.dart"; +import "responsive_page.dart"; +import "schedule.dart"; + +class HomePage extends StatefulWidget { + final int? pageIndex; + const HomePage({this.pageIndex}); + + @override + HomePageState createState() => HomePageState(); +} + +class HomePageState extends State { + static const List navItems = [ + NavigationItem(icon: Icon(Icons.dashboard), label: "Dashboard"), + NavigationItem(icon: Icon(Icons.schedule), label: "Schedule"), + NavigationItem(icon: Icon(Icons.notifications), label: "Reminders"), + ]; + + late int index; + + @override + void initState() { + super.initState(); + index = widget.pageIndex ?? 0; + } + + final List data = [ + Dashboard(), + ResponsiveSchedule(), + ResponsiveReminders(), + ]; + + @override + Widget build(BuildContext context) => ResponsiveBuilder( + builder: (_, LayoutInfo layout, __) => ResponsiveScaffold.navBar( + navItems: navItems, + navIndex: index, + onNavIndexChanged: (int value) => setState(() => index = value), + appBar: data [index].appBar, + drawer: NavigationDrawer(), + secondaryDrawer: NavigationDrawer(isOnHomePage: true), + sideSheet: data [index].sideSheet, + body: data [index].builder(context), + floatingActionButton: data [index].floatingActionButton, + floatingActionButtonLocation: data [index].floatingActionButtonLocation, + ) + ); +} diff --git a/lib/src/pages/reminders.dart b/lib/src/pages/reminders.dart index 4bfaeb8c3..4c33bbd97 100644 --- a/lib/src/pages/reminders.dart +++ b/lib/src/pages/reminders.dart @@ -4,6 +4,27 @@ import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; +import "responsive_page.dart"; + +class ResponsiveReminders extends ResponsivePage { + final Reminders model = Models.instance.reminders; + + @override + AppBar get appBar => AppBar(title: const Text ("Reminders")); + + @override + Widget get floatingActionButton => Builder( + builder: (BuildContext context) => FloatingActionButton( + onPressed: () async => model + .addReminder(await ReminderBuilder.buildReminder(context)), + child: const Icon (Icons.note_add), + ) + ); + + @override + WidgetBuilder get builder => (_) => RemindersPage(); +} + /// A page to display the user's reminders. class RemindersPage extends StatelessWidget { @override @@ -18,31 +39,13 @@ class RemindersPage extends StatelessWidget { textAlign: TextAlign.center, ), ), - builder: (_, Reminders model, Widget? empty) => Scaffold( - bottomNavigationBar: Footer(), - drawer: NavigationDrawer(), - appBar: AppBar( - title: const Text ("Reminders"), - actions: [ - IconButton( - icon: const Icon(Icons.home), - onPressed: () => Navigator.of(context).pushReplacementNamed(Routes.home) - ) - ] - ), - floatingActionButton: FloatingActionButton( - onPressed: () async => - model.addReminder(await ReminderBuilder.buildReminder(context)), - child: const Icon (Icons.note_add), - ), - body: model.reminders.isEmpty - ? empty - : ListView.separated ( - itemCount: model.reminders.length, - separatorBuilder: (_, __) => const Divider(), - itemBuilder: (BuildContext context, int index) => - ReminderTile(index: index), - ) - ) + builder: (_, Reminders model, Widget? empty) => model.reminders.isEmpty + ? empty! // widget is supplied above + : ListView.separated ( + itemCount: model.reminders.length, + separatorBuilder: (_, __) => const Divider(), + itemBuilder: (BuildContext context, int index) => + ReminderTile(index: index), + ) ); } diff --git a/lib/src/pages/responsive_page.dart b/lib/src/pages/responsive_page.dart new file mode 100644 index 000000000..8109f5f15 --- /dev/null +++ b/lib/src/pages/responsive_page.dart @@ -0,0 +1,10 @@ +import "package:flutter/material.dart"; + +abstract class ResponsivePage { + const ResponsivePage(); + AppBar get appBar; + WidgetBuilder get builder; + Widget? get sideSheet => null; + Widget? get floatingActionButton => null; + FloatingActionButtonLocation? get floatingActionButtonLocation => null; +} diff --git a/lib/src/pages/route_initializer.dart b/lib/src/pages/route_initializer.dart index 0e5c89498..4de50aeba 100644 --- a/lib/src/pages/route_initializer.dart +++ b/lib/src/pages/route_initializer.dart @@ -5,14 +5,16 @@ import "package:ramaz/services.dart"; /// A route that performs initialization logic first. class RouteInitializer extends StatefulWidget { - /// A dummy predicate that always returns true. - static bool alwaysTrue() => true; + /// Checks to see if the user is signed in. + /// + /// This is the default logic to determine if the user can access a page. + static bool isSignedIn() => Auth.isSignedIn; /// Determines if the user is allowed to be on the given page. final bool Function() isAllowed; - /// Builds the contents of the page. - final WidgetBuilder builder; + /// The contents of the page. + final Widget child; /// The route to navigate to if the user is not authorized. final String onFailure; @@ -22,10 +24,10 @@ class RouteInitializer extends StatefulWidget { /// Navigation with authorization and error-handling. const RouteInitializer({ - required this.builder, + required this.child, this.onFailure = Routes.login, this.onError = Routes.login, - this.isAllowed = alwaysTrue, + this.isAllowed = isSignedIn, }); @override @@ -70,7 +72,7 @@ class RouteInitializerState extends State { future: initFuture, builder: (_, AsyncSnapshot snapshot) => snapshot.connectionState == ConnectionState.done - ? widget.builder(context) + ? widget.child : const Center(child: CircularProgressIndicator()) ); } diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index 091585148..c2649f4fa 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -3,87 +3,14 @@ import "package:flutter/material.dart"; import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; -import "package:ramaz/pages.dart"; +// import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; -/// A page to allow the user to explore their schedule. -class SchedulePage extends StatelessWidget { - /// Lets the user know that they chose an invalid schedule combination. - void handleInvalidSchedule(BuildContext context) => - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text("Invalid schedule")) - ); +import "responsive_page.dart"; - @override - Widget build (BuildContext context) => ModelListener( - model: () => ScheduleModel(), - // ignore: sort_child_properties_last - builder: (_, ScheduleModel model, __) => Scaffold( - appBar: AppBar (title: const Text ("Schedule")), - bottomNavigationBar: Footer(), - floatingActionButton: Builder( - builder: (BuildContext context) => FloatingActionButton( - onPressed: () => viewDay (model, context), - child: const Icon (Icons.calendar_today), - ) - ), - drawer: Navigator.of(context).canPop() ? null : NavigationDrawer(), - body: Builder( - builder: (BuildContext context) => Column( - children: [ - ListTile ( - title: const Text ("Day"), - trailing: DropdownButton ( - value: model.day.name, - onChanged: (String? value) => model.update( - newName: value, - onInvalidSchedule: () => handleInvalidSchedule(context), - ), - items: [ - for (final String dayName in Models.instance.schedule.user.dayNames) - DropdownMenuItem( - value: dayName, - child: Text(dayName), - ) - ] - ) - ), - ListTile ( - title: const Text ("Schedule"), - trailing: DropdownButton ( - value: model.day.special, - onChanged: (Special? special) => model.update( - newSpecial: special, - onInvalidSchedule: () => handleInvalidSchedule(context), - ), - items: [ - for (final Special special in Special.specials) - DropdownMenuItem( - value: special, - child: Text (special.name), - ), - if (!Special.specials.contains(model.day.special)) - DropdownMenuItem( - value: model.day.special, - child: Text(model.day.special.name) - ) - ] - ) - ), - const SizedBox (height: 20), - const Divider(), - const SizedBox (height: 20), - Expanded( - child: ClassList( - day: model.day, - periods: Models.instance.user.data.getPeriods(model.day) - ) - ), - ] - ) - ) - ) - ); +class ResponsiveSchedule extends ResponsivePage { + final ScheduleModel model; + ResponsiveSchedule() : model = ScheduleModel(); /// Allows the user to select a day in the calendar to view. /// @@ -106,4 +33,84 @@ class SchedulePage extends StatelessWidget { ); } } + + @override + AppBar get appBar => AppBar(title: const Text("Schedule")); + + @override + Widget? get floatingActionButton => Builder( + builder: (BuildContext context) => FloatingActionButton( + onPressed: () => viewDay(model, context), + child: const Icon(Icons.calendar_today), + ) + ); + + @override + WidgetBuilder get builder => (_) => SchedulePage(); +} + +/// A page to allow the user to explore their schedule. +class SchedulePage extends StatelessWidget { + /// Lets the user know that they chose an invalid schedule combination. + void handleInvalidSchedule(BuildContext context) => + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("Invalid schedule")) + ); + + @override + Widget build (BuildContext context) => ModelListener( + model: () => ScheduleModel(), + builder: (_, ScheduleModel model, __) => Column( + children: [ + ListTile ( + title: const Text ("Day"), + trailing: DropdownButton ( + value: model.day.name, + onChanged: (String? value) => model.update( + newName: value, + onInvalidSchedule: () => handleInvalidSchedule(context), + ), + items: [ + for (final String dayName in Models.instance.schedule.user.dayNames) + DropdownMenuItem( + value: dayName, + child: Text(dayName), + ) + ] + ) + ), + ListTile ( + title: const Text ("Schedule"), + trailing: DropdownButton ( + value: model.day.special, + onChanged: (Special? special) => model.update( + newSpecial: special, + onInvalidSchedule: () => handleInvalidSchedule(context), + ), + items: [ + for (final Special special in Special.specials) + DropdownMenuItem( + value: special, + child: Text (special.name), + ), + if (!Special.specials.contains(model.day.special)) + DropdownMenuItem( + value: model.day.special, + child: Text(model.day.special.name) + ) + ] + ) + ), + const SizedBox (height: 20), + const Divider(), + const SizedBox (height: 20), + Expanded( + child: ClassList( + day: model.day, + periods: Models.instance.user.data.getPeriods(model.day) + ) + ), + ] + ) + ); } diff --git a/lib/widgets.dart b/lib/widgets.dart index d2af1d466..2986e1bf3 100644 --- a/lib/widgets.dart +++ b/lib/widgets.dart @@ -25,7 +25,6 @@ export "src/widgets/atomic/reminder_tile.dart"; export "src/widgets/atomic/sports_tile.dart"; // Generic widgets are used in all sorts of situations. -export "src/widgets/generic/adaptive_scaffold.dart"; export "src/widgets/generic/class_list.dart"; export "src/widgets/generic/date_picker.dart"; export "src/widgets/generic/footer.dart"; From d35ead1f4a9909700aa2e8f414a7783ae1163705 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 Mar 2021 01:37:37 +0000 Subject: [PATCH 107/251] Bump y18n from 3.2.1 to 3.2.2 in /firebase/rules_test Bumps [y18n](https://github.com/yargs/y18n) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/commits) Signed-off-by: dependabot[bot] --- firebase/rules_test/package-lock.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/firebase/rules_test/package-lock.json b/firebase/rules_test/package-lock.json index 7b75c0b32..b4895a8c0 100644 --- a/firebase/rules_test/package-lock.json +++ b/firebase/rules_test/package-lock.json @@ -1853,9 +1853,9 @@ } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yargs": { @@ -2391,9 +2391,9 @@ "dev": true }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" }, "yargs": { "version": "3.32.0", @@ -2499,9 +2499,9 @@ } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yargs": { From 8cf99c2b0364e3d659fdf9f3509462e56886453e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 2 Apr 2021 16:12:52 -0400 Subject: [PATCH 108/251] Moved ResponsiveScaffold into RamLife for easier management --- .../widgets/generic/responsive_scaffold.dart | 3 + .../repsonsive_scaffold/layout_info.dart | 42 +++++ .../repsonsive_scaffold/navigation_item.dart | 27 ++++ .../responsive_builder.dart | 32 ++++ .../widgets/repsonsive_scaffold/scaffold.dart | 149 ++++++++++++++++++ lib/widgets.dart | 1 + pubspec.lock | 16 +- pubspec.yaml | 1 - 8 files changed, 255 insertions(+), 16 deletions(-) create mode 100644 lib/src/widgets/generic/responsive_scaffold.dart create mode 100644 lib/src/widgets/repsonsive_scaffold/layout_info.dart create mode 100644 lib/src/widgets/repsonsive_scaffold/navigation_item.dart create mode 100644 lib/src/widgets/repsonsive_scaffold/responsive_builder.dart create mode 100644 lib/src/widgets/repsonsive_scaffold/scaffold.dart diff --git a/lib/src/widgets/generic/responsive_scaffold.dart b/lib/src/widgets/generic/responsive_scaffold.dart new file mode 100644 index 000000000..6b71b0e32 --- /dev/null +++ b/lib/src/widgets/generic/responsive_scaffold.dart @@ -0,0 +1,3 @@ +export "src/navigation_item.dart"; +export "src/responsive_builder.dart"; +export "src/scaffold.dart"; diff --git a/lib/src/widgets/repsonsive_scaffold/layout_info.dart b/lib/src/widgets/repsonsive_scaffold/layout_info.dart new file mode 100644 index 000000000..60b0d9f24 --- /dev/null +++ b/lib/src/widgets/repsonsive_scaffold/layout_info.dart @@ -0,0 +1,42 @@ +import "package:flutter/material.dart"; +import "package:adaptive_breakpoints/adaptive_breakpoints.dart"; + +/// Provides info about how this scaffold should be laid out. +/// +/// Uses [getWindowType] from Material's `adaptive_breakpoints` package to +/// determine which layout should be built and exposes getters such as +/// [hasNavRail] to define how the layout should look. +@immutable +class LayoutInfo { + /// The breakpoint as defined by [material.io](https://material.io/design/layout/responsive-layout-grid.html#breakpoints) + final AdaptiveWindowType windowType; + + /// Stores info about the layout based on Material Design breakpoints. + LayoutInfo(BuildContext context) : + windowType = getWindowType(context); + + /// Whether the app is running on a phone. + bool get isMobile => windowType == AdaptiveWindowType.xsmall; + + /// Whether the app is running on a tablet in portrait mode (or a large phone). + bool get isTabletPortrait => windowType == AdaptiveWindowType.small; + + /// Whether the app is running on a tablet in landscape mode. + bool get isTabletLandscape => windowType == AdaptiveWindowType.medium; + + /// Whether the app is running on a desktop. + bool get isDesktop => windowType == AdaptiveWindowType.large + || windowType == AdaptiveWindowType.xlarge; + + /// Whether the app should use a [BottomNavigationBar]. + bool get hasBottomNavBar => isMobile; + + /// Whether the app should use a [NavigationRail]. + bool get hasNavRail => isTabletPortrait || isTabletLandscape; + + /// Whether the app should have a persistent [Scaffold.endDrawer]. + bool get hasStandardSideSheet => isTabletLandscape || isDesktop; + + /// Whether the app should have a persistent [Drawer]. + bool get hasStandardDrawer => isDesktop; +} diff --git a/lib/src/widgets/repsonsive_scaffold/navigation_item.dart b/lib/src/widgets/repsonsive_scaffold/navigation_item.dart new file mode 100644 index 000000000..2a312e18d --- /dev/null +++ b/lib/src/widgets/repsonsive_scaffold/navigation_item.dart @@ -0,0 +1,27 @@ +import "package:flutter/material.dart"; + +/// Defines a common interface for [BottomNavigationBar] and [NavigationRail]. +/// +/// This class maps to both [BottomNavigationBarItem] and +/// [NavigationRailDestination] with an [icon] and [label] property. +@immutable +class NavigationItem { + /// The icon for this item. + final Widget icon; + + /// The label for this item. + /// + /// May also be used as semantics and tooltips. + final String label; + + /// Creates an abstraction for a navigation item. + const NavigationItem({required this.icon, required this.label}); + + /// Generates an item for [BottomNavigationBar]. + BottomNavigationBarItem get bottomNavBar => + BottomNavigationBarItem(icon: icon, label: label); + + /// Generates an item for [NavigationRail]. + NavigationRailDestination get navRail => + NavigationRailDestination(icon: icon, label: Text(label)); +} diff --git a/lib/src/widgets/repsonsive_scaffold/responsive_builder.dart b/lib/src/widgets/repsonsive_scaffold/responsive_builder.dart new file mode 100644 index 000000000..721b0cedd --- /dev/null +++ b/lib/src/widgets/repsonsive_scaffold/responsive_builder.dart @@ -0,0 +1,32 @@ +import "package:flutter/material.dart"; + +import "layout_info.dart"; +export "layout_info.dart"; + +/// A function that returns a widget that depends on a [LayoutInfo]. +/// +/// Used by [ResponsiveBuilder]. +typedef ResponsiveWidgetBuilder = + Widget Function(BuildContext, LayoutInfo, Widget?); + +/// Builds a widget tree according to a [LayoutInfo]. +class ResponsiveBuilder extends StatelessWidget { + /// An optional widget that doesn't depend on the layout info. + /// + /// Use this field to cache large portions of the widget tree so they don't + /// rebuild every frame when a window resizes. + final Widget? child; + + /// A function to build the widget tree. + final ResponsiveWidgetBuilder builder; + + /// A builder to layout the widget tree based on the device size. + const ResponsiveBuilder({ + required this.builder, + this.child, + }); + + @override + Widget build(BuildContext context) => + builder(context, LayoutInfo(context), child); +} diff --git a/lib/src/widgets/repsonsive_scaffold/scaffold.dart b/lib/src/widgets/repsonsive_scaffold/scaffold.dart new file mode 100644 index 000000000..92786cf5f --- /dev/null +++ b/lib/src/widgets/repsonsive_scaffold/scaffold.dart @@ -0,0 +1,149 @@ +import "package:flutter/material.dart"; + +import "navigation_item.dart"; +import "responsive_builder.dart"; + +/// A Scaffold that rearranges itself according to the device size. +/// +/// Uses [LayoutInfo] to decide key elements of the layout. This class has +/// two uses: with and without primary navigation items. These are items that +/// would normally be placed in a [BottomNavigationBar]. When primary navigation +/// items are provided, two different drawers are used: with and without the +/// primary navigation items (to avoid duplication in the UI). +/// +/// See the package documentation for how the layout is determined. +class ResponsiveScaffold extends StatelessWidget { + /// The app bar. + /// + /// This does not change with the layout, except for showing a drawer menu. + final PreferredSizeWidget appBar; + + /// The main body of the scaffold. + final Widget body; + + /// The full drawer to show. + /// + /// When there are primary navigation items, it is recommended not to include + /// them in the drawer, as that may confuse your users. Instead, provide two + /// drawers, one with them and the other, without. + /// + /// This field should include all navigation items, whereas [secondaryDrawer] + /// should exclude all navigation items that are in [navItems]. + final Widget drawer; + + /// The secondary, more compact, navigation drawer. + /// + /// When there are primary navigation items, it is recommended not to include + /// them in the drawer, as that may confuse your users. Instead, provide two + /// drawers, one with them and the other, without. + /// + /// This field should exclude all navigation items that are in [navItems], + /// whereas [drawer] should include them. + final Widget? secondaryDrawer; + + /// The [side sheet](https://material.io/components/sheets-side). + /// + /// On larger screens (tablets and desktops), this will be a standard + /// (persistent) side sheet. On smaller screens, this will be modal. + /// + /// See [LayoutInfo.hasStandardSideSheet]. + final Widget? sideSheet; + + /// The [Floating Action Button](https://material.io/components/buttons-floating-action-button). + /// + /// Currently, the position does not change based on layout. + final Widget? floatingActionButton; + + /// The location of the floating action button. + final FloatingActionButtonLocation? floatingActionButtonLocation; + + /// The navigation items. + /// + /// On phones, these will be in a [BottomNavigationBar]. On tablets, these + /// will be in a [NavigationRail]. On desktops, these should be included in + /// [drawer] instead. + /// + /// On phones and tablets, so that the items do not appear twice, provide a + /// [secondaryDrawer] that does not include these items. + final List? navItems; + + /// The index of the current navigation item in [navItems]. + final int? navIndex; + + /// A callback for when the user selects a navigation item. + final ValueChanged? onNavIndexChanged; + + /// Creates a scaffold that responds to the screen size. + const ResponsiveScaffold({ + required this.drawer, + required this.body, + required this.appBar, + this.floatingActionButton, + this.sideSheet, + this.floatingActionButtonLocation, + }) : + secondaryDrawer = null, + navItems = null, + navIndex = null, + onNavIndexChanged = null; + + /// Creates a responsive layout with primary navigation items. + const ResponsiveScaffold.navBar({ + required this.drawer, + required this.secondaryDrawer, + required this.appBar, + required this.body, + required this.navItems, + required this.navIndex, + required this.onNavIndexChanged, + this.sideSheet, + this.floatingActionButton, + this.floatingActionButtonLocation, + }); + + /// Whether this widget is being used with a navigation bar. + bool get hasNavBar => navItems != null; + + @override + Widget build(BuildContext context) => ResponsiveBuilder( + child: body, // ignore: sort_child_properties_last + builder: (BuildContext context, LayoutInfo info, Widget? child) => Scaffold( + appBar: appBar, + drawer: info.hasStandardDrawer ? null + : hasNavBar ? secondaryDrawer : drawer, + endDrawer: info.hasStandardSideSheet ? null : sideSheet, + floatingActionButton: floatingActionButton, + floatingActionButtonLocation: floatingActionButtonLocation, + bottomNavigationBar: !hasNavBar || !info.hasBottomNavBar + ? null + : BottomNavigationBar( + type: BottomNavigationBarType.fixed, + items: [ + for (final NavigationItem item in navItems!) + item.bottomNavBar, + ], + currentIndex: navIndex!, + onTap: onNavIndexChanged, + ), + body: Row( + children: [ + if (hasNavBar && info.hasNavRail) NavigationRail( + labelType: NavigationRailLabelType.all, + destinations: [ + for (final NavigationItem item in navItems!) + item.navRail, + ], + selectedIndex: navIndex!, + onDestinationSelected: onNavIndexChanged, + ) + else if (info.hasStandardDrawer) drawer, + Expanded(child: child!), + if (sideSheet != null && info.hasStandardSideSheet) SizedBox( + width: 320, + child: sideSheet, + ) + ] + ) + ), + ); +} diff --git a/lib/widgets.dart b/lib/widgets.dart index 2986e1bf3..c59446d24 100644 --- a/lib/widgets.dart +++ b/lib/widgets.dart @@ -30,6 +30,7 @@ export "src/widgets/generic/date_picker.dart"; export "src/widgets/generic/footer.dart"; export "src/widgets/generic/icons.dart"; export "src/widgets/generic/model_listener.dart"; +export "src/widgets/generic/responsive_scaffold.dart"; // Widgets that help represent images. export "src/widgets/images/link_icon.dart"; diff --git a/pubspec.lock b/pubspec.lock index 914961684..87fbc86ce 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,13 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - adaptive_breakpoints: - dependency: transitive - description: - name: adaptive_breakpoints - url: "https://pub.dartlang.org" - source: hosted - version: "0.0.4" archive: dependency: transitive description: @@ -36,13 +29,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" - breakpoint_scaffold: - dependency: "direct main" - description: - name: breakpoint_scaffold - url: "https://pub.dartlang.org" - source: hosted - version: "0.0.2" characters: dependency: transitive description: @@ -597,4 +583,4 @@ packages: version: "2.2.1" sdks: dart: ">=2.12.0 <3.0.0" - flutter: ">=2.0.0" + flutter: ">=1.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 3edf8dd9c..b52c639e4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,7 +30,6 @@ dependencies: shared_preferences: ^2.0.5 # ------------- Misc ------------- - breakpoint_scaffold: ^0.0.2 flutter_native_timezone: ^1.0.10 url_launcher: ^6.0.3 From c348a69ed98419f94ed87be4ac8f9347334b424e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 2 Apr 2021 17:07:10 -0400 Subject: [PATCH 109/251] Migrated ResponsivePage -> NavigationItem --- lib/pages.dart | 1 - lib/src/pages/dashboard.dart | 158 +++++++++++++++ lib/src/pages/home.dart | 186 +++--------------- lib/src/pages/new_home.dart | 56 ------ lib/src/pages/reminders.dart | 13 +- lib/src/pages/responsive_page.dart | 10 - lib/src/pages/schedule.dart | 15 +- .../widgets/generic/responsive_scaffold.dart | 6 +- .../layout_info.dart | 0 .../navigation_item.dart | 7 +- .../responsive_builder.dart | 0 .../scaffold.dart | 25 +-- pubspec.lock | 7 + pubspec.yaml | 1 + 14 files changed, 222 insertions(+), 263 deletions(-) create mode 100644 lib/src/pages/dashboard.dart delete mode 100644 lib/src/pages/new_home.dart delete mode 100644 lib/src/pages/responsive_page.dart rename lib/src/widgets/{repsonsive_scaffold => responsive_scaffold}/layout_info.dart (100%) rename lib/src/widgets/{repsonsive_scaffold => responsive_scaffold}/navigation_item.dart (78%) rename lib/src/widgets/{repsonsive_scaffold => responsive_scaffold}/responsive_builder.dart (100%) rename lib/src/widgets/{repsonsive_scaffold => responsive_scaffold}/scaffold.dart (90%) diff --git a/lib/pages.dart b/lib/pages.dart index c95b00122..5dce18451 100644 --- a/lib/pages.dart +++ b/lib/pages.dart @@ -8,7 +8,6 @@ export "src/pages/builders/sports_builder.dart"; export "src/pages/calendar.dart"; export "src/pages/drawer.dart"; export "src/pages/feedback.dart"; -export "src/pages/new_home.dart"; export "src/pages/home.dart"; export "src/pages/login.dart"; export "src/pages/reminders.dart"; diff --git a/lib/src/pages/dashboard.dart b/lib/src/pages/dashboard.dart new file mode 100644 index 000000000..15ab3a100 --- /dev/null +++ b/lib/src/pages/dashboard.dart @@ -0,0 +1,158 @@ +import "package:flutter/material.dart"; + +import "package:ramaz/models.dart"; +import "package:ramaz/widgets.dart"; + +const List weekdayNames = [ + "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" +]; + +class Dashboard extends NavigationItem { + final Schedule scheduleModel = Models.instance.schedule; + + /// The reminders data model. + final Reminders remindersModel = Models.instance.reminders; + + /// The sports data model. + final Sports sportsModel = Models.instance.sports; + + Dashboard() : + super(label: "Dashboard", icon: const Icon(Icons.dashboard)); + + @override + AppBar get appBar => AppBar( + title: const Text("Dashboard"), + actions: [ + if (scheduleModel.hasSchool) + Builder( + builder: (BuildContext context) => TextButton( + onPressed: () => Scaffold.of(context).openEndDrawer(), + child: const Text ("Tap for schedule"), + ) + ) + ] + ); + + @override + Widget? get sideSheet => !scheduleModel.hasSchool ? null : ClassList( + // if there is school, then: + // scheduleModel.today != null + // scheduleModel.periods != null + day: scheduleModel.today!, + periods: scheduleModel.nextPeriod == null + ? scheduleModel.periods! + : scheduleModel.periods!.getRange ( + (scheduleModel.periodIndex ?? -1) + 1, + scheduleModel.periods!.length + ), + headerText: scheduleModel.period == null + ? "Today's Schedule" + : "Upcoming Classes" + ); + + /// Allows the user to refresh data. + /// + /// Updates the calendar and sports games. To update the user profile, + /// log out and log back in. + /// + /// This has to be a separate function since it can recursively call itself. + Future refresh(BuildContext context, HomeModel model) => model.refresh( + () => ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text("No Internet"), + action: SnackBarAction( + label: "RETRY", + onPressed: () => refresh(context, model), + ), + ) + ) + ); + + @override + Widget build(BuildContext context) => ModelListener( + model: () => HomeModel(), + builder: (BuildContext context, HomeModel model, _) => RefreshIndicator( + onRefresh: () => refresh(context, model), + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20), + children: [ + Text ( + scheduleModel.today == null + ? "There is no school today" + : "Today is ${scheduleModel.today!.name}", + style: Theme.of(context).textTheme.headline3, + textAlign: TextAlign.center + ), + const SizedBox (height: 20), + if (scheduleModel.hasSchool) ...[ + ScheduleSlot(), + const SizedBox(height: 10), + ], + if (sportsModel.todayGames.isNotEmpty) ...[ + Text( + "Sports games", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox(height: 10), + for (final int index in sportsModel.todayGames) + SportsTile(sportsModel.games [index]) + ] + ] + ) + ) + ); +} + +/// Holds the schedule info on the home page. +class ScheduleSlot extends StatelessWidget { + /// The schedule data model. + late final Schedule scheduleModel; + + /// The reminders data model. + late final Reminders remindersModel; + + /// Displays schedule info on the home page. + ScheduleSlot() { + final Models models = Models.instance; + remindersModel = models.reminders; + scheduleModel = models.schedule; + } + + /// The [NextClass] widgets to display. + List get children => [ + if (scheduleModel.hasSchool) NextClass( + reminders: remindersModel.currentReminders, + period: scheduleModel.period, + subject: scheduleModel.subjects [scheduleModel.period?.id], + ), + if (scheduleModel.nextPeriod != null) NextClass( + next: true, + reminders: remindersModel.nextReminders, + period: scheduleModel.nextPeriod, + subject: scheduleModel.subjects [scheduleModel.nextPeriod?.id], + ), + ]; + + @override + Widget build(BuildContext context) => ResponsiveBuilder( + builder: (_, LayoutInfo layout, __) => Column( + children: [ + Text( + scheduleModel.hasSchool + // if there is school, then scheduleModel.today != null + ? "Schedule: ${scheduleModel.today!.special.name}" + : "There is no school today", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox (height: 10), + if (layout.isDesktop && children.length > 1) GridView.count( + shrinkWrap: true, + crossAxisCount: layout.isDesktop ? children.length : 1, + children: children + ) else Column(children: children) + ] + ) + ); +} diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index e80d0c049..3c08c5950 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -1,177 +1,43 @@ import "package:flutter/material.dart"; -import "package:breakpoint_scaffold/breakpoint_scaffold.dart"; -import "package:ramaz/models.dart"; import "package:ramaz/widgets.dart"; -import "responsive_page.dart"; +import "dashboard.dart"; +import "drawer.dart"; +import "reminders.dart"; +import "schedule.dart"; -const List weekdayNames = [ - "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" -]; +class HomePage extends StatefulWidget { + final int? pageIndex; + const HomePage({this.pageIndex}); -/// A page to show all relevant info at a glance. -class DashboardPage extends StatelessWidget { - /// The reminders data model. - final Reminders remindersModel; - - /// The sports data model. - final Sports sportsModel; - - /// The schedule data model. - final Schedule scheduleModel; - - /// The home page. - /// - /// Listens to [Schedule] (and by extension, [Reminders]) and [Sports]. - DashboardPage() : - scheduleModel = Models.instance.schedule, - remindersModel = Models.instance.reminders, - sportsModel = Models.instance.sports; - - /// Allows the user to refresh data. - /// - /// Updates the calendar and sports games. To update the user profile, - /// log out and log back in. - /// - /// This has to be a separate function since it can recursively call itself. - Future refresh(BuildContext context, HomeModel model) => model.refresh( - () => ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: const Text("No Internet"), - action: SnackBarAction( - label: "RETRY", - onPressed: () => refresh(context, model), - ), - ) - ) - ); - - @override - Widget build (BuildContext context) => ModelListener( - model: () => HomeModel(), - builder: (BuildContext context, HomeModel model, _) => RefreshIndicator( - onRefresh: () => refresh(context, model), - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20), - children: [ - Text ( - scheduleModel.today == null - ? "There is no school today" - : "Today is ${scheduleModel.today!.name}", - style: Theme.of(context).textTheme.headline3, - textAlign: TextAlign.center - ), - const SizedBox (height: 20), - if (scheduleModel.hasSchool) ...[ - ScheduleSlot(), - const SizedBox(height: 10), - ], - if (sportsModel.todayGames.isNotEmpty) ...[ - Text( - "Sports games", - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.headline5, - ), - const SizedBox(height: 10), - for (final int index in sportsModel.todayGames) - SportsTile(sportsModel.games [index]) - ] - ] - ) - ) - ); + @override + HomePageState createState() => HomePageState(); } +class HomePageState extends State { + final List navItems = [ + Dashboard(), + ResponsiveSchedule(), + ResponsiveReminders(), + ]; -/// Holds the schedule info on the home page. -class ScheduleSlot extends StatelessWidget { - /// The schedule data model. - late final Schedule scheduleModel; - - /// The reminders data model. - late final Reminders remindersModel; + late int index; - /// Displays schedule info on the home page. - ScheduleSlot() { - final Models models = Models.instance; - remindersModel = models.reminders; - scheduleModel = models.schedule; + @override + void initState() { + super.initState(); + index = widget.pageIndex ?? 0; } - /// The [NextClass] widgets to display. - List get children => [ - if (scheduleModel.hasSchool) NextClass( - reminders: remindersModel.currentReminders, - period: scheduleModel.period, - subject: scheduleModel.subjects [scheduleModel.period?.id], - ), - if (scheduleModel.nextPeriod != null) NextClass( - next: true, - reminders: remindersModel.nextReminders, - period: scheduleModel.nextPeriod, - subject: scheduleModel.subjects [scheduleModel.nextPeriod?.id], - ), - ]; - @override Widget build(BuildContext context) => ResponsiveBuilder( - builder: (_, LayoutInfo layout, __) => Column( - children: [ - Text( - scheduleModel.hasSchool - // if there is school, then scheduleModel.today != null - ? "Schedule: ${scheduleModel.today!.special.name}" - : "There is no school today", - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.headline5, - ), - const SizedBox (height: 10), - if (layout.isDesktop && children.length > 1) GridView.count( - shrinkWrap: true, - crossAxisCount: layout.isDesktop ? children.length : 1, - children: children - ) else Column(children: children) - ] + builder: (_, LayoutInfo layout, __) => ResponsiveScaffold.navBar( + navItems: navItems, + navIndex: index, + onNavIndexChanged: (int value) => setState(() => index = value), + drawer: const NavigationDrawer(), + secondaryDrawer: const NavigationDrawer(isOnHomePage: true), ) ); } - -class Dashboard extends ResponsivePage { - final Schedule model; - Dashboard() : model = Models.instance.schedule; - - @override - AppBar get appBar => AppBar( - title: const Text("Dashboard"), - actions: [ - if (model.hasSchool) - Builder( - builder: (BuildContext context) => TextButton( - onPressed: () => Scaffold.of(context).openEndDrawer(), - child: const Text ("Tap for schedule"), - ) - ) - ] - ); - - @override - Widget? get sideSheet => !model.hasSchool ? null : ClassList( - // if there is school, then: - // scheduleModel.today != null - // scheduleModel.periods != null - day: model.today!, - periods: model.nextPeriod == null - ? model.periods! - : model.periods!.getRange ( - (model.periodIndex ?? -1) + 1, - model.periods!.length - ), - headerText: model.period == null - ? "Today's Schedule" - : "Upcoming Classes" - ); - - @override - WidgetBuilder get builder => (_) => DashboardPage(); -} diff --git a/lib/src/pages/new_home.dart b/lib/src/pages/new_home.dart deleted file mode 100644 index 69558575d..000000000 --- a/lib/src/pages/new_home.dart +++ /dev/null @@ -1,56 +0,0 @@ -import "package:flutter/material.dart"; -import "package:breakpoint_scaffold/breakpoint_scaffold.dart"; - -import "package:ramaz/models.dart"; - -import "drawer.dart"; -import "home.dart"; -import "reminders.dart"; -import "responsive_page.dart"; -import "schedule.dart"; - -class HomePage extends StatefulWidget { - final int? pageIndex; - const HomePage({this.pageIndex}); - - @override - HomePageState createState() => HomePageState(); -} - -class HomePageState extends State { - static const List navItems = [ - NavigationItem(icon: Icon(Icons.dashboard), label: "Dashboard"), - NavigationItem(icon: Icon(Icons.schedule), label: "Schedule"), - NavigationItem(icon: Icon(Icons.notifications), label: "Reminders"), - ]; - - late int index; - - @override - void initState() { - super.initState(); - index = widget.pageIndex ?? 0; - } - - final List data = [ - Dashboard(), - ResponsiveSchedule(), - ResponsiveReminders(), - ]; - - @override - Widget build(BuildContext context) => ResponsiveBuilder( - builder: (_, LayoutInfo layout, __) => ResponsiveScaffold.navBar( - navItems: navItems, - navIndex: index, - onNavIndexChanged: (int value) => setState(() => index = value), - appBar: data [index].appBar, - drawer: NavigationDrawer(), - secondaryDrawer: NavigationDrawer(isOnHomePage: true), - sideSheet: data [index].sideSheet, - body: data [index].builder(context), - floatingActionButton: data [index].floatingActionButton, - floatingActionButtonLocation: data [index].floatingActionButtonLocation, - ) - ); -} diff --git a/lib/src/pages/reminders.dart b/lib/src/pages/reminders.dart index 4c33bbd97..7b95fe595 100644 --- a/lib/src/pages/reminders.dart +++ b/lib/src/pages/reminders.dart @@ -4,11 +4,12 @@ import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; -import "responsive_page.dart"; - -class ResponsiveReminders extends ResponsivePage { +class ResponsiveReminders extends NavigationItem { final Reminders model = Models.instance.reminders; + ResponsiveReminders() : + super(label: "Reminders", icon: const Icon(Icons.notifications)); + @override AppBar get appBar => AppBar(title: const Text ("Reminders")); @@ -21,12 +22,6 @@ class ResponsiveReminders extends ResponsivePage { ) ); - @override - WidgetBuilder get builder => (_) => RemindersPage(); -} - -/// A page to display the user's reminders. -class RemindersPage extends StatelessWidget { @override Widget build(BuildContext context) => ModelListener( model: () => Models.instance.reminders, diff --git a/lib/src/pages/responsive_page.dart b/lib/src/pages/responsive_page.dart deleted file mode 100644 index 8109f5f15..000000000 --- a/lib/src/pages/responsive_page.dart +++ /dev/null @@ -1,10 +0,0 @@ -import "package:flutter/material.dart"; - -abstract class ResponsivePage { - const ResponsivePage(); - AppBar get appBar; - WidgetBuilder get builder; - Widget? get sideSheet => null; - Widget? get floatingActionButton => null; - FloatingActionButtonLocation? get floatingActionButtonLocation => null; -} diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index c2649f4fa..cb3beddcd 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -3,14 +3,13 @@ import "package:flutter/material.dart"; import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; -// import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; -import "responsive_page.dart"; +class ResponsiveSchedule extends NavigationItem { + final ScheduleModel model = ScheduleModel(); -class ResponsiveSchedule extends ResponsivePage { - final ScheduleModel model; - ResponsiveSchedule() : model = ScheduleModel(); + ResponsiveSchedule() : + super(label: "Schedule", icon: const Icon(Icons.schedule)); /// Allows the user to select a day in the calendar to view. /// @@ -45,12 +44,6 @@ class ResponsiveSchedule extends ResponsivePage { ) ); - @override - WidgetBuilder get builder => (_) => SchedulePage(); -} - -/// A page to allow the user to explore their schedule. -class SchedulePage extends StatelessWidget { /// Lets the user know that they chose an invalid schedule combination. void handleInvalidSchedule(BuildContext context) => ScaffoldMessenger.of(context).showSnackBar( diff --git a/lib/src/widgets/generic/responsive_scaffold.dart b/lib/src/widgets/generic/responsive_scaffold.dart index 6b71b0e32..6affca1ab 100644 --- a/lib/src/widgets/generic/responsive_scaffold.dart +++ b/lib/src/widgets/generic/responsive_scaffold.dart @@ -1,3 +1,3 @@ -export "src/navigation_item.dart"; -export "src/responsive_builder.dart"; -export "src/scaffold.dart"; +export "../responsive_scaffold/navigation_item.dart"; +export "../responsive_scaffold/responsive_builder.dart"; +export "../responsive_scaffold/scaffold.dart"; diff --git a/lib/src/widgets/repsonsive_scaffold/layout_info.dart b/lib/src/widgets/responsive_scaffold/layout_info.dart similarity index 100% rename from lib/src/widgets/repsonsive_scaffold/layout_info.dart rename to lib/src/widgets/responsive_scaffold/layout_info.dart diff --git a/lib/src/widgets/repsonsive_scaffold/navigation_item.dart b/lib/src/widgets/responsive_scaffold/navigation_item.dart similarity index 78% rename from lib/src/widgets/repsonsive_scaffold/navigation_item.dart rename to lib/src/widgets/responsive_scaffold/navigation_item.dart index 2a312e18d..7f90d141a 100644 --- a/lib/src/widgets/repsonsive_scaffold/navigation_item.dart +++ b/lib/src/widgets/responsive_scaffold/navigation_item.dart @@ -5,7 +5,7 @@ import "package:flutter/material.dart"; /// This class maps to both [BottomNavigationBarItem] and /// [NavigationRailDestination] with an [icon] and [label] property. @immutable -class NavigationItem { +abstract class NavigationItem extends StatelessWidget { /// The icon for this item. final Widget icon; @@ -24,4 +24,9 @@ class NavigationItem { /// Generates an item for [NavigationRail]. NavigationRailDestination get navRail => NavigationRailDestination(icon: icon, label: Text(label)); + + AppBar get appBar; + Widget? get sideSheet => null; + Widget? get floatingActionButton => null; + FloatingActionButtonLocation? get floatingActionButtonLocation => null; } diff --git a/lib/src/widgets/repsonsive_scaffold/responsive_builder.dart b/lib/src/widgets/responsive_scaffold/responsive_builder.dart similarity index 100% rename from lib/src/widgets/repsonsive_scaffold/responsive_builder.dart rename to lib/src/widgets/responsive_scaffold/responsive_builder.dart diff --git a/lib/src/widgets/repsonsive_scaffold/scaffold.dart b/lib/src/widgets/responsive_scaffold/scaffold.dart similarity index 90% rename from lib/src/widgets/repsonsive_scaffold/scaffold.dart rename to lib/src/widgets/responsive_scaffold/scaffold.dart index 92786cf5f..13643767b 100644 --- a/lib/src/widgets/repsonsive_scaffold/scaffold.dart +++ b/lib/src/widgets/responsive_scaffold/scaffold.dart @@ -19,7 +19,7 @@ class ResponsiveScaffold extends StatelessWidget { final PreferredSizeWidget appBar; /// The main body of the scaffold. - final Widget body; + final WidgetBuilder bodyBuilder; /// The full drawer to show. /// @@ -76,7 +76,7 @@ class ResponsiveScaffold extends StatelessWidget { /// Creates a scaffold that responds to the screen size. const ResponsiveScaffold({ required this.drawer, - required this.body, + required this.bodyBuilder, required this.appBar, this.floatingActionButton, this.sideSheet, @@ -88,25 +88,26 @@ class ResponsiveScaffold extends StatelessWidget { onNavIndexChanged = null; /// Creates a responsive layout with primary navigation items. - const ResponsiveScaffold.navBar({ + ResponsiveScaffold.navBar({ required this.drawer, required this.secondaryDrawer, - required this.appBar, - required this.body, - required this.navItems, - required this.navIndex, + required List this.navItems, + required int this.navIndex, required this.onNavIndexChanged, - this.sideSheet, - this.floatingActionButton, - this.floatingActionButtonLocation, - }); + }) : + appBar = navItems [navIndex].appBar, + bodyBuilder = navItems [navIndex].build, + floatingActionButton = navItems [navIndex].floatingActionButton, + floatingActionButtonLocation = navItems [navIndex] + .floatingActionButtonLocation, + sideSheet = navItems [navIndex].sideSheet; /// Whether this widget is being used with a navigation bar. bool get hasNavBar => navItems != null; @override Widget build(BuildContext context) => ResponsiveBuilder( - child: body, // ignore: sort_child_properties_last + child: bodyBuilder(context), // ignore: sort_child_properties_last builder: (BuildContext context, LayoutInfo info, Widget? child) => Scaffold( appBar: appBar, drawer: info.hasStandardDrawer ? null diff --git a/pubspec.lock b/pubspec.lock index 87fbc86ce..46d7c4878 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + adaptive_breakpoints: + dependency: "direct main" + description: + name: adaptive_breakpoints + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4" archive: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b52c639e4..872feb145 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,7 @@ dependencies: # ------------- Misc ------------- flutter_native_timezone: ^1.0.10 url_launcher: ^6.0.3 + adaptive_breakpoints: ^0.0.4 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From 48b6dd979120bb4edd9e50fad6f7e7ff48e51258 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 5 Apr 2021 02:49:27 -0400 Subject: [PATCH 110/251] Refactored AdminHomePage into a collapsible menu in the drawer. Also made the Drawer more intelligent in what to show. --- lib/app.dart | 5 +- lib/pages.dart | 9 +- lib/src/pages/admin.dart | 159 ----------- lib/src/pages/{ => admin}/calendar.dart | 58 +++- lib/src/pages/{ => admin}/specials.dart | 17 +- lib/src/pages/drawer.dart | 211 ++++++++------ lib/src/pages/sports.dart | 356 ++++++++++++------------ 7 files changed, 371 insertions(+), 444 deletions(-) delete mode 100644 lib/src/pages/admin.dart rename lib/src/pages/{ => admin}/calendar.dart (58%) rename lib/src/pages/{ => admin}/specials.dart (80%) diff --git a/lib/app.dart b/lib/app.dart index ab075da6d..8a5269946 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -13,9 +13,8 @@ class RamLife extends StatelessWidget { Routes.schedule: (_) => const HomePage(pageIndex: 1), Routes.reminders: (_) => const HomePage(pageIndex: 2), Routes.feedback: (_) => FeedbackPage(), - Routes.calendar: (_) => CalendarPage(), - Routes.specials: (_) => SpecialPage(), - Routes.admin: (_) => AdminHomePage(), + Routes.calendar: (_) => const AdminCalendarPage(), + Routes.specials: (_) => const AdminSpecialsPage(), Routes.sports: (_) => SportsPage(), }; diff --git a/lib/pages.dart b/lib/pages.dart index 5dce18451..357b9cd8c 100644 --- a/lib/pages.dart +++ b/lib/pages.dart @@ -1,11 +1,12 @@ library pages; -export "src/pages/admin.dart"; +export "src/pages/admin/calendar.dart"; +export "src/pages/admin/specials.dart"; + export "src/pages/builders/day_builder.dart"; export "src/pages/builders/reminder_builder.dart"; export "src/pages/builders/special_builder.dart"; export "src/pages/builders/sports_builder.dart"; -export "src/pages/calendar.dart"; export "src/pages/drawer.dart"; export "src/pages/feedback.dart"; export "src/pages/home.dart"; @@ -13,7 +14,6 @@ export "src/pages/login.dart"; export "src/pages/reminders.dart"; export "src/pages/route_initializer.dart"; export "src/pages/schedule.dart"; -export "src/pages/specials.dart"; export "src/pages/sports.dart"; /// Route names for each page in the app. @@ -41,9 +41,6 @@ class Routes { /// The route name for the specials manager page. static const String specials = "specials"; - /// The route name for the admin home page. - static const String admin = "admin"; - /// The route name for the sports games page. static const String sports = "sports"; } diff --git a/lib/src/pages/admin.dart b/lib/src/pages/admin.dart deleted file mode 100644 index ae21b931f..000000000 --- a/lib/src/pages/admin.dart +++ /dev/null @@ -1,159 +0,0 @@ -import "package:flutter/material.dart"; - -import "package:ramaz/data.dart"; -import "package:ramaz/pages.dart"; -import "package:ramaz/services.dart"; -import "package:ramaz/models.dart"; - -/// A widget to represent a calendar icon. -/// -/// Due to "budget cuts", poor Levi Lesches ('21) had to recreate the calendar -/// icon from scratch, instead of Googling for a png. What a loser. -/// -/// This widget is not used, rather left here as a token of appreciation for -/// all the time Levi has wasted designing (and scrapping said designs) -/// the UI and backend code for this app. That dude deserves a raise. -class OldCalendarWidget extends StatelessWidget { - /// Creates a widget to look like the calendar icon. - const OldCalendarWidget(); - - @override - Widget build(BuildContext context) => InkWell( - onTap: () => Navigator.pushReplacementNamed(context, Routes.calendar), - child: Container( - decoration: BoxDecoration(border: Border.all()), - padding: const EdgeInsets.symmetric(horizontal: 25), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const Spacer(flex: 1), - Expanded( - flex: 1, - child: Container( - decoration: BoxDecoration(border: Border.all()), - child: const Center( - child: Text("Monday") - ), - ), - ), - Expanded( - flex: 4, - child: Container( - decoration: BoxDecoration(border: Border.all()), - child: const Center( - child: Text("01", textScaleFactor: 2), - ) - ) - ), - const Spacer(flex: 1), - ] - ) - ) - ); -} - -/// A menu item for the admin console. -/// -/// This widget holds a [label] over a big [icon], and when tapped, will push -/// a page named [routeName]. -class AdminMenuItem extends StatelessWidget { - /// The icon to display. - final IconData icon; - - /// The label to display. - final String label; - - /// A description of what this admin option does. - final String description; - - /// The name of the route to push when tapped. - final String routeName; - - /// Creates a menu item for the admin console. - const AdminMenuItem({ - required this.icon, - required this.label, - required this.description, - required this.routeName - }); - - @override - Widget build(BuildContext context) => ListTile( - title: Text(label), - subtitle: Text(description), - leading: Icon(icon), - onTap: () => Navigator.of(context).pushNamed(routeName), - ); -} - -/// The home page for the admin console. -/// -/// This page shows all the options that the user has the scopes to access. -/// It does this using [Auth.claims] and its helper functions. -/// -/// This widget needs to be stateful because the admin scopes are Futures. -class AdminHomePage extends StatefulWidget { - @override - AdminHomePageState createState() => AdminHomePageState(); -} - -/// State for [AdminHomePage]. -/// -/// This state takes care of loading [Auth.isCalendarAdmin] and -/// [Auth.isSportsAdmin] and then displaying the appropriate [AdminMenuItem]s. -class AdminHomePageState extends State { - /// The scopes this admin is allowed to access. - late final List scopes; - - @override - void initState() { - super.initState(); - // If the user is on this page, they are an admin - // And if they are an admin, UserModel.admin != null - scopes = Models.instance.user.admin!.scopes; - } - - @override - Widget build(BuildContext context) => Scaffold( - drawer: NavigationDrawer(), - appBar: AppBar( - title: const Text("Admin Console"), - actions: [ - IconButton( - icon: const Icon(Icons.home), - onPressed: () => - Navigator.of(context).pushReplacementNamed(Routes.home), - ) - ] - ), - body: ListView( - padding: const EdgeInsets.all(20), - children: [ - Text( - "Choose an admin option", - style: Theme.of(context).textTheme.headline5, - ), - const SizedBox(height: 20), - if (scopes.contains(Scope.calendar)) const AdminMenuItem( - label: "Calendar", - icon: Icons.today, - description: "Modify the calendar", - routeName: Routes.calendar, - ), - if (scopes.contains(Scope.calendar)) const AdminMenuItem( - label: "Schedules", - icon: Icons.schedule, - description: "Manage your custom schedules", - routeName: Routes.specials, - ), - if (scopes.contains(Scope.sports)) const AdminMenuItem( - icon: Icons.directions_run, - label: "Sports", - description: "Add new sports games and record scores", - routeName: Routes.sports, - ) - ] - ) - ); -} diff --git a/lib/src/pages/calendar.dart b/lib/src/pages/admin/calendar.dart similarity index 58% rename from lib/src/pages/calendar.dart rename to lib/src/pages/admin/calendar.dart index c402b4db5..ca0d639e9 100644 --- a/lib/src/pages/calendar.dart +++ b/lib/src/pages/admin/calendar.dart @@ -5,8 +5,56 @@ import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; +/// A widget to represent a calendar icon. +/// +/// Due to "budget cuts", poor Levi Lesches ('21) had to recreate the calendar +/// icon from scratch, instead of Googling for a png. What a loser. +/// +/// This widget is not used, rather left here as a token of appreciation for +/// all the time Levi has wasted designing (and scrapping said designs) +/// the UI and backend code for this app. That dude deserves a raise. +class OldCalendarWidget extends StatelessWidget { + /// Creates a widget to look like the calendar icon. + const OldCalendarWidget(); + + @override + Widget build(BuildContext context) => InkWell( + onTap: () => Navigator.pushReplacementNamed(context, Routes.calendar), + child: Container( + decoration: BoxDecoration(border: Border.all()), + padding: const EdgeInsets.symmetric(horizontal: 25), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Spacer(flex: 1), + Expanded( + flex: 1, + child: Container( + decoration: BoxDecoration(border: Border.all()), + child: const Center( + child: Text("Monday") + ), + ), + ), + Expanded( + flex: 4, + child: Container( + decoration: BoxDecoration(border: Border.all()), + child: const Center( + child: Text("01", textScaleFactor: 2), + ) + ) + ), + const Spacer(flex: 1), + ] + ) + ) + ); +} + /// A page for admins to modify the calendar in the database. -class CalendarPage extends StatelessWidget { +class AdminCalendarPage extends StatelessWidget { /// The months of the year. /// /// These will be the headers of all the months. @@ -23,10 +71,14 @@ class CalendarPage extends StatelessWidget { "Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat" ]; + /// Creates a page for admins to modify the calendar. + const AdminCalendarPage(); + @override - Widget build(BuildContext context) => Scaffold( + Widget build(BuildContext context) => ResponsiveScaffold( + drawer: const NavigationDrawer(), appBar: AppBar(title: const Text("Calendar")), - body: SingleChildScrollView( + bodyBuilder: (_) => SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 5), child: ModelListener( model: () => CalendarEditor(), diff --git a/lib/src/pages/specials.dart b/lib/src/pages/admin/specials.dart similarity index 80% rename from lib/src/pages/specials.dart rename to lib/src/pages/admin/specials.dart index 5c3a918a3..adcae15d0 100644 --- a/lib/src/pages/specials.dart +++ b/lib/src/pages/admin/specials.dart @@ -5,24 +5,27 @@ import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; /// A page to show the admin's custom specials. -class SpecialPage extends StatelessWidget { +class AdminSpecialsPage extends StatelessWidget { + UserModel get model => Models.instance.user; + + const AdminSpecialsPage(); + // If the user is on this page, they are an admin. // So, model.admin != null @override Widget build(BuildContext context) => ModelListener( - model: () => Models.instance.user, + model: () => model, dispose: false, - builder: (_, UserModel model, __) => Scaffold( - appBar: AppBar( - title: const Text("Custom schedules"), - ), + builder: (_, UserModel model, __) => ResponsiveScaffold( + appBar: AppBar(title: const Text("Custom schedules")), + drawer: const NavigationDrawer(), floatingActionButton: FloatingActionButton( onPressed: () async => model.addSpecialToAdmin( await SpecialBuilder.buildSpecial(context), ), child: const Icon(Icons.add), ), - body: Padding( + bodyBuilder: (_) => Padding( padding: const EdgeInsets.all(20), child: model.admin!.specials.isEmpty ? const Center ( diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index 5ca3f81c0..f73c74787 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -1,6 +1,7 @@ // ignore_for_file: prefer_const_constructors import "package:flutter/material.dart"; +import "package:ramaz/data.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/models.dart"; import "package:ramaz/services.dart"; @@ -12,107 +13,135 @@ class NavigationDrawer extends StatelessWidget { static Future Function() pushRoute(BuildContext context, String name) => () => Navigator.of(context).pushReplacementNamed(name); - final bool isOnHomePage; - const NavigationDrawer({this.isOnHomePage = false}); + const NavigationDrawer(); - @override Widget build (BuildContext context) => Drawer ( - child: LayoutBuilder( - builder: ( - BuildContext context, - BoxConstraints constraints - ) => SingleChildScrollView( - child: ConstrainedBox( - constraints: BoxConstraints( - minHeight: constraints.maxHeight, - ), - child: IntrinsicHeight( - child: Column( - children: [ - DrawerHeader (child: RamazLogos.ramSquare), - if (!isOnHomePage) ...[ + String? getRouteName(BuildContext context) => + ModalRoute.of(context)!.settings.name; + + bool get isScheduleAdmin => Models.instance.user.admin! + .scopes.contains(Scope.calendar); + + bool get isSportsAdmin => Models.instance.user.admin! + .scopes.contains(Scope.sports); + + @override + Widget build (BuildContext context) => ResponsiveBuilder( + builder: (_, LayoutInfo layout, __) => Drawer ( + child: LayoutBuilder( + builder: ( + BuildContext context, + BoxConstraints constraints + ) => SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, + ), + child: IntrinsicHeight( + child: Column( + children: [ + DrawerHeader(child: RamazLogos.ramSquare), + if (layout.isDesktop || getRouteName(context) != Routes.home) + ListTile ( + title: const Text ("Dashboard"), + leading: Icon (Icons.dashboard), + onTap: pushRoute(context, Routes.home), + ), + if (layout.isDesktop || getRouteName(context) != Routes.schedule) + ListTile ( + title: const Text ("Schedule"), + leading: Icon (Icons.schedule), + onTap: pushRoute(context, Routes.schedule), + ), + if (layout.isDesktop || getRouteName(context) != Routes.reminders) + ListTile ( + title: const Text ("Reminders"), + leading: Icon (Icons.notifications), + onTap: pushRoute(context, Routes.reminders), + ), ListTile ( - title: const Text ("Dashboard"), - leading: Icon (Icons.dashboard), - onTap: pushRoute(context, Routes.home), + title: Text ("Sports"), + leading: Icon (Icons.sports), + onTap: pushRoute(context, Routes.sports), ), + if (Models.instance.user.isAdmin) ExpansionTile( + leading: Icon(Icons.admin_panel_settings), + title: const Text("Admin options"), + children: [ + if (isScheduleAdmin) ...[ + ListTile( + title: Text("Calendar"), + leading: Icon(Icons.calendar_today), + onTap: pushRoute(context, Routes.calendar), + ), + ListTile( + title: Text("Custom schedules"), + leading: Icon(Icons.schedule), + onTap: pushRoute(context, Routes.specials), + ), + ], + if (isSportsAdmin) + ListTile( + title: Text("Sports"), + leading: Icon(Icons.sports), + onTap: pushRoute(context, Routes.sports), + ) + ] + ), + BrightnessChanger.dropdown(prefs: Services.instance.prefs), ListTile ( - title: const Text ("Schedule"), - leading: Icon (Icons.schedule), - onTap: pushRoute(context, Routes.schedule), + title: const Text ("Logout"), + leading: Icon (Icons.lock), + onTap: pushRoute(context, Routes.login) ), ListTile ( - title: const Text ("Reminders"), - leading: Icon (Icons.note), - onTap: pushRoute(context, Routes.reminders), + title: const Text ("Send Feedback"), + leading: Icon (Icons.feedback), + onTap: pushRoute(context, Routes.feedback), ), - ], - // ListTile ( - // title: Text ("Sports"), - // leading: Icon (Icons.directions_run), - // onTap: pushRoute(context, Routes.sports), - // ), - if (Models.instance.user.isAdmin) - ListTile( - title: const Text("Admin console"), - leading: Icon(Icons.admin_panel_settings), - onTap: pushRoute(context, Routes.admin), + const AboutListTile ( + icon: Icon (Icons.info), + // ignore: sort_child_properties_last + child: Text ("About"), + applicationName: "Ramaz Student Life", + applicationVersion: "0.5", + applicationIcon: Logos.ramazIcon, + aboutBoxChildren: [ + Text ( + "Created by the Ramaz Coding Club (Levi Lesches and Sophia " + "Kremer) with the support of the Ramaz administration. " + ), + SizedBox (height: 20), + Text ( + "A special thanks to Mr. Vovsha for helping us go from idea to " + "reality." + ), + ] ), - BrightnessChanger.dropdown(prefs: Services.instance.prefs), - ListTile ( - title: const Text ("Logout"), - leading: Icon (Icons.lock), - onTap: pushRoute(context, Routes.login) - ), - ListTile ( - title: const Text ("Send Feedback"), - leading: Icon (Icons.feedback), - onTap: () => Navigator.of(context) - ..maybePop() - ..pushNamed(Routes.feedback) - ), - const AboutListTile ( - icon: Icon (Icons.info), - // ignore: sort_child_properties_last - child: Text ("About"), - applicationName: "Ramaz Student Life", - applicationVersion: "0.5", - applicationIcon: Logos.ramazIcon, - aboutBoxChildren: [ - Text ( - "Created by the Ramaz Coding Club (Levi Lesches and Sophia " - "Kremer) with the support of the Ramaz administration. " - ), - SizedBox (height: 20), - Text ( - "A special thanks to Mr. Vovsha for helping us go from idea to " - "reality." - ), - ] - ), - const Spacer(), - Align ( - alignment: Alignment.bottomCenter, - child: Column ( - children: [ - const Divider(), - SingleChildScrollView ( - scrollDirection: Axis.horizontal, - child: Row ( - children: const [ - Logos.ramazIcon, - Logos.outlook, - Logos.schoology, - Logos.drive, - Logos.seniorSystems - ] + const Spacer(), + Align ( + alignment: Alignment.bottomCenter, + child: Column ( + children: [ + const Divider(), + SingleChildScrollView ( + scrollDirection: Axis.horizontal, + child: Row ( + children: const [ + Logos.ramazIcon, + Logos.outlook, + Logos.schoology, + Logos.drive, + Logos.seniorSystems + ] + ) ) - ) - ] + ] + ) ) - ) - ] - ) - ) + ] + ) + ) + ) ) ) ) diff --git a/lib/src/pages/sports.dart b/lib/src/pages/sports.dart index e9079120b..87675fd8d 100644 --- a/lib/src/pages/sports.dart +++ b/lib/src/pages/sports.dart @@ -64,6 +64,183 @@ class GenericSportsView extends StatelessWidget { ); } +AppBar buildAppBar(SportsModel model) => AppBar( + title: const Text("Sports"), + bottom: const TabBar( + tabs: [ + Tab(text: "Upcoming"), + Tab(text: "Recent"), + ] + ), + actions: [ + ModelListener( + model: () => model, + dispose: false, + builder: (BuildContext context, __, ___) => !model.isAdmin ? Container() + : IconButton( + icon: const Icon(Icons.add), + tooltip: "Add a game", + onPressed: model.adminFunc(() async => + model.data.addGame(await SportsBuilder.createGame(context)) + ), + ), + ), + PopupMenuButton( + icon: const Icon(Icons.sort), + onSelected: (SortOption option) => model.sortOption = option, + tooltip: "Sort games", + itemBuilder: (_) => [ + const PopupMenuItem( + value: SortOption.chronological, + child: Text("By date"), + ), + const PopupMenuItem( + value: SortOption.sport, + child: Text("By sport"), + ) + ] + ), + IconButton( + icon: const Icon(Icons.live_tv), + onPressed: () => launch(Urls.sportsLivestream), + tooltip: "Watch livestream", + ) + ] +); + +/// Creates a [GenericSportsView] based on the sorting option. +Widget getLayout(BuildContext context, SportsModel model) { + switch(model.sortOption) { + case SortOption.chronological: + return GenericSportsView( + loading: model.loading, + onRefresh: model.adminFunc(Services.instance.database.updateSports), + recents: model.recents, + upcoming: model.upcoming, + builder: (int index) => SportsTile( + model.data.games [index], + onTap: !model.isAdmin ? null : () => openMenu( + context: context, + index: index, + model: model, + ) + ), + ); + case SortOption.sport: + return GenericSportsView>>( + loading: model.loading, + onRefresh: model.adminFunc(Services.instance.database.updateSports), + recents: model.recentBySport.entries.toList(), + upcoming: model.upcomingBySport.entries.toList(), + builder: (MapEntry> entry) => Column( + children: [ + const SizedBox(height: 15), + Text(SportsGame.capitalize(entry.key)), + for (final int index in entry.value) + SportsTile( + model.data.games [index], + onTap: !model.isAdmin ? null : () => openMenu( + context: context, + index: index, + model: model + ) + ), + const SizedBox(height: 20), + ] + ) + ); + } +} + +/// Opens a menu with options for the selected game. +/// +/// This menu can only be accessed by administrators. +void openMenu({ + required BuildContext context, + required int index, + required SportsModel model +}) => showDialog( + context: context, + builder: (BuildContext newContext) => SimpleDialog( + title: Text(model.data.games [index].description), + children: [ + SimpleDialogOption( + onPressed: () async { + Navigator.of(newContext).pop(); + final Scores? scores = await SportsScoreUpdater.updateScores( + context, model.data.games [index] + ); + if (scores == null) { + return; + } + model.loading = true; + await Models.instance.sports.replace( + index, + model.data.games [index].replaceScores(scores) + ); + model.loading = false; + }, + child: const Text("Edit scores", textScaleFactor: 1.2), + ), + const SizedBox(height: 10), + SimpleDialogOption( + onPressed: () async { + Navigator.of(newContext).pop(); + model.loading = true; + await Models.instance.sports.replace( + index, + model.data.games [index].replaceScores(null) + ); + model.loading = false; + }, + child: const Text("Remove scores", textScaleFactor: 1.2), + ), + const SizedBox(height: 10), + SimpleDialogOption( + onPressed: () async { + Navigator.of(newContext).pop(); + model.loading = true; + await Models.instance.sports.replace( + index, + await SportsBuilder.createGame(context, model.data.games [index]) + ); + model.loading = false; + }, + child: const Text("Edit game", textScaleFactor: 1.2), + ), + const SizedBox(height: 10), + SimpleDialogOption( + onPressed: () async { + Navigator.of(newContext).pop(); + final bool? confirm = await showDialog( + context: context, + builder: (BuildContext context) => AlertDialog( + title: const Text("Confirm"), + content: const Text("Are you sure you want to delete this game?"), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: const Text("Cancel"), + ), + ElevatedButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text("Confirm"), + ) + ] + ) + ); + if (confirm ?? false) { + model.loading = true; + await Models.instance.sports.delete(index); + model.loading = false; + } + }, + child: const Text("Remove game", textScaleFactor: 1.2), + ), + ] + ) +); + /// A page to show recent and upcoming games to the user. class SportsPage extends StatelessWidget { @override @@ -71,182 +248,11 @@ class SportsPage extends StatelessWidget { length: 2, child: ModelListener( model: () => SportsModel(Models.instance.sports), - builder: (_, SportsModel model, __) => Scaffold( - appBar: AppBar( - title: const Text("Sports"), - bottom: const TabBar( - tabs: [ - Tab(text: "Upcoming"), - Tab(text: "Recent"), - ] - ), - actions: [ - if (model.isAdmin) - IconButton( - icon: const Icon(Icons.add), - tooltip: "Add a game", - onPressed: model.adminFunc(() async => - model.data.addGame(await SportsBuilder.createGame(context)) - ), - ), - PopupMenuButton( - icon: const Icon(Icons.sort), - onSelected: (SortOption option) => model.sortOption = option, - tooltip: "Sort games", - itemBuilder: (_) => [ - const PopupMenuItem( - value: SortOption.chronological, - child: Text("By date"), - ), - const PopupMenuItem( - value: SortOption.sport, - child: Text("By sport"), - ) - ] - ), - IconButton( - icon: const Icon(Icons.live_tv), - onPressed: () => launch(Urls.sportsLivestream), - tooltip: "Watch livestream", - ) - ] - ), - drawer: NavigationDrawer(), - body: getLayout(context, model), + builder: (_, SportsModel model, __) => ResponsiveScaffold( + appBar: buildAppBar(model), + drawer: const NavigationDrawer(), + bodyBuilder: (_) => getLayout(context, model), ), ) ); - - /// Creates a [GenericSportsView] based on the sorting option. - Widget getLayout(BuildContext context, SportsModel model) { - switch(model.sortOption) { - case SortOption.chronological: - return GenericSportsView( - loading: model.loading, - onRefresh: model.adminFunc(Services.instance.database.updateSports), - recents: model.recents, - upcoming: model.upcoming, - builder: (int index) => SportsTile( - model.data.games [index], - onTap: !model.isAdmin ? null : () => openMenu( - context: context, - index: index, - model: model, - ) - ), - ); - case SortOption.sport: - return GenericSportsView>>( - loading: model.loading, - onRefresh: model.adminFunc(Services.instance.database.updateSports), - recents: model.recentBySport.entries.toList(), - upcoming: model.upcomingBySport.entries.toList(), - builder: (MapEntry> entry) => Column( - children: [ - const SizedBox(height: 15), - Text(SportsGame.capitalize(entry.key)), - for (final int index in entry.value) - SportsTile( - model.data.games [index], - onTap: !model.isAdmin ? null : () => openMenu( - context: context, - index: index, - model: model - ) - ), - const SizedBox(height: 20), - ] - ) - ); - } - } - - /// Opens a menu with options for the selected game. - /// - /// This menu can only be accessed by administrators. - static void openMenu({ - required BuildContext context, - required int index, - required SportsModel model - }) => showDialog( - context: context, - builder: (BuildContext newContext) => SimpleDialog( - title: Text(model.data.games [index].description), - children: [ - SimpleDialogOption( - onPressed: () async { - Navigator.of(newContext).pop(); - final Scores? scores = await SportsScoreUpdater.updateScores( - context, model.data.games [index] - ); - if (scores == null) { - return; - } - model.loading = true; - await Models.instance.sports.replace( - index, - model.data.games [index].replaceScores(scores) - ); - model.loading = false; - }, - child: const Text("Edit scores", textScaleFactor: 1.2), - ), - const SizedBox(height: 10), - SimpleDialogOption( - onPressed: () async { - Navigator.of(newContext).pop(); - model.loading = true; - await Models.instance.sports.replace( - index, - model.data.games [index].replaceScores(null) - ); - model.loading = false; - }, - child: const Text("Remove scores", textScaleFactor: 1.2), - ), - const SizedBox(height: 10), - SimpleDialogOption( - onPressed: () async { - Navigator.of(newContext).pop(); - model.loading = true; - await Models.instance.sports.replace( - index, - await SportsBuilder.createGame(context, model.data.games [index]) - ); - model.loading = false; - }, - child: const Text("Edit game", textScaleFactor: 1.2), - ), - const SizedBox(height: 10), - SimpleDialogOption( - onPressed: () async { - Navigator.of(newContext).pop(); - final bool? confirm = await showDialog( - context: context, - builder: (BuildContext context) => AlertDialog( - title: const Text("Confirm"), - content: const Text("Are you sure you want to delete this game?"), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(false), - child: const Text("Cancel"), - ), - ElevatedButton( - onPressed: () => Navigator.of(context).pop(true), - child: const Text("Confirm"), - ) - ] - ) - ); - if (confirm ?? false) { - model.loading = true; - await Models.instance.sports.delete(index); - model.loading = false; - } - }, - child: const Text("Remove game", textScaleFactor: 1.2), - ), - ] - ) - ); } From d60ebc24ce39cb8db460cba9387f6a190aaa6bf7 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 5 Apr 2021 02:51:52 -0400 Subject: [PATCH 111/251] Redesigned RouteInitializer and FeedbackPage --- lib/services.dart | 4 ++++ lib/src/models/view/feedback.dart | 2 +- lib/src/pages/feedback.dart | 12 +++++++----- lib/src/pages/home.dart | 2 +- lib/src/pages/route_initializer.dart | 20 ++++++++++++++------ 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/lib/services.dart b/lib/services.dart index 9c3dc77bd..613b56782 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -62,6 +62,9 @@ class Services implements Service { /// The functions of this service operate on these services. late final List services; + /// Whether the services are ready to use. + bool isReady = false; + /// Bundles services together. /// /// Also initializes [services]. @@ -74,6 +77,7 @@ class Services implements Service { for (final Service service in services) { await service.init(); } + isReady = true; } @override diff --git a/lib/src/models/view/feedback.dart b/lib/src/models/view/feedback.dart index 1f9ed4d0b..307bc76f5 100644 --- a/lib/src/models/view/feedback.dart +++ b/lib/src/models/view/feedback.dart @@ -7,7 +7,7 @@ import "package:ramaz/services.dart"; // ignore: prefer_mixin class FeedbackModel with ChangeNotifier { String? _message; - bool _anonymous = true; + bool _anonymous = false; /// Whether the user is ready to submit /// diff --git a/lib/src/pages/feedback.dart b/lib/src/pages/feedback.dart index db3d10d92..e9fe1a9cc 100644 --- a/lib/src/pages/feedback.dart +++ b/lib/src/pages/feedback.dart @@ -4,12 +4,15 @@ import "package:flutter/material.dart"; import "package:ramaz/widgets.dart"; import "package:ramaz/models.dart"; +import "drawer.dart"; + /// A page to submit feedback. class FeedbackPage extends StatelessWidget { @override - Widget build (BuildContext context) => Scaffold( + Widget build (BuildContext context) => ResponsiveScaffold( + drawer: const NavigationDrawer(), appBar: AppBar(title: const Text ("Send Feedback")), - body: ModelListener( + bodyBuilder: (_) => ModelListener( model: () => FeedbackModel(), builder: (BuildContext context, FeedbackModel model, _) => Center( child: SizedBox( @@ -29,10 +32,9 @@ class FeedbackPage extends StatelessWidget { value: model.anonymous, // If tristate == false (default), value != null onChanged: (bool? value) => model.anonymous = value!, - title: const Text("Make anonymous"), + title: const Text("Anonymous"), subtitle: const Text( - "We won't be able to see your name or email. " - "To share them with us, keep this unchecked." + "To keep your name and email hidden, check this box." ) ), const SizedBox(height: 50), diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index 3c08c5950..18e804386 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -37,7 +37,7 @@ class HomePageState extends State { navIndex: index, onNavIndexChanged: (int value) => setState(() => index = value), drawer: const NavigationDrawer(), - secondaryDrawer: const NavigationDrawer(isOnHomePage: true), + secondaryDrawer: const NavigationDrawer(), ) ); } diff --git a/lib/src/pages/route_initializer.dart b/lib/src/pages/route_initializer.dart index 4de50aeba..d92e01517 100644 --- a/lib/src/pages/route_initializer.dart +++ b/lib/src/pages/route_initializer.dart @@ -1,7 +1,9 @@ import "package:flutter/material.dart"; + import "package:ramaz/pages.dart"; import "package:ramaz/models.dart"; import "package:ramaz/services.dart"; +import "package:ramaz/widgets.dart"; /// A route that performs initialization logic first. class RouteInitializer extends StatefulWidget { @@ -49,21 +51,23 @@ class RouteInitializerState extends State { /// /// No-op if the backend is already initialized. Future init() async { - final NavigatorState nav = Navigator.of(context); try { - await Services.instance.init(); + if (!Services.instance.isReady) { + await Services.instance.init(); + } if (Auth.isSignedIn && !Models.instance.isReady) { await Models.instance.init(); - } + } else { + } } catch (error) { await Services.instance.crashlytics.log("Error. Disposing models"); Models.instance.dispose(); if (widget.onError != null) { - await nav.pushReplacementNamed(widget.onError!); + await Navigator.of(context).pushReplacementNamed(widget.onError!); } } if (!widget.isAllowed()) { - await nav.pushReplacementNamed(widget.onFailure); + await Navigator.of(context).pushReplacementNamed(widget.onFailure); } } @@ -73,6 +77,10 @@ class RouteInitializerState extends State { builder: (_, AsyncSnapshot snapshot) => snapshot.connectionState == ConnectionState.done ? widget.child - : const Center(child: CircularProgressIndicator()) + : ResponsiveScaffold( + appBar: AppBar(title: const Text("Loading...")), + bodyBuilder: (_) => const Center(child: CircularProgressIndicator()), + drawer: const NavigationDrawer(), + ), ); } From aac4744a03773d0eee0d62b516b47116a2296116 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 5 Apr 2021 03:20:06 -0400 Subject: [PATCH 112/251] Optimized RouteInitializer logic --- lib/app.dart | 54 ++++++++++++++++++---------- lib/src/pages/feedback.dart | 2 ++ lib/src/pages/login.dart | 2 +- lib/src/pages/route_initializer.dart | 1 - lib/src/pages/sports.dart | 2 ++ 5 files changed, 41 insertions(+), 20 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 8a5269946..1ec35381d 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,21 +1,48 @@ import "package:flutter/material.dart"; import "package:ramaz/constants.dart"; +import "package:ramaz/data.dart"; import "package:ramaz/pages.dart"; +import "package:ramaz/models.dart"; +import "package:ramaz/services.dart"; import "package:ramaz/widgets.dart"; /// The main app widget. class RamLife extends StatelessWidget { + static bool hasAdminScope(Scope scope) => Auth.isSignedIn + && Models.instance.user.isAdmin + && Models.instance.user.admin!.scopes.contains(scope); + /// The routes for this app. static final Map routes = { - Routes.login: (_) => Login(), - Routes.home: (_) => const HomePage(), - Routes.schedule: (_) => const HomePage(pageIndex: 1), - Routes.reminders: (_) => const HomePage(pageIndex: 2), - Routes.feedback: (_) => FeedbackPage(), - Routes.calendar: (_) => const AdminCalendarPage(), - Routes.specials: (_) => const AdminSpecialsPage(), - Routes.sports: (_) => SportsPage(), + Routes.login: (_) => RouteInitializer( + onError: null , + isAllowed: () => true, + child: const Login(), + ), + Routes.home: (_) => const RouteInitializer( + child: HomePage(), + ), + Routes.schedule: (_) => const RouteInitializer( + child: HomePage(pageIndex: 1), + ), + Routes.reminders: (_) => const RouteInitializer( + child: HomePage(pageIndex: 2), + ), + Routes.feedback: (_) => const RouteInitializer( + child: FeedbackPage(), + ), + Routes.calendar: (_) => RouteInitializer( + isAllowed: () => hasAdminScope(Scope.calendar), + child: AdminCalendarPage(), + ), + Routes.specials: (_) => RouteInitializer( + isAllowed: () => hasAdminScope(Scope.calendar), + child: AdminSpecialsPage(), + ), + Routes.sports: (_) => const RouteInitializer( + child: SportsPage(), + ), }; /// Provides a const constructor. @@ -95,16 +122,7 @@ class RamLife extends StatelessWidget { final String routeName = (settings.name == null || !routes.containsKey(settings.name)) ? Routes.home : settings.name!; - return settings.name == Routes.login - ? RouteInitializer( - // If this page is Routes.login, don't set an error handler. - onError: null , - isAllowed: () => true, - child: routes [routeName]! (context), - ) - : RouteInitializer( - child: routes [routeName]! (context), - ); + return routes [routeName]! (context); }, ) ) diff --git a/lib/src/pages/feedback.dart b/lib/src/pages/feedback.dart index e9fe1a9cc..cfab488fa 100644 --- a/lib/src/pages/feedback.dart +++ b/lib/src/pages/feedback.dart @@ -8,6 +8,8 @@ import "drawer.dart"; /// A page to submit feedback. class FeedbackPage extends StatelessWidget { + const FeedbackPage(); + @override Widget build (BuildContext context) => ResponsiveScaffold( drawer: const NavigationDrawer(), diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index a1de56867..add897b45 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -24,7 +24,7 @@ class Login extends StatefulWidget { final String destination; /// Builds the login page - Login({this.destination = Routes.home}); + const Login({this.destination = Routes.home}); @override LoginState createState() => LoginState(); diff --git a/lib/src/pages/route_initializer.dart b/lib/src/pages/route_initializer.dart index d92e01517..0fe4e0703 100644 --- a/lib/src/pages/route_initializer.dart +++ b/lib/src/pages/route_initializer.dart @@ -57,7 +57,6 @@ class RouteInitializerState extends State { } if (Auth.isSignedIn && !Models.instance.isReady) { await Models.instance.init(); - } else { } } catch (error) { await Services.instance.crashlytics.log("Error. Disposing models"); diff --git a/lib/src/pages/sports.dart b/lib/src/pages/sports.dart index 87675fd8d..e274060de 100644 --- a/lib/src/pages/sports.dart +++ b/lib/src/pages/sports.dart @@ -243,6 +243,8 @@ void openMenu({ /// A page to show recent and upcoming games to the user. class SportsPage extends StatelessWidget { + const SportsPage(); + @override Widget build(BuildContext context) => DefaultTabController( length: 2, From 6277bced8bc3a77bbd338f67a8daaf3c7c331020 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 6 Apr 2021 00:16:51 -0400 Subject: [PATCH 113/251] Fixed broken SchedulePage controls --- lib/app.dart | 4 ++-- lib/src/models/view/schedule.dart | 3 ++- lib/src/pages/schedule.dart | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 1ec35381d..574582ec8 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -34,11 +34,11 @@ class RamLife extends StatelessWidget { ), Routes.calendar: (_) => RouteInitializer( isAllowed: () => hasAdminScope(Scope.calendar), - child: AdminCalendarPage(), + child: const AdminCalendarPage(), ), Routes.specials: (_) => RouteInitializer( isAllowed: () => hasAdminScope(Scope.calendar), - child: AdminSpecialsPage(), + child: const AdminSpecialsPage(), ), Routes.sports: (_) => const RouteInitializer( child: SportsPage(), diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index d7a34b785..cd0025895 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -32,6 +32,7 @@ class ScheduleModel with ChangeNotifier { /// If today is a school day, then use that. Otherwise, use the /// defaults (see [defaultSpecial]). ScheduleModel () : schedule = Models.instance.schedule { + print("New model"); defaultDay = Day( name: schedule.user.schedule.keys.first, special: defaultSpecial @@ -55,7 +56,7 @@ class ScheduleModel with ChangeNotifier { } day = selected; _selectedDay = justDate; - update (newName: selected.name, newSpecial: selected.special); + notifyListeners(); } /// Gets the date whose schedule the user is looking at diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index cb3beddcd..ae3205310 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -52,7 +52,7 @@ class ResponsiveSchedule extends NavigationItem { @override Widget build (BuildContext context) => ModelListener( - model: () => ScheduleModel(), + model: () => model, builder: (_, ScheduleModel model, __) => Column( children: [ ListTile ( From b61c53fc50190a8e62208d80fc61043928b9bf46 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 6 Apr 2021 00:40:31 -0400 Subject: [PATCH 114/251] Fixed null error in AdminCalendarPage --- lib/src/models/view/calendar_editor.dart | 48 +++++++++--------------- lib/src/services/cloud_db.dart | 3 +- 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/lib/src/models/view/calendar_editor.dart b/lib/src/models/view/calendar_editor.dart index 6d3f7ed0e..b80d2d10e 100644 --- a/lib/src/models/view/calendar_editor.dart +++ b/lib/src/models/view/calendar_editor.dart @@ -22,17 +22,15 @@ class CalendarEditor with ChangeNotifier { /// The current month. static final int currentMonth = now.month; - // The raw JSON-filled calendar. - // final List>> data = List.filled(12, null); - /// The calendar filled with [Day]s. + /// + /// Each month is lazy-loaded from the database, so it's null until selected. final List?> calendar = List.filled(12, null); - /// A list of callbacks on the Firebase streams. + /// A list of streams on the Firebase streams. + /// /// - /// This list is needed so that the model can cancel the listeners - /// when the user leaves the page. - final List subscriptions = []; + final List subscriptions = List.filled(12, null); /// The year of each month. /// @@ -53,33 +51,21 @@ class CalendarEditor with ChangeNotifier { /// days after the month until Saturday. They will be represented by blanks. final List?> paddings = List.filled(12, null); - /// Creates a data model to hold the calendar. - /// - /// Initializing a [CalendarEditor] automatically listens to the calendar in - /// Firebase. - CalendarEditor() { - for (int month = 0; month < 12; month++) { - subscriptions.add( - Services - .instance - .database - .cloudDatabase - .getCalendarStream(month + 1) - .listen( - (List?> cal) { - calendar [month] = Day.getMonth(cal); - calendar [month] = layoutMonth(month); - notifyListeners(); - } - ) - ); - } - } + void loadMonth(int month) => subscriptions.add( // 0-11 + Services.instance.database.cloudDatabase.getCalendarStream(month + 1) // 1-12 + .listen( + (List?> cal) { + calendar [month] = Day.getMonth(cal); + calendar [month] = layoutMonth(month); + notifyListeners(); + } + ) + ); @override void dispose() { - for (final StreamSubscription subscription in subscriptions) { - subscription.cancel(); + for (final StreamSubscription? subscription in subscriptions) { + subscription?.cancel(); } super.dispose(); } diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index 57dff7b7f..fc8d25d14 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -241,7 +241,8 @@ class CloudDatabase extends Database { calendarCollection.doc(month.toString()).snapshots().map( (DocumentSnapshot snapshot) => [ for (final dynamic entry in snapshot.data()! ["calendar"]) - Map.from(entry) + if (entry == null) null + else Map.from(entry) ] ); } From 922e09f1089eefca7431365e87c4092dc324d0e1 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 6 Apr 2021 11:06:26 -0400 Subject: [PATCH 115/251] Fixed AdminCalendarPage --- lib/src/models/view/builders/day_builder.dart | 37 +--- lib/src/models/view/calendar_editor.dart | 83 +++++---- lib/src/models/view/schedule.dart | 1 - lib/src/pages/admin/calendar.dart | 164 ++++++++++++------ lib/src/pages/builders/day_builder.dart | 26 ++- .../widgets/atomic/admin/calendar_tile.dart | 51 +++--- 6 files changed, 200 insertions(+), 162 deletions(-) diff --git a/lib/src/models/view/builders/day_builder.dart b/lib/src/models/view/builders/day_builder.dart index 8824936e2..3a6def5e0 100644 --- a/lib/src/models/view/builders/day_builder.dart +++ b/lib/src/models/view/builders/day_builder.dart @@ -6,30 +6,17 @@ import "package:ramaz/models.dart"; /// A view model for the creating a new [Day]. // ignore: prefer_mixin class DayBuilderModel with ChangeNotifier { - /// The admin creating this [Day]. - /// - /// This is used to create [userSpecials]. - final UserModel admin; + final DateTime date; bool _hasSchool; String? _name; Special? _special; /// Creates a view model for modifying a [Day]. - DayBuilderModel(Day? day) : - admin = Models.instance.user, + DayBuilderModel({required Day? day, required this.date}) : _name = day?.name, _special = day?.special, - _hasSchool = day == null - { - admin.addListener(notifyListeners); - } - - @override - void dispose() { - admin.removeListener(notifyListeners); - super.dispose(); - } + _hasSchool = day != null; /// The name for this day. String? get name => _name; @@ -45,16 +32,6 @@ class DayBuilderModel with ChangeNotifier { return; } _special = value; - if( - !presetSpecials.any( - (Special preset) => preset.name == value.name - ) && !userSpecials.any( - (Special preset) => preset.name == value.name - ) - ) { - admin.addSpecialToAdmin(value); - } - notifyListeners(); } @@ -68,14 +45,16 @@ class DayBuilderModel with ChangeNotifier { /// The day being created (in present state). /// /// The model uses [name] and [special]. - Day? get day => !hasSchool ? null : - Day(name: name ?? "", special: presetSpecials.first); + Day? get day => !hasSchool ? null : Day( + name: name ?? "", + special: special ?? presetSpecials.first, + ); /// The built-in specials. List get presetSpecials => Special.specials; /// Custom user-created specials. - List get userSpecials => admin.admin!.specials; + List get userSpecials => Models.instance.user.admin!.specials; /// Whether this day is ready to be created. bool get ready => name != null && special != null; diff --git a/lib/src/models/view/calendar_editor.dart b/lib/src/models/view/calendar_editor.dart index b80d2d10e..e37679d52 100644 --- a/lib/src/models/view/calendar_editor.dart +++ b/lib/src/models/view/calendar_editor.dart @@ -5,13 +5,19 @@ import "package:flutter/foundation.dart" show ChangeNotifier; import "package:ramaz/data.dart"; import "package:ramaz/services.dart"; +class CalendarDay { + final DateTime date; + Day? schoolDay; + CalendarDay({required this.date, required this.schoolDay}); +} + /// A model to manage the calendar. /// /// This model listens to the calendar and can modify it in the database. // ignore: prefer_mixin class CalendarEditor with ChangeNotifier { /// How many days there are in every month. - static const int daysInMonth = 7 * 5; + List daysInMonth = List.filled(12, null); /// The current date. static final DateTime now = DateTime.now(); @@ -25,11 +31,9 @@ class CalendarEditor with ChangeNotifier { /// The calendar filled with [Day]s. /// /// Each month is lazy-loaded from the database, so it's null until selected. - final List?> calendar = List.filled(12, null); + final List?> calendar = List.filled(12, null); /// A list of streams on the Firebase streams. - /// - /// final List subscriptions = List.filled(12, null); /// The year of each month. @@ -44,23 +48,14 @@ class CalendarEditor with ChangeNotifier { : month > 7 ? currentYear - 1 : currentYear ]; - /// A list of calendar paddings for each month. - /// - /// Every entry is a list of two numbers. The first one is the amount of days - /// from Sunday before the month starts, and the second one is the amount of - /// days after the month until Saturday. They will be represented by blanks. - final List?> paddings = List.filled(12, null); - - void loadMonth(int month) => subscriptions.add( // 0-11 - Services.instance.database.cloudDatabase.getCalendarStream(month + 1) // 1-12 - .listen( - (List?> cal) { - calendar [month] = Day.getMonth(cal); - calendar [month] = layoutMonth(month); - notifyListeners(); - } - ) - ); + void loadMonth(int month) => subscriptions [month] ??= Services + .instance.database.cloudDatabase.getCalendarStream(month + 1) + .listen( + (List?> cal) { + calendar [month] = layoutMonth(Day.getMonth(cal), month); + notifyListeners(); + } + ); @override void dispose() { @@ -70,30 +65,50 @@ class CalendarEditor with ChangeNotifier { super.dispose(); } - /// Fits the calendar to a 5-day week layout. + /// Fits the calendar to a 6-week layout. /// /// Adjusts the calendar so that it begins on the correct day of the week /// (starting on Sunday) instead of defaulting to the first open cell on /// the calendar grid. This function pads the calendar with the correct /// amount of empty days before and after the month. - List layoutMonth(int month) { - final List cal = calendar [month]!; - final int firstDayOfWeek = DateTime(years [month], month + 1, 1).weekday; - final int weekday = firstDayOfWeek == 7 ? 0 : firstDayOfWeek; - paddings [month] = [weekday, daysInMonth - (weekday + cal.length)]; - return cal; + List layoutMonth(List cal, int month) { + final int year = years [month]; + final int firstDayOfMonth = DateTime(year, month + 1, 1).weekday; + final int weekday = firstDayOfMonth == 7 ? 0 : firstDayOfMonth; + int weeks = 0; // the number of sundays (except for the first week) + if (firstDayOfMonth != 7) { // First week doesn't have a sunday + weeks++; + } + for (int date = 0; date < cal.length; date++) { + if (DateTime(year, month + 1, date + 1).weekday == 7) { // Sunday + weeks++; + } + } + final int leftPad = weekday; + final int rightPad = (weeks * 7) - (weekday + cal.length); + return [ + for (int _ = 0; _ < leftPad; _++) null, + for (int date = 0; date < cal.length; date++) CalendarDay( + date: DateTime(year, month + 1, date + 1), + schoolDay: cal [date], + ), + for (int _ = 0; _ < rightPad; _++) null, + ]; } /// Updates the calendar. - Future updateDay(DateTime date, Day? day) async { - if (day == null) { - return; - } - calendar [date.month - 1]! [date.day - 1] = day; + Future updateDay({required Day? day, required DateTime date}) async { + final int index = calendar [date.month - 1]! + .indexWhere((CalendarDay? day) => day != null); + calendar [date.month - 1]! [index + date.day - 1]!.schoolDay = day; await Services.instance.database.setCalendar( date.month, { - "calendar": Day.monthToJson(calendar [date.month - 1]!), + "calendar": Day.monthToJson([ + for (final CalendarDay? day in calendar [date.month - 1]!) + if (day != null) + day.schoolDay, + ]), "month": date.month } ); diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index cd0025895..0f407851d 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -32,7 +32,6 @@ class ScheduleModel with ChangeNotifier { /// If today is a school day, then use that. Otherwise, use the /// defaults (see [defaultSpecial]). ScheduleModel () : schedule = Models.instance.schedule { - print("New model"); defaultDay = Day( name: schedule.user.schedule.keys.first, special: defaultSpecial diff --git a/lib/src/pages/admin/calendar.dart b/lib/src/pages/admin/calendar.dart index ca0d639e9..a695dfe5b 100644 --- a/lib/src/pages/admin/calendar.dart +++ b/lib/src/pages/admin/calendar.dart @@ -54,7 +54,14 @@ class OldCalendarWidget extends StatelessWidget { } /// A page for admins to modify the calendar in the database. -class AdminCalendarPage extends StatelessWidget { +class AdminCalendarPage extends StatefulWidget { + const AdminCalendarPage(); + + @override + AdminCalendarState createState() => AdminCalendarState(); +} + +class AdminCalendarState extends State { /// The months of the year. /// /// These will be the headers of all the months. @@ -71,66 +78,115 @@ class AdminCalendarPage extends StatelessWidget { "Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat" ]; - /// Creates a page for admins to modify the calendar. - const AdminCalendarPage(); + final CalendarEditor model = CalendarEditor(); + + void listener() => setState(() {}); + + @override + void initState() { + super.initState(); + model + ..addListener(listener) + ..loadMonth(_currentMonth); + } + + @override + void dispose() { + model + ..removeListener(listener) + ..dispose(); + super.dispose(); + } + + int _currentMonth = DateTime.now().month - 1; + int get currentMonth => _currentMonth; + set currentMonth(int value) { + _currentMonth = loopMonth(value); + model.loadMonth(_currentMonth); // will update later + setState(() {}); + } + + int loopMonth(int val) { + if (val == 12) { + return 0; + } else if (val == -1) { + return 11; + } else { + return val; + } + } @override Widget build(BuildContext context) => ResponsiveScaffold( drawer: const NavigationDrawer(), appBar: AppBar(title: const Text("Calendar")), - bodyBuilder: (_) => SingleChildScrollView( - padding: const EdgeInsets.symmetric(horizontal: 5), - child: ModelListener( - model: () => CalendarEditor(), - builder: (_, CalendarEditor model, __) => ExpansionPanelList.radio( - children: [ - for (int month = 0; month < 12; month++) - ExpansionPanelRadio( - value: month, - canTapOnHeader: true, - headerBuilder: (_, __) => ListTile( - title: Text(months [month]), - trailing: Text(model.years [month].toString()) - ), - body: model.calendar [month] == null - ? const CircularProgressIndicator() - : SizedBox( - height: 400, - child: GridView.count( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - crossAxisCount: 7, - children: [ - for (final String weekday in weekdays) - Center(child: Text (weekday)), - for (int _ = 0; _ < (model.paddings [month] ?? [0]) [0]; _++) - CalendarTile.blank, - for ( - final MapEntry entry in - // ExpansionPanelRadio.body checks for nulls - model.calendar [month]!.asMap().entries - ) GestureDetector( - onTap: () async => model.updateDay( - DateTime(model.years [month], month + 1, entry.key + 1), - await DayBuilder.getDay( - context: context, - date: DateTime(model.years [month], month + 1, entry.key + 1), - day: entry.value, - ) + bodyBuilder: (_) => Center( + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(height: 24), + Row( + children: [ + const Spacer(flex: 3), + TextButton.icon( + icon: const Icon(Icons.arrow_back), + onPressed: () => currentMonth--, + label: Text(months [loopMonth(currentMonth - 1)]), + ), + const Spacer(flex: 2), + Text( + "${months [currentMonth]} ${model.years [currentMonth]}", + style: Theme.of(context).textTheme.headline4, + ), + const Spacer(flex: 2), + TextButton.icon( + // icon always goes to the left of the label + // since they're both widgets, we can swap them + label: const Icon(Icons.arrow_forward), + icon: Text(months [loopMonth(currentMonth + 1)]), + onPressed: () => currentMonth++, + ), + const Spacer(flex: 3), + ] + ), + const SizedBox(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + for (final String weekday in weekdays) + Text(weekday), + ] + ), + Flexible( + child: model.calendar [currentMonth] == null + ? const Center(child: CircularProgressIndicator()) + : GridView.count( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8), + shrinkWrap: true, + childAspectRatio: 1.25, + crossAxisCount: 7, + children: [ + for (final CalendarDay? day in model.calendar [currentMonth]!) + if (day == null) CalendarTile.blank + else GestureDetector( + onTap: () => showDialog( + context: context, + builder: (_) => DayBuilder( + day: day.schoolDay, + date: day.date, + upload: (Day? value) => model.updateDay( + day: value, + date: day.date ), - child: CalendarTile( - date: entry.key, - day: entry.value, - ) - ), - for (int _ = 0; _ < (model.paddings [month] ?? [0]) [1]; _++) - CalendarTile.blank, - ] + ) + ), + child: CalendarTile(day: day.schoolDay, date: day.date), ) - ) - ) - ] - ) + ] + ), + ) + ] ) ) ); diff --git a/lib/src/pages/builders/day_builder.dart b/lib/src/pages/builders/day_builder.dart index 4f30a5e94..e314ff208 100644 --- a/lib/src/pages/builders/day_builder.dart +++ b/lib/src/pages/builders/day_builder.dart @@ -13,31 +13,23 @@ import "package:ramaz/widgets.dart"; /// [DayBuilderModel.special], are set to `day.name` ([Day.name]) and /// `day.special` ([Day.special]), respectively. class DayBuilder extends StatelessWidget { - /// Returns the [Day] created by this widget. - static Future getDay({ - required BuildContext context, - required DateTime date, - @required Day? day, - }) => showDialog( - context: context, - builder: (_) => DayBuilder(date: date, day: day), - ); - - /// The date to modify. final DateTime date; /// The day to edit, if it already exists. final Day? day; + final Future Function(Day?) upload; + /// Creates a widget to guide the user in creating a [Day] const DayBuilder({ - required this.date, - this.day, + required this.day, + required this.date, + required this.upload }); @override Widget build(BuildContext context) => ModelListener( - model: () => DayBuilderModel(day), + model: () => DayBuilderModel(day: day, date: date), // ignore: sort_child_properties_last child: TextButton( onPressed: () => Navigator.of(context).pop(), @@ -110,8 +102,10 @@ class DayBuilder extends StatelessWidget { actions: [ cancel!, ElevatedButton( - onPressed: !model.ready ? null : () => - Navigator.of(context).pop(model.day), + onPressed: !model.ready ? null : () async { + await upload(model.day); + Navigator.of(context).pop(); + }, child: const Text("Save", style: TextStyle(color: Colors.white)), ) ] diff --git a/lib/src/widgets/atomic/admin/calendar_tile.dart b/lib/src/widgets/atomic/admin/calendar_tile.dart index da50cb5e8..4c47b42a2 100644 --- a/lib/src/widgets/atomic/admin/calendar_tile.dart +++ b/lib/src/widgets/atomic/admin/calendar_tile.dart @@ -10,44 +10,39 @@ class CalendarTile extends StatelessWidget{ /// A blank calendar tile. /// /// This should not be wrapped in a [GestureDetector]. - static const CalendarTile blank = CalendarTile(date: null, day: null); + static const CalendarTile blank = CalendarTile(day: null, date: null); - /// The date for this tile. - final int? date; - /// The [Day] represented by this tile. final Day? day; + final DateTime? date; + /// Creates a widget to update a day in the calendar - const CalendarTile({this.date, this.day}); + const CalendarTile({required this.day, required this.date}); @override Widget build(BuildContext context) => Container( decoration: BoxDecoration(border: Border.all()), - child: Stack ( - children: [ - if (date != null) ...[ - Align ( - alignment: Alignment.topLeft, - child: Text ((date! + 1).toString()), - ), - if (day != null) - Center ( - child: Text ( - day!.name, - textScaleFactor: 1.5 - ), + child: date == null ? Container() : LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + final double textSize = constraints.biggest.width > 120 ? 1.5 : 1; + return Column( + children: [ + Align ( + alignment: Alignment.topLeft, + child: Text (date!.day.toString(), textScaleFactor: 1), ), - if ( - day != null && - ![Special.rotate.name, Special.regular.name] - .contains(day!.special.name) - ) const Align( - alignment: Alignment.bottomCenter, - child: Text ("•", textScaleFactor: 0.8), - ) - ] - ] + const Spacer(), + if (day == null) + Expanded(child: Text("No school", textScaleFactor: textSize)) + else ...[ + Expanded(child: Text (day!.name, textScaleFactor: textSize)), + Expanded(child: Text (day!.special.name, textScaleFactor: 0.8)), + ], + const Spacer(), + ] + ); + } ) ); } From f9722f291b2ddbd8a9dc41d433a095a1fbf105b4 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 6 Apr 2021 12:41:45 -0400 Subject: [PATCH 116/251] Fixed bug with BrightnessChanger --- lib/src/pages/drawer.dart | 3 +- lib/src/pages/login.dart | 2 +- .../widgets/ambient/brightness_changer.dart | 86 ++++++++++--------- 3 files changed, 47 insertions(+), 44 deletions(-) diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index f73c74787..b63f990d8 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -4,7 +4,6 @@ import "package:flutter/material.dart"; import "package:ramaz/data.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/models.dart"; -import "package:ramaz/services.dart"; import "package:ramaz/widgets.dart"; /// A drawer to show throughout the app. @@ -87,7 +86,7 @@ class NavigationDrawer extends StatelessWidget { ) ] ), - BrightnessChanger.dropdown(prefs: Services.instance.prefs), + BrightnessChanger.dropdown(), ListTile ( title: const Text ("Logout"), leading: Icon (Icons.lock), diff --git a/lib/src/pages/login.dart b/lib/src/pages/login.dart index add897b45..8e2f49eaf 100644 --- a/lib/src/pages/login.dart +++ b/lib/src/pages/login.dart @@ -51,7 +51,7 @@ class LoginState extends State { appBar: AppBar ( title: const Text ("Login"), actions: [ - BrightnessChanger.iconButton(prefs: Services.instance.prefs), + BrightnessChanger.iconButton(), ], ), body: Center( diff --git a/lib/src/widgets/ambient/brightness_changer.dart b/lib/src/widgets/ambient/brightness_changer.dart index d59438dd3..c9975d240 100644 --- a/lib/src/widgets/ambient/brightness_changer.dart +++ b/lib/src/widgets/ambient/brightness_changer.dart @@ -4,6 +4,15 @@ import "package:ramaz/services.dart"; import "theme_changer.dart" show ThemeChanger; +/// Returns a custom value if [value] is null, true, or false. +T caseConverter({ + required bool? value, + required T onNull, + required T onTrue, + required T onFalse, +}) => value == null ? onNull + : value ? onTrue : onFalse; + /// The form the [BrightnessChanger] widget should take. enum BrightnessChangerForm { /// The widget should appear as a toggle button. @@ -14,51 +23,41 @@ enum BrightnessChangerForm { } /// A widget to toggle the app between light mode and dark mode. -class BrightnessChanger extends StatelessWidget { - /// Returns a custom value if [value] is null, true, or false. - static T caseConverter({ - required bool? value, - required T onNull, - required T onTrue, - required T onFalse, - }) => value == null ? onNull - : value ? onTrue : onFalse; - - /// The service to retrieve the user's preferences. - /// - /// This is used to save the brightness on next launch. - final Preferences prefs; - +class BrightnessChanger extends StatefulWidget { /// The form this widget should take. final BrightnessChangerForm form; - /// The icon for this widget. - final Icon icon; - /// Creates a widget to toggle the app brightness. - /// - /// This constructor determines the icon. - BrightnessChanger({required this.prefs, required this.form}) : - icon = Icon ( - caseConverter( - value: prefs.brightness, - onNull: Icons.brightness_auto, - onTrue: Icons.brightness_high, - onFalse: Icons.brightness_low, - ) - ); + const BrightnessChanger({required this.form}); /// Creates a [BrightnessChanger] as a toggle button. - factory BrightnessChanger.iconButton({required Preferences prefs}) => - BrightnessChanger(prefs: prefs, form: BrightnessChangerForm.button); + factory BrightnessChanger.iconButton() => + const BrightnessChanger(form: BrightnessChangerForm.button); /// Creates a [BrightnessChanger] as a drop-down menu. - factory BrightnessChanger.dropdown({required Preferences prefs}) => - BrightnessChanger(prefs: prefs, form: BrightnessChangerForm.dropdown); + factory BrightnessChanger.dropdown() => + const BrightnessChanger(form: BrightnessChangerForm.dropdown); + + @override + BrightnessChangerState createState() => BrightnessChangerState(); +} + +class BrightnessChangerState extends State { + bool? _brightness; + + /// The icon for this widget. + Icon get icon => Icon ( + caseConverter( + value: _brightness, + onNull: Icons.brightness_auto, + onTrue: Icons.brightness_high, + onFalse: Icons.brightness_low, + ) + ); @override Widget build (BuildContext context) { - switch (form) { + switch (widget.form) { case BrightnessChangerForm.button: return IconButton( icon: icon, onPressed: () => buttonToggle(context), @@ -66,19 +65,23 @@ class BrightnessChanger extends StatelessWidget { case BrightnessChangerForm.dropdown: return ListTile( title: const Text ("Theme"), leading: icon, - trailing: DropdownButton( + trailing: DropdownButton( onChanged: (bool? value) => setBrightness(context, value: value), - value: prefs.brightness, + value: _brightness, + // Workaround until https://github.com/flutter/flutter/pull/77666 is released + // DropdownButton with null value don't display the menu item. + // Using a hint works too + hint: const Text("Auto"), items: const [ - DropdownMenuItem ( + DropdownMenuItem ( value: null, child: Text ("Auto") ), - DropdownMenuItem ( + DropdownMenuItem ( value: true, child: Text ("Light") ), - DropdownMenuItem ( + DropdownMenuItem ( value: false, child: Text ("Dark"), ), @@ -96,7 +99,7 @@ class BrightnessChanger extends StatelessWidget { void buttonToggle(BuildContext context) => setBrightness( context, value: caseConverter( - value: prefs.brightness, + value: _brightness, onTrue: false, onFalse: null, onNull: true, @@ -113,6 +116,7 @@ class BrightnessChanger extends StatelessWidget { onFalse: Brightness.dark, onNull: MediaQuery.of(context).platformBrightness, ); - prefs.brightness = value; + Services.instance.prefs.brightness = value; + setState(() => _brightness = value); } } From 3484f6d9a50a8bc1b547ff4c57d2b189df40c01e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 9 Apr 2021 02:37:18 -0400 Subject: [PATCH 117/251] Cleaned up Firebase tooling --- firebase/firestore/lib/src/data/schedule.dart | 2 +- firebase/firestore/lib/src/faculty/logic.dart | 2 +- .../firestore/lib/src/sections/logic.dart | 7 ++-- .../firestore/lib/src/sections/reader.dart | 35 ++++++++++--------- .../firestore/lib/src/students/logic.dart | 10 ++++-- firebase/firestore/node/faculty.dart | 2 +- firebase/firestore/node/sections.dart | 8 ++++- 7 files changed, 41 insertions(+), 25 deletions(-) diff --git a/firebase/firestore/lib/src/data/schedule.dart b/firebase/firestore/lib/src/data/schedule.dart index 0077f0107..84e58236c 100644 --- a/firebase/firestore/lib/src/data/schedule.dart +++ b/firebase/firestore/lib/src/data/schedule.dart @@ -40,7 +40,7 @@ class Section extends Serializable { /// The section ID for this class final String id; - /// The teacher for this section. + /// The full name of the teacher for this section. final String teacher; /// Creates a section. diff --git a/firebase/firestore/lib/src/faculty/logic.dart b/firebase/firestore/lib/src/faculty/logic.dart index 20501ac06..6c3009127 100644 --- a/firebase/firestore/lib/src/faculty/logic.dart +++ b/firebase/firestore/lib/src/faculty/logic.dart @@ -18,7 +18,7 @@ class FacultyLogic { /// This function works by taking several arguments: /// /// - faculty, from [FacultyReader.getFaculty] - /// - sectionTeachers, from [SectionReader.getSectionTeachers] with `id: true` + /// - sectionTeachers, from [SectionReader.getSectionFacultyIds] /// /// These are kept as parameters instead of calling the functions by itself /// in order to keep the data and logic layers separate. diff --git a/firebase/firestore/lib/src/sections/logic.dart b/firebase/firestore/lib/src/sections/logic.dart index 453c67d5a..4d1966b24 100644 --- a/firebase/firestore/lib/src/sections/logic.dart +++ b/firebase/firestore/lib/src/sections/logic.dart @@ -1,5 +1,6 @@ import "package:firestore/data.dart"; +import "package:firestore/faculty.dart"; import "reader.dart"; // for doc comments /// A collection of functions to index course data. @@ -19,19 +20,21 @@ class SectionLogic { /// This function works by taking several arguments: /// /// - courseNames, from [SectionReader.courseNames] - /// - sectionTeachers, from [SectionReader.getSectionTeachers] (`id: false`) + /// - sectionTeachers, from [SectionReader.getSectionFacultyIds] + /// - facultyNames, from [FacultyReader.getFaculty] /// /// These are kept as parameters instead of calling the functions by itself /// in order to keep the data and logic layers separate. static List
getSections({ @required Map courseNames, @required Map sectionTeachers, + @required Map facultyNames, }) => [ for (final MapEntry entry in sectionTeachers.entries) Section( id: entry.key, name: courseNames [getCourseId(entry.key)], - teacher: entry.value, + teacher: facultyNames [entry.value].name, ) ]; } diff --git a/firebase/firestore/lib/src/sections/reader.dart b/firebase/firestore/lib/src/sections/reader.dart index e4e50f5b4..305da90bd 100644 --- a/firebase/firestore/lib/src/sections/reader.dart +++ b/firebase/firestore/lib/src/sections/reader.dart @@ -13,21 +13,22 @@ class SectionReader { row ["ID"]: row ["FULL_NAME"] }; - /// Maps section IDs to their respective teachers. - /// - /// If [id] is true, the values are the faculty IDs. Otherwise, the values are - /// the teachers' full names. - static Future> getSectionTeachers({ - bool id = false - }) async { - final Map result = {}; - await for(final Map row in csvReader(DataFiles.section)) { - final String teacher = row [id ? "FACULTY_ID" : "FACULTY_FULL_NAME"]; - if (row ["SCHOOL_ID"] != "Upper" || teacher.isEmpty) { - continue; - } - result [row ["SECTION_ID"]] = teacher; - } - return result; - } + /// Maps section IDs to their respective faculty IDs. + // static Future> getSectionFacultyIds() async { + // final Map result = {}; + // await for(final Map row in csvReader(DataFiles.section)) { + // final String teacher = row ["FACULTY_ID"]; + // if (row ["SCHOOL_ID"] != "Upper" || teacher.isEmpty) { + // continue; + // } + // result [row ["SECTION_ID"]] = teacher; + // } + // return result; + // } + + static Future> getSectionFacultyIds() async => { + await for (final Map row in csvReader(DataFiles.section)) + if (row ["SCHOOL_ID"] == "Upper" && row ["FACULTY_ID"].isNotEmpty) + row ["SECTION_ID"]: row ["FACULTY_ID"], + }; } diff --git a/firebase/firestore/lib/src/students/logic.dart b/firebase/firestore/lib/src/students/logic.dart index ad7fd3156..5d9e2d13a 100644 --- a/firebase/firestore/lib/src/students/logic.dart +++ b/firebase/firestore/lib/src/students/logic.dart @@ -63,11 +63,17 @@ class StudentLogic { continue; } + final Semesters semestersForCourse = semesters [sectionId]; + if (semestersForCourse == null) { + Logger.error( + "Section $sectionId was in schedule.csv but not in sections.csv" + ); + } if ( semesters != null && !(isSemester1 - ? semesters [sectionId].semester1 - : semesters [sectionId].semester2 + ? semestersForCourse.semester1 + : semestersForCourse.semester2 ) ) { continue; diff --git a/firebase/firestore/node/faculty.dart b/firebase/firestore/node/faculty.dart index 02b8dfff3..540ed7d55 100644 --- a/firebase/firestore/node/faculty.dart +++ b/firebase/firestore/node/faculty.dart @@ -15,7 +15,7 @@ Future main() async { ); final Map sectionTeachers = await Logger.logValue( - "section teachers", () => SectionReader.getSectionTeachers(id: true) + "section teachers", SectionReader.getSectionFacultyIds, ); final Map> facultySections = await Logger.logValue( diff --git a/firebase/firestore/node/sections.dart b/firebase/firestore/node/sections.dart index ae924eeb5..38476d37d 100644 --- a/firebase/firestore/node/sections.dart +++ b/firebase/firestore/node/sections.dart @@ -1,6 +1,7 @@ // @dart=2.9 import "package:firestore/data.dart"; +import "package:firestore/faculty.dart"; import "package:firestore/helpers.dart"; import "package:firestore/sections.dart"; import "package:firestore/services.dart"; @@ -13,13 +14,18 @@ Future main() async { ); final Map sectionTeachers = await Logger.logValue( - "section teachers", SectionReader.getSectionTeachers + "section teachers", SectionReader.getSectionFacultyIds + ); + + final Map facultyNames = await Logger.logValue( + "faculty names", FacultyReader.getFaculty, ); final List
sections = await Logger.logValue( "sections list", () => SectionLogic.getSections( courseNames: courseNames, sectionTeachers: sectionTeachers, + facultyNames: facultyNames, ) ); From cd6865ca1856a2f43038b0875651ad1628da132d Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 11 Apr 2021 18:41:24 -0400 Subject: [PATCH 118/251] Fixed small bugs for launch --- lib/src/data/schedule/special.dart | 88 +++++++++++++++--------------- lib/src/data/user.dart | 3 +- lib/src/models/data/schedule.dart | 3 +- 3 files changed, 46 insertions(+), 48 deletions(-) diff --git a/lib/src/data/schedule/special.dart b/lib/src/data/schedule/special.dart index 3a914ea5b..eadd808a8 100644 --- a/lib/src/data/schedule/special.dart +++ b/lib/src/data/schedule/special.dart @@ -322,49 +322,49 @@ class Special { mincha: 9 ); - /// The [Special] for Mondays and Thursdays. - static const Special regular = Special ( - "M or R day", - [ - Range(Time(8, 00), Time(8, 50)), - Range(Time(8, 55), Time(9, 35)), - Range(Time(9, 40), Time(10, 20)), - Range(Time(10, 20), Time(10, 35)), - Range(Time(10, 35), Time(11, 15)), - Range(Time(11, 20), Time(12, 00)), - Range(Time(12, 05), Time(12, 45)), - Range(Time(12, 50), Time(13, 30)), - Range(Time(13, 35), Time(14, 15)), - Range(Time(14, 20), Time(15, 00)), - Range(Time(15, 00), Time(15, 20)), - Range(Time(15, 20), Time(16, 00)), - Range(Time(16, 05), Time(16, 45)), - ], - homeroom: 3, - mincha: 10 - ); + // /// The [Special] for Mondays and Thursdays. + // static const Special regular = Special ( + // "M or R day", + // [ + // Range(Time(8, 00), Time(8, 50)), + // Range(Time(8, 55), Time(9, 35)), + // Range(Time(9, 40), Time(10, 20)), + // Range(Time(10, 20), Time(10, 35)), + // Range(Time(10, 35), Time(11, 15)), + // Range(Time(11, 20), Time(12, 00)), + // Range(Time(12, 05), Time(12, 45)), + // Range(Time(12, 50), Time(13, 30)), + // Range(Time(13, 35), Time(14, 15)), + // Range(Time(14, 20), Time(15, 00)), + // Range(Time(15, 00), Time(15, 20)), + // Range(Time(15, 20), Time(16, 00)), + // Range(Time(16, 05), Time(16, 45)), + // ], + // homeroom: 3, + // mincha: 10 + // ); - /// The [Special] for Tuesday and Wednesday (letters A, B, and C) - static const Special rotate = Special ( - "A, B, or C day", - [ - Range(Time(8, 00), Time(8, 45)), - Range(Time(8, 50), Time(9, 30)), - Range(Time(9, 35), Time(10, 15)), - Range(Time(10, 15), Time(10, 35)), - Range(Time(10, 35), Time(11, 15)), - Range(Time(11, 20), Time(12, 00)), - Range(Time(12, 05), Time(12, 45)), - Range(Time(12, 50), Time(13, 30)), - Range(Time(13, 35), Time(14, 15)), - Range(Time(14, 20), Time(15, 00)), - Range(Time(15, 00), Time(15, 20)), - Range(Time(15, 20), Time(16, 00)), - Range(Time(16, 05), Time(16, 45)), - ], - homeroom: 3, - mincha: 10 - ); + // /// The [Special] for Tuesday and Wednesday (letters A, B, and C) + // static const Special rotate = Special ( + // "A, B, or C day", + // [ + // Range(Time(8, 00), Time(8, 45)), + // Range(Time(8, 50), Time(9, 30)), + // Range(Time(9, 35), Time(10, 15)), + // Range(Time(10, 15), Time(10, 35)), + // Range(Time(10, 35), Time(11, 15)), + // Range(Time(11, 20), Time(12, 00)), + // Range(Time(12, 05), Time(12, 45)), + // Range(Time(12, 50), Time(13, 30)), + // Range(Time(13, 35), Time(14, 15)), + // Range(Time(14, 20), Time(15, 00)), + // Range(Time(15, 00), Time(15, 20)), + // Range(Time(15, 20), Time(16, 00)), + // Range(Time(16, 05), Time(16, 45)), + // ], + // homeroom: 3, + // mincha: 10 + // ); /// The [Special] for an early dismissal. static const Special early = Special ( @@ -392,7 +392,7 @@ class Special { /// /// Used in the UI static const List specials = [ - regular, + // regular, roshChodesh, fastDay, friday, @@ -401,7 +401,7 @@ class Special { winterFridayRoshChodesh, amAssembly, pmAssembly, - rotate, + // rotate, early, covid, ]; diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index 974e0ac24..f833d2b5d 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -96,7 +96,6 @@ class User { /// Creates a new user from JSON. User.fromJson(Map json) : - // dayNames = List.from(json ["dayNames"]), dayNames = List.from(safeJson(json, "dayNames")), schedule = { for (final String dayName in safeJson(json, "dayNames")) @@ -108,7 +107,7 @@ class User { contactInfo = ContactInfo.fromJson( Map.from(safeJson(json, "contactInfo")) ), - grade = intToGrade [safeJson(json, "grade")], + grade = json ["grade"] == null ? null : intToGrade [safeJson(json, "grade")], registeredClubs = List.from(json ["registeredClubs"] ?? []); /// Gets the unique section IDs for the courses this user is enrolled in. diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index f1278d97f..ce59c158b 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -112,8 +112,7 @@ class Schedule extends Model { /// Updates the current period. void onNewPeriod({bool first = false}) { - // final DateTime newDate = DateTime.now(); - final DateTime newDate = DateTime(2021, 03, 27); + final DateTime newDate = DateTime.now(); // Day changed. Probably midnight. if (newDate.day != now.day) { From 09f4e3c766198bd66e246a72f2a0cd87625f8049 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 11 Apr 2021 18:42:03 -0400 Subject: [PATCH 119/251] Made Database update Sports and calendar more frequently --- lib/src/services/databases.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart index 75c65f906..97a35efd5 100644 --- a/lib/src/services/databases.dart +++ b/lib/src/services/databases.dart @@ -23,6 +23,13 @@ class Databases extends Database { Future init() async { await cloudDatabase.init(); await localDatabase.init(); + + // Download this month's calendar, in case it changed + final int month = DateTime.now().month; + await localDatabase.setCalendar( + month, + await cloudDatabase.getCalendarMonth(month) + ); } /// Downloads all the data and saves it to the local database. @@ -33,6 +40,7 @@ class Databases extends Database { await localDatabase.setUser(await cloudDatabase.user); await updateCalendar(); + await updateSports(); final List> cloudReminders = await cloudDatabase.reminders; From e3cf8988b9b13edb91bb0015c9c05abd1fa30b66 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 11 Apr 2021 18:43:21 -0400 Subject: [PATCH 120/251] Don't make SchedulePage dispose itself --- lib/src/pages/schedule.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index ae3205310..5466449eb 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -53,6 +53,7 @@ class ResponsiveSchedule extends NavigationItem { @override Widget build (BuildContext context) => ModelListener( model: () => model, + dispose: false, builder: (_, ScheduleModel model, __) => Column( children: [ ListTile ( From 507140d5882db7a6adece9a65b77347300723c73 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 11 Apr 2021 18:43:42 -0400 Subject: [PATCH 121/251] Fixed small layout issue with ResponsiveScaffold drawers --- lib/src/widgets/responsive_scaffold/scaffold.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/src/widgets/responsive_scaffold/scaffold.dart b/lib/src/widgets/responsive_scaffold/scaffold.dart index 13643767b..da57274f2 100644 --- a/lib/src/widgets/responsive_scaffold/scaffold.dart +++ b/lib/src/widgets/responsive_scaffold/scaffold.dart @@ -111,8 +111,8 @@ class ResponsiveScaffold extends StatelessWidget { builder: (BuildContext context, LayoutInfo info, Widget? child) => Scaffold( appBar: appBar, drawer: info.hasStandardDrawer ? null - : hasNavBar ? secondaryDrawer : drawer, - endDrawer: info.hasStandardSideSheet ? null : sideSheet, + : Drawer(child: hasNavBar ? secondaryDrawer : drawer), + endDrawer: info.hasStandardSideSheet ? null : Drawer(child: sideSheet), floatingActionButton: floatingActionButton, floatingActionButtonLocation: floatingActionButtonLocation, bottomNavigationBar: !hasNavBar || !info.hasBottomNavBar @@ -139,10 +139,13 @@ class ResponsiveScaffold extends StatelessWidget { ) else if (info.hasStandardDrawer) drawer, Expanded(child: child!), - if (sideSheet != null && info.hasStandardSideSheet) SizedBox( - width: 320, - child: sideSheet, - ) + if (sideSheet != null && info.hasStandardSideSheet) ...[ + const VerticalDivider(), + SizedBox( + width: 320, + child: Drawer(elevation: 0, child: sideSheet), + ) + ] ] ) ), From ca1475b0eff3771bec90d01d64c70f84ba76389e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 11 Apr 2021 22:27:24 -0400 Subject: [PATCH 122/251] Disabled Sports for now --- lib/src/services/databases.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart index 97a35efd5..214251fd9 100644 --- a/lib/src/services/databases.dart +++ b/lib/src/services/databases.dart @@ -40,7 +40,7 @@ class Databases extends Database { await localDatabase.setUser(await cloudDatabase.user); await updateCalendar(); - await updateSports(); + // await updateSports(); final List> cloudReminders = await cloudDatabase.reminders; From e42c01eb67979390cce735792b60a8ad6bf42cda Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 12 Apr 2021 11:44:50 -0400 Subject: [PATCH 123/251] Migrated data library from Special -> Schedule --- lib/data.dart | 4 +- lib/src/data/admin.dart | 18 +- lib/src/data/schedule/activity.dart | 37 ++- lib/src/data/schedule/day.dart | 115 +++----- lib/src/data/schedule/period.dart | 76 +++-- lib/src/data/schedule/schedule.dart | 270 ++++++++++++++++++ lib/src/data/schedule/special.dart | 414 ---------------------------- lib/src/data/user.dart | 41 +-- 8 files changed, 402 insertions(+), 573 deletions(-) create mode 100644 lib/src/data/schedule/schedule.dart delete mode 100644 lib/src/data/schedule/special.dart diff --git a/lib/data.dart b/lib/data.dart index 997c05ed3..232b84a75 100644 --- a/lib/data.dart +++ b/lib/data.dart @@ -8,8 +8,6 @@ /// other app should be implemented in this library. library data; -export "src/data/admin.dart"; - // The clubs feature export "src/data/clubs/club.dart"; export "src/data/clubs/message.dart"; @@ -22,7 +20,7 @@ export "src/data/schedule/activity.dart"; export "src/data/schedule/advisory.dart"; export "src/data/schedule/day.dart"; export "src/data/schedule/period.dart"; -export "src/data/schedule/special.dart"; +export "src/data/schedule/schedule.dart"; export "src/data/schedule/subject.dart"; export "src/data/schedule/time.dart"; diff --git a/lib/src/data/admin.dart b/lib/src/data/admin.dart index 44baad54c..18bb0e89c 100644 --- a/lib/src/data/admin.dart +++ b/lib/src/data/admin.dart @@ -1,7 +1,5 @@ import "package:meta/meta.dart"; -import "schedule/special.dart"; - /// Scopes for administrative privileges. /// /// [Admin] users use these scopes ([Admin.scopes]) to determine what they can @@ -40,11 +38,6 @@ class Admin { /// A list of scopes available to this user. final List scopes; - /// A list of custom-made [Special]s by this admin. - /// - /// These can be saved so the admin does not have to recreate them. - final List specials; - /// This user's email. /// /// This is needed here so it can be indexed in a database. @@ -53,7 +46,6 @@ class Admin { /// Creates a user with administrative privileges. const Admin ({ required this.scopes, - required this.specials, required this.email, }); @@ -64,18 +56,10 @@ class Admin { if (stringToScope.containsKey(scope)) stringToScope [scope]! ], - email = json ["email"], - specials = [ - for (dynamic special in json ["specials"] ?? []) - Special.fromJson (Map.from(special)) - ]; + email = json ["email"]; /// Converts an admin to JSON form. Map toJson() => { - "specials": [ - for (final Special special in specials) - special.toJson(), - ], "email": email, }; } diff --git a/lib/src/data/schedule/activity.dart b/lib/src/data/schedule/activity.dart index 5f659d24d..1d2609a4a 100644 --- a/lib/src/data/schedule/activity.dart +++ b/lib/src/data/schedule/activity.dart @@ -62,6 +62,28 @@ enum ActivityType { misc, } +/// Maps JSON string values to [ActivityType]s. +ActivityType parseActivityType(String type) { + switch (type) { + case "advisory": return ActivityType.advisory; + case "room": return ActivityType.room; + case "grade": return ActivityType.grade; + case "misc": return ActivityType.misc; + default: throw ArgumentError("Invalid activity type: $type"); + } +} + +/// Maps [ActivityType] values to their string counterparts. +String activityTypeToString(ActivityType type) { + switch (type) { + case ActivityType.advisory: return "advisory"; + case ActivityType.room: return "room"; + case ActivityType.grade: return "grade"; + case ActivityType.misc: return "misc"; + } +} + + /// An activity during a period. /// /// Students can either be directed to their advisories or to a certain room. @@ -81,14 +103,6 @@ class Activity { return result; } - /// Maps JSON string values to [ActivityType]s. - static const Map stringToActivityType = { - "advisory": ActivityType.advisory, - "room": ActivityType.room, - "grade": ActivityType.grade, - "misc": ActivityType.misc, - }; - /// The type of this activity. final ActivityType type; @@ -115,10 +129,15 @@ class Activity { GradeActivity.fromJson(Map.from(json ["message"])) ) : Activity( - type: stringToActivityType[json ["type"]!]!, + type: parseActivityType(json ["type"]), message: json ["message"] ); + Map toJson() => { + "message": message, + "type": activityTypeToString(type), + }; + @override String toString() { switch (type) { diff --git a/lib/src/data/schedule/day.dart b/lib/src/data/schedule/day.dart index 97d133185..e49cd6afd 100644 --- a/lib/src/data/schedule/day.dart +++ b/lib/src/data/schedule/day.dart @@ -1,43 +1,25 @@ -import "dart:convert"; - import "package:meta/meta.dart"; -import "special.dart"; +import "schedule.dart"; import "time.dart"; /// A day at Ramaz. /// -/// Each day has a [name] and [special] property. +/// Each day has a [name] and [schedule] property. /// The [name] property decides which schedule to show, -/// while the [special] property decides what time slots to give the periods. +/// while the [schedule] property decides what time slots to give the periods. @immutable class Day { /// Gets the calendar for the whole year. /// - /// Each element of [data]'s months should be a JSON representation of a [Day]. + /// Each element of [year]'s months should be a JSON representation of a [Day]. /// See [Day.fromJson] for how to represent a Day in JSON. - static List> getCalendar( - List?>> data - ) => [ - for (final List?> month in data) - getMonth(month) - ]; - - /// Parses a particular month from JSON. - /// - /// See [Day.getCalendar] for details. - static List getMonth(List?> data) => [ - for (final Map? json in data) - if (json == null) null - else Day.fromJson(json) - ]; - - /// Converts a month in the calendar to JSON. - /// - /// This is how it is currently stored in the database. - static List?> monthToJson(List month) => [ - for (final Day? day in month) - day?.toJson() + static List> getCalendar(List> year) => [ + for (final List month in year) [ + for (final Map? day in month) + if (day == null) null + else Day.fromJson(day) + ] ]; /// Gets the Day for [date] in the [calendar]. @@ -51,34 +33,32 @@ class Day { /// The time allotment for this day. /// - /// See the [Special] class for more details. - final Special special; + /// See the [Schedule] class for more details. + final Schedule schedule; - /// Returns a new Day from a [name] and [Special]. + /// Returns a new Day from a [name] and [Schedule]. const Day({ required this.name, - required this.special + required this.schedule }); /// Returns a Day from a JSON object. /// - /// `json ["name"]` and `json ["special"]` must not be null. - /// - /// `json ["special"]` may be: - /// - /// 1. One of the specials from [Special.specials]. - /// 2. JSON of a special. See [Special.fromJson]. - /// - /// This factory is not a constructor so it can dynamically check - /// for a valid [name] while keeping the field final. - factory Day.fromJson(Map json) { - if (!json.containsKey("name")) { - throw JsonUnsupportedObjectError(json); + /// `json ["name"]` and `json ["schedule"]` must not be null. + /// `json ["schedule"]` must be the name of a schedule in the calendar. + factory Day.fromJson(Map json) { + final String scheduleName = json ["schedule"]; + final Schedule? schedule = Schedule.schedules.firstWhere( + (Schedule schedule) => schedule.name == scheduleName + ); + if (schedule == null) { + throw ArgumentError.value( + json ["schedule"], // problematic value + "scheduleName", // description of this value + "Unrecognized schedule name" // error message + ); } - final String name = json ["name"]; - final jsonSpecial = json ["special"]; - final Special special = Special.fromJson(jsonSpecial); - return Day(name: name, special: special); + return Day(name: json ["name"], schedule: schedule); } @override @@ -90,25 +70,16 @@ class Day { @override bool operator == (dynamic other) => other is Day && other.name == name && - other.special == special; + other.schedule == schedule; /// Returns a JSON representation of this Day. - /// - /// Will convert [special] to its name if it is a built-in special. - /// Otherwise it will convert it to JSON form. Map toJson() => { "name": name, - "special": Special.stringToSpecial.containsKey(special.name) - ? special.name - : special.toJson() + "schedule": schedule.name, }; /// A human-readable string representation of this day. - /// - /// If [name] is null, returns null. - /// Otherwise, returns [name] and [special]. - /// If [special] was left as the default, will only return the [name]. - String get displayName => "$name ${special.name}"; + String get displayName => "$name ${schedule.name}"; /// Whether to say "a" or "an". /// @@ -120,26 +91,22 @@ class Day { /// The period right now. /// - /// Uses [special] to calculate the time slots for all the different periods, - /// and uses [DateTime.now()] to look up what period it is right now. - /// - /// See [Time] and [Range] for implementation details. - int? get period { - final Time time = Time.fromDateTime (DateTime.now()); - for (int index = 0; index < (special.periods.length); index++) { - final Range range = special.periods [index]; - if ( - range.contains(time) || // during class - ( // between periods + /// Uses [schedule] to calculate the time slots for all the different periods, + /// and uses [DateTime.now()] to look up what period it is right now. Also + /// makes use of [Range] and [Time] comparison operators. + int? getCurrentPeriod() { + final Time time = Time.fromDateTime(DateTime.now()); + for (int index = 0; index < schedule.periods.length; index++) { + final Range range = schedule.periods [index].time; + if (range.contains(time) // during class + || ( // between periods index != 0 && - special.periods [index - 1] < time && + schedule.periods [index - 1].time < time && range > time ) ) { return index; } } - // ignore: avoid_returning_null - return null; } } diff --git a/lib/src/data/schedule/period.dart b/lib/src/data/schedule/period.dart index a92061a19..581049fc7 100644 --- a/lib/src/data/schedule/period.dart +++ b/lib/src/data/schedule/period.dart @@ -1,14 +1,14 @@ import "package:meta/meta.dart"; import "activity.dart"; -import "special.dart"; +import "schedule.dart"; import "subject.dart"; import "time.dart"; /// A representation of a period, independent of the time. /// /// This is needed since the time can change on any day. -/// See [Special] for when the times can change. +/// See [Schedule] for how to handle different times. @immutable class PeriodData { /// Returns a list of [PeriodData] from a JSON object. @@ -72,7 +72,7 @@ class Period { /// Since a period can be a number (like 9), or a word (like "Homeroom"), /// String was chosen to represent both. This means that the app does not /// care whether a period is a regular class or something like homeroom. - final String period; + final String name; /// The section ID and room for this period. /// @@ -80,36 +80,68 @@ class Period { final PeriodData? data; /// The activity for this period. - /// - /// This is set in [Special.activities]. final Activity? activity; /// Unpacks a [PeriodData] object and returns a Period. const Period({ required this.data, required this.time, - required this.period, + required this.name, this.activity }); - /// Returns a period that represents time for Mincha. + /// A Period as represented by the calendar. /// - /// Use this constructor to keep a consistent definition of "Mincha". - const Period.mincha(this.time, {this.activity}) : - data = null, - period = "Mincha"; + /// This period is student-agnostic, so [data] is automatically null. This + /// constructor can be used instead of [fromJson()] to build preset schedules + const Period.raw({ + required this.name, + required this.time, + this.activity, + }) : data = null; + + /// A Period as represented by the calendar. + /// + /// This period is student-agnostic, so [data] is automatically null. + Period.fromJson(Map json) : + time = Range.fromJson(json ["time"]), + name = json ["name"], + data = null, + activity = json ["activity"] == null ? null + : Activity.fromJson(json ["activity"]); + + /// The JSON representation of this period. + Map toJson() => { + "time": time.toJson(), + "name": name, + "activity": activity?.toJson(), + }; + + /// Copies this period with the [PeriodData] of another. + /// + /// This is useful because [Period] objects serve a dual purpose. Their first + /// use is in the calendar, where they simply store data about [Range]s and + /// are used to determine when the periods occur. Then, this information is + /// merged with the user's [PeriodData] objects to create a [Period] that has + /// access to the class the user has at a given time. + Period copyWith(PeriodData? data) => Period( + name: name, + data: data, + time: time, + activity: activity, + ); /// This is only for debug purposes. Use [getName] for UI labels. @override - String toString() => "Period $period"; + String toString() => "Period $name"; @override - int get hashCode => "$period-${data?.id ?? ''}".hashCode; + int get hashCode => "$name-${data?.id ?? ''}".hashCode; @override bool operator == (dynamic other) => other is Period && other.time == time && - other.period == period && + other.name == name && other.data == data; /// Whether this is a free period. @@ -124,18 +156,18 @@ class Period { /// /// The expected subject can be retrieved by looking up `data.id`. /// - /// If [period] is an integer and [data] is null, then it is a free period. - /// Otherwise, if [period] is not a number, than it is returned instead. + /// If [name] is an integer and [data] is null, then it is a free period. + /// Otherwise, if [name] is not a number, than it is returned instead. /// Finally, the [Subject] that corresponds to [data] will be returned. /// /// For example: /// /// 1. A period with null [data] will return "Free period" - /// 2. A period with `period == "Homeroom"` will return "Homeroom" - /// 3. A period with `period == "3"` will return the name of the [Subject]. - String getName(Subject? subject) => int.tryParse(period) != null && isFree + /// 2. A period with `name == "Homeroom"` will return "Homeroom" + /// 3. A period with `name == "3"` will return the name of the [Subject]. + String getName(Subject? subject) => int.tryParse(name) != null && isFree ? "Free period" - : subject?.name ?? period; + : subject?.name ?? name; /// Returns a list of descriptions for this period. /// @@ -144,12 +176,12 @@ class Period { /// Useful throughout the UI. This function will: /// /// 1. Always display the time. - /// 2. If [period] is a number, will display the period. + /// 2. If [name] is a number, will display the period. /// 3. If `data.room` is not null, will display the room. /// 4. If `data.id` is valid, will return the name of the [Subject]. List getInfo (Subject? subject) => [ "Time: $time", - if (int.tryParse(period) != null) "Period: $period", + if (int.tryParse(name) != null) "Period: $name", if (data != null) "Room: ${data!.room}", if (subject != null) "Teacher: ${subject.teacher}", ]; diff --git a/lib/src/data/schedule/schedule.dart b/lib/src/data/schedule/schedule.dart new file mode 100644 index 000000000..7565d3749 --- /dev/null +++ b/lib/src/data/schedule/schedule.dart @@ -0,0 +1,270 @@ +import "package:meta/meta.dart"; + +import "package:ramaz/constants.dart"; + +import "period.dart"; +import "time.dart"; + +/// A description of the time allotment for a day. +/// +/// Some days require different time periods, or even periods that +/// are skipped altogether, as well as homeroom and Mincha movements. +/// This class helps facilitate that. +@immutable +class Schedule { + /// The list of schedules defined in the calendar. + /// + /// This is a rare exception where the database and data layers intermingle. + /// Schedules are defined by their name, but their values exist elsewhere in + /// the database. So, the data layer needs some lookup method in order to be + /// useful. Specifically, [Day.fromJson()] needs to work _somehow_. + /// + /// `late final` means that this value is initialized after startup, but the + /// value cannot be used until it is (and once it is set, it's final). This + /// means that we need to be careful not to access this value until we can be + /// sure that the database values were synced. Dart will throw a runtime error + /// otherwise, so it should be fairly simple to catch problems during testing. + static late final List schedules; + + /// The name of this schedule. + final String name; + + /// The time allotments for the periods. + final List periods; + + /// A const constructor. + const Schedule({ + required this.name, + required this.periods, + }); + + /// Returns a new [Schedule] from a JSON value. + /// + /// The JSON must have: + /// + /// - a "name" field, which should be a string. See [name]. + /// - a "periods" field, which should be a list of [Period] JSON objects. + Schedule.fromJson(Map json) : + name = json ["name"], // name + periods = [ // list of periods + for (final dynamic jsonElement in json ["periods"]) + Period.fromJson(jsonElement) + ]; + + /// Determines whether to use a Winter Friday or regular Friday schedule. + /// + /// Winter Fridays mean shorter periods, with an ultimately shorter dismissal. + static Schedule getWinterFriday([DateTime? today]) { + final DateTime date = today ?? DateTime.now(); + final int month = date.month, day = date.day; + if (month >= Times.schoolStart && month < Times.winterFridayMonthStart) { + return friday; + } else if ( + month > Times.winterFridayMonthStart || + month < Times.winterFridayMonthEnd + ) { + return winterFriday; + } else if ( + month > Times.winterFridayMonthEnd && + month <= Times.schoolEnd + ) { + return friday; + } else if (month == Times.winterFridayMonthStart) { + return day < Times.winterFridayDayStart ? friday : winterFriday; + } else if (month == Times.winterFridayMonthEnd) { + return day < Times.winterFridayDayEnd ? winterFriday : friday; + } else { + return friday; + } + } + + @override + String toString() => name; + + @override + int get hashCode => name.hashCode; + + @override + bool operator == (dynamic other) => other is Schedule && + other.name == name; + + /// Returns a JSON representation of this schedule. + Map toJson() => { + "name": name, + "periods": [ + for (final Period period in periods) + period.toJson, + ], + }; + + /// The shorter schedule for the COVID-19 pandemic. + static const Schedule covid = Schedule( + name: "COVID-19", + periods: [ + Period.raw(name: "1", time: Range(Time(8, 30), Time(9, 15))), + Period.raw(name: "Tefilla", time: Range(Time(9, 20), Time(9, 55))), + Period.raw(name: "2", time: Range(Time(10, 00), Time(10, 45))), + Period.raw(name: "3", time: Range(Time(10, 55), Time(11, 40))), + Period.raw(name: "4", time: Range(Time(11, 50), Time(12, 35))), + Period.raw(name: "Lunch", time: Range(Time(12, 35), Time(13, 05))), + Period.raw(name: "5", time: Range(Time(13, 15), Time(14, 00))), + Period.raw(name: "Mincha", time: Range(Time(14, 00), Time(14, 10))), + Period.raw(name: "6", time: Range(Time(14, 20), Time(15, 05))), + Period.raw(name: "7", time: Range(Time(15, 15), Time(16, 00))), + ], + ); + + /// The schedule for Rosh Chodesh. + static const Schedule roshChodesh = Schedule( + name: "Rosh Chodesh", + periods: [ + Period.raw(name: "1", time: Range(Time(8, 00), Time(9, 05))), + Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 50))), + Period.raw(name: "3", time: Range(Time(9, 55), Time(10, 35))), + Period.raw(name: "Homeroom", time: Range(Time(10, 35), Time(10, 50))), + Period.raw(name: "4", time: Range(Time(10, 50), Time(11, 30))), + Period.raw(name: "5", time: Range(Time(11, 35), Time(12, 15))), + Period.raw(name: "6", time: Range(Time(12, 20), Time(12, 55))), + Period.raw(name: "7", time: Range(Time(13, 00), Time(13, 35))), + Period.raw(name: "8", time: Range(Time(13, 40), Time(14, 15))), + Period.raw(name: "9", time: Range(Time(14, 30), Time(15, 00))), + Period.raw(name: "Mincha", time: Range(Time(15, 00), Time(15, 20))), + Period.raw(name: "10", time: Range(Time(15, 20), Time(16, 00))), + Period.raw(name: "11", time: Range(Time(16, 05), Time(16, 45))), + ], + ); + + /// The schedule for fast days. + static const Schedule fastDay = Schedule( + name: "Tzom", + periods: [ + Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 55))), + Period.raw(name: "2", time: Range(Time(9, 00), Time(9, 35))), + Period.raw(name: "3", time: Range(Time(9, 40), Time(10, 15))), + Period.raw(name: "4", time: Range(Time(10, 20), Time(10, 55))), + Period.raw(name: "5", time: Range(Time(11, 00), Time(11, 35))), + Period.raw(name: "9", time: Range(Time(11, 40), Time(12, 15))), + Period.raw(name: "10", time: Range(Time(12, 20), Time(12, 55))), + Period.raw(name: "11", time: Range(Time(13, 00), Time(13, 35))), + Period.raw(name: "Mincha", time: Range(Time(13, 35), Time(14, 05))), + ], + ); + + /// The schedule for Fridays. + static const Schedule friday = Schedule( + name: "Friday", + periods: [ + Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 45))), + Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 30))), + Period.raw(name: "3", time: Range(Time(9, 35), Time(10, 15))), + Period.raw(name: "4", time: Range(Time(10, 20), Time(11, 00))), + Period.raw(name: "Homeroom", time: Range(Time(11, 00), Time(11, 20))), + Period.raw(name: "5", time: Range(Time(11, 20), Time(12, 00))), + Period.raw(name: "6", time: Range(Time(12, 05), Time(12, 45))), + Period.raw(name: "7", time: Range(Time(12, 50), Time(13, 30))), + ], + ); + + /// The schedule for when Rosh Chodesh falls on a Friday. + static const Schedule fridayRoshChodesh = Schedule( + name: "Friday Rosh Chodesh", + periods: [ + Period.raw(name: "1", time: Range(Time(8, 00), Time(9, 05))), + Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 45))), + Period.raw(name: "3", time: Range(Time(9, 50), Time(10, 25))), + Period.raw(name: "4", time: Range(Time(10, 30), Time(11, 05))), + Period.raw(name: "Homeroom", time: Range(Time(11, 05), Time(11, 25))), + Period.raw(name: "5", time: Range(Time(11, 25), Time(12, 00))), + Period.raw(name: "6", time: Range(Time(12, 05), Time(12, 40))), + Period.raw(name: "7", time: Range(Time(12, 45), Time(13, 20))), + ], + ); + + /// The schedule for a winter Friday. See [Schedule.getWinterFriday]. + static const Schedule winterFriday = Schedule( + name: "Winter Friday", + periods: [ + Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 45))), + Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 25))), + Period.raw(name: "3", time: Range(Time(9, 30), Time(10, 05))), + Period.raw(name: "4", time: Range(Time(10, 10), Time(10, 45))), + Period.raw(name: "Homeroom", time: Range(Time(10, 45), Time(11, 05))), + Period.raw(name: "5", time: Range(Time(11, 05), Time(11, 40))), + Period.raw(name: "6", time: Range(Time(11, 45), Time(12, 20))), + Period.raw(name: "7", time: Range(Time(12, 25), Time(13, 00))), + ], + ); + + /// The schedule for when a Rosh Chodesh falls on a Winter Friday. + static const Schedule winterFridayRoshChodesh = Schedule( + name: "Winter Friday Rosh Chodesh", + periods: [ + Period.raw(name: "1", time: Range(Time(8, 00), Time(9, 05))), + Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 40))), + Period.raw(name: "3", time: Range(Time(9, 45), Time(10, 15))), + Period.raw(name: "4", time: Range(Time(10, 20), Time(10, 50))), + Period.raw(name: "Homeroom", time: Range(Time(10, 50), Time(11, 10))), + Period.raw(name: "5", time: Range(Time(11, 10), Time(11, 40))), + Period.raw(name: "6", time: Range(Time(11, 45), Time(12, 15))), + Period.raw(name: "7", time: Range(Time(12, 20), Time(12, 50))), + ], + ); + + /// The schedule for when there is an assembly during Homeroom. + static const Schedule amAssembly = Schedule( + name: "AM Assembly", + periods: [ + Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 50))), + Period.raw(name: "2", time: Range(Time(8, 55), Time(9, 30))), + Period.raw(name: "3", time: Range(Time(9, 35), Time(10, 10))), + Period.raw(name: "Homeroom", time: Range(Time(10, 10), Time(11, 10))), + Period.raw(name: "4", time: Range(Time(11, 10), Time(11, 45))), + Period.raw(name: "5", time: Range(Time(11, 50), Time(12, 25))), + Period.raw(name: "6", time: Range(Time(12, 30), Time(13, 05))), + Period.raw(name: "7", time: Range(Time(13, 10), Time(13, 45))), + Period.raw(name: "8", time: Range(Time(13, 50), Time(14, 25))), + Period.raw(name: "9", time: Range(Time(14, 30), Time(15, 05))), + Period.raw(name: "Mincha", time: Range(Time(15, 05), Time(15, 25))), + Period.raw(name: "10", time: Range(Time(15, 25), Time(16, 00))), + Period.raw(name: "11", time: Range(Time(16, 05), Time(16, 45))), + ], + ); + /// The schedule for when there is an assembly during Mincha. + static const Schedule pmAssembly = Schedule( + name: "PM Assembly", + periods: [ + Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 50))), + Period.raw(name: "2", time: Range(Time(8, 55), Time(9, 30))), + Period.raw(name: "3", time: Range(Time(9, 35), Time(10, 10))), + Period.raw(name: "4", time: Range(Time(10, 15), Time(10, 50))), + Period.raw(name: "5", time: Range(Time(10, 55), Time(11, 30))), + Period.raw(name: "6", time: Range(Time(11, 35), Time(12, 10))), + Period.raw(name: "7", time: Range(Time(12, 15), Time(12, 50))), + Period.raw(name: "8", time: Range(Time(12, 55), Time(13, 30))), + Period.raw(name: "9", time: Range(Time(13, 35), Time(14, 10))), + Period.raw(name: "Mincha", time: Range(Time(14, 10), Time(15, 30))), + Period.raw(name: "10", time: Range(Time(15, 30), Time(16, 05))), + Period.raw(name: "11", time: Range(Time(16, 10), Time(16, 45))), + ], + ); + + /// The schedule for an early dismissal. + static const Schedule early = Schedule( + name: "Early Dismissal", + periods: [ + Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 45))), + Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 25))), + Period.raw(name: "3", time: Range(Time(9, 30), Time(10, 05))), + Period.raw(name: "Homeroom", time: Range(Time(10, 05), Time(10, 20))), + Period.raw(name: "4", time: Range(Time(10, 20), Time(10, 55))), + Period.raw(name: "5", time: Range(Time(11, 00), Time(11, 35))), + Period.raw(name: "6", time: Range(Time(11, 40), Time(12, 15))), + Period.raw(name: "7", time: Range(Time(12, 20), Time(12, 55))), + Period.raw(name: "8", time: Range(Time(13, 00), Time(13, 35))), + Period.raw(name: "9", time: Range(Time(13, 40), Time(14, 15))), + Period.raw(name: "Mincha", time: Range(Time(14, 15), Time(14, 35))), + Period.raw(name: "10", time: Range(Time(14, 35), Time(15, 10))), + Period.raw(name: "11", time: Range(Time(15, 15), Time(15, 50))), + ], + ); +} diff --git a/lib/src/data/schedule/special.dart b/lib/src/data/schedule/special.dart deleted file mode 100644 index eadd808a8..000000000 --- a/lib/src/data/schedule/special.dart +++ /dev/null @@ -1,414 +0,0 @@ -import "package:meta/meta.dart"; - -import "package:ramaz/constants.dart"; - -import "activity.dart"; -import "time.dart"; - -/// A description of the time allotment for a day. -/// -/// Some days require different time periods, or even periods that -/// are skipped altogether, as well as homeroom and Mincha movements. -/// This class helps facilitate that. -@immutable -class Special { - /// The name of this special. - final String name; - - /// The time allotments for the periods. - final List periods; - - /// The indices of periods to skip. - /// - /// For example, on fast days, all lunch periods are skipped. - /// So here, skip would be `[6, 7, 8]`, to skip 6th, 7th and 8th periods. - final List skip; - - /// The index in [periods] that represents Mincha. - final int? mincha; - - /// The index in [periods] that represents homeroom. - final int? homeroom; - - /// Maps activities to the periods. - final Map activities; - - /// A const constructor. - const Special ( - this.name, - this.periods, - { - this.homeroom, - this.mincha, - this.skip = const [], - this.activities = const {} - } - ); - - /// Returns a new [Special] from a JSON value. - /// - /// The value must either be: - /// - /// - a string, in which case it should be in the [specials] list, or - /// - a map, in which case it will be interpreted as JSON. The JSON must have: - /// - a "name" field, which should be a string. See [name]. - /// - a "periods" field, which should be a list of [Range] JSON objects. - /// - a "homeroom" field, which should be an integer. See [homeroom]. - /// - a "skip" field, which should be a list of integers. See [skip]. - factory Special.fromJson(Object value) { - if (value is String) { - final Special? builtInSpecial = stringToSpecial [value]; - if (builtInSpecial != null) { - return builtInSpecial; - } else { - throw ArgumentError.value( - value, - "Special.fromJson: value", - "'$value' needs to be one of ${stringToSpecial.keys.join(", ")}" - ); - } - } else if (value is Map) { - final Map json = Map.from(value); - return Special ( - json ["name"], // name - [ // list of periods - for (final dynamic jsonElement in json ["periods"]) - Range.fromJson(Map.from(jsonElement)) - ], - homeroom: json ["homeroom"], - mincha: json ["mincha"], - skip: List.from(json ["skip"] ?? []), - activities: Activity.getActivities( - Map.from(json ["activities"] ?? {}) - ), - ); - } else { - throw ArgumentError.value ( - value, // invalid value - "Special.fromJson: value", // arg name - "$value is not a valid special", // message - ); - } - } - - /// Determines whether to use a Winter Friday or regular Friday schedule. - /// - /// Winter Fridays mean shorter periods, with an ultimately shorter dismissal. - static Special getWinterFriday([DateTime? today]) { - final DateTime date = today ?? DateTime.now(); - final int month = date.month, day = date.day; - if (month >= Times.schoolStart && month < Times.winterFridayMonthStart) { - return friday; - } else if ( - month > Times.winterFridayMonthStart || - month < Times.winterFridayMonthEnd - ) { - return winterFriday; - } else if ( - month > Times.winterFridayMonthEnd && - month <= Times.schoolEnd - ) { - return friday; - } else if (month == Times.winterFridayMonthStart) { - return day < Times.winterFridayDayStart ? friday : winterFriday; - } else if (month == Times.winterFridayMonthEnd) { - return day < Times.winterFridayDayEnd ? winterFriday : friday; - } else { - return friday; - } - } - - /// Compares two lists - /// - /// This function is used to compare the [periods] property of two Specials. - static bool deepEquals(List a, List b) => - a.length == b.length && - [ - for (int index = 0; index < (a.length); index++) - index - ].every( - (int index) => a [index] == b [index] - ); - - @override - String toString() => name; - - @override - int get hashCode => name.hashCode; - - @override - bool operator == (dynamic other) => other is Special && - other.name == name && - deepEquals(other.periods, periods) && - deepEquals(other.skip, skip) && - other.mincha == mincha && - other.homeroom == homeroom; - - /// Returns a JSON representation of this Special. - Map toJson() => { - "periods": [ - for (final Range period in periods) - period.toJson() - ], - "skip": skip, - "name": name, - "mincha": mincha, - "homeroom": homeroom, - }; - - /// The shorter schedule for the Covid-19 pandemic. - static const Special covid = Special( - "COVID-19", - [ - Range(Time(8, 30), Time(9, 15)), - Range(Time(9, 20), Time(9, 55)), - Range(Time(10, 00), Time(10, 45)), - Range(Time(10, 55), Time(11, 40)), - Range(Time(11, 50), Time(12, 35)), - Range(Time(12, 35), Time(13, 05)), - Range(Time(13, 15), Time(14, 00)), - Range(Time(14, 00), Time(14, 10)), - Range(Time(14, 20), Time(15, 05)), - Range(Time(15, 15), Time(16, 00)), - ], - mincha: 7, - skip: [1, 5], - ); - - /// The [Special] for Rosh Chodesh. - static const Special roshChodesh = Special ( - "Rosh Chodesh", - [ - Range(Time(8, 00), Time(9, 05)), - Range(Time(9, 10), Time(9, 50)), - Range(Time(9, 55), Time(10, 35)), - Range(Time(10, 35), Time(10, 50)), - Range(Time(10, 50), Time(11, 30)), - Range(Time(11, 35), Time(12, 15)), - Range(Time(12, 20), Time(12, 55)), - Range(Time(13, 00), Time(13, 35)), - Range(Time(13, 40), Time(14, 15)), - Range(Time(14, 30), Time(15, 00)), - Range(Time(15, 00), Time(15, 20)), - Range(Time(15, 20), Time(16, 00)), - Range(Time(16, 05), Time(16, 45)), - ], - homeroom: 3, - mincha: 10, - ); - - /// The [Special] for fast days. - static const Special fastDay = Special ( - "Tzom", - [ - Range(Time(8, 00), Time(8, 55)), - Range(Time(9, 00), Time(9, 35)), - Range(Time(9, 40), Time(10, 15)), - Range(Time(10, 20), Time(10, 55)), - Range(Time(11, 00), Time(11, 35)), - Range(Time(11, 40), Time(12, 15)), - Range(Time(12, 20), Time(12, 55)), - Range(Time(13, 00), Time(13, 35)), - Range(Time(13, 35), Time(14, 05)), - ], - mincha: 8, - skip: [6, 7, 8] - ); - - /// The [Special] for Fridays. - static const Special friday = Special ( - "Friday", - [ - Range(Time(8, 00), Time(8, 45)), - Range(Time(8, 50), Time(9, 30)), - Range(Time(9, 35), Time(10, 15)), - Range(Time(10, 20), Time(11, 00)), - Range(Time(11, 00), Time(11, 20)), - Range(Time(11, 20), Time(12, 00)), - Range(Time(12, 05), Time(12, 45)), - Range(Time(12, 50), Time(13, 30)), - ], - homeroom: 4 - ); - - /// The [Special] for when Rosh Chodesh falls on a Friday. - static const Special fridayRoshChodesh = Special ( - "Friday Rosh Chodesh", - [ - Range(Time(8, 00), Time(9, 05)), - Range(Time(9, 10), Time(9, 45)), - Range(Time(9, 50), Time(10, 25)), - Range(Time(10, 30), Time(11, 05)), - Range(Time(11, 05), Time(11, 25)), - Range(Time(11, 25), Time(12, 00)), - Range(Time(12, 05), Time(12, 40)), - Range(Time(12, 45), Time(13, 20)), - ], - homeroom: 4 - ); - - /// The [Special] for a winter Friday. See [Special.getWinterFriday]. - static const Special winterFriday = Special ( - "Winter Friday", - [ - Range(Time(8, 00), Time(8, 45)), - Range(Time(8, 50), Time(9, 25)), - Range(Time(9, 30), Time(10, 05)), - Range(Time(10, 10), Time(10, 45)), - Range(Time(10, 45), Time(11, 05)), - Range(Time(11, 05), Time(11, 40)), - Range(Time(11, 45), Time(12, 20)), - Range(Time(12, 25), Time(13, 00)), - ], - homeroom: 4 - ); - - /// The [Special] for when a Rosh Chodesh falls on a Winter Friday. - static const Special winterFridayRoshChodesh = Special ( - "Winter Friday Rosh Chodesh", - [ - Range(Time(8, 00), Time(9, 05)), - Range(Time(9, 10), Time(9, 40)), - Range(Time(9, 45), Time(10, 15)), - Range(Time(10, 20), Time(10, 50)), - Range(Time(10, 50), Time(11, 10)), - Range(Time(11, 10), Time(11, 40)), - Range(Time(11, 45), Time(12, 15)), - Range(Time(12, 20), Time(12, 50)), - ], - homeroom: 4 - ); - - /// The [Special] for when there is an assembly during Homeroom. - static const Special amAssembly = Special ( - "AM Assembly", - [ - Range(Time(8, 00), Time(8, 50)), - Range(Time(8, 55), Time(9, 30)), - Range(Time(9, 35), Time(10, 10)), - Range(Time(10, 10), Time(11, 10)), - Range(Time(11, 10), Time(11, 45)), - Range(Time(11, 50), Time(12, 25)), - Range(Time(12, 30), Time(13, 05)), - Range(Time(13, 10), Time(13, 45)), - Range(Time(13, 50), Time(14, 25)), - Range(Time(14, 30), Time(15, 05)), - Range(Time(15, 05), Time(15, 25)), - Range(Time(15, 25), Time(16, 00)), - Range(Time(16, 05), Time(16, 45)), - ], - homeroom: 3, - - mincha: 10 - ); - - /// The [Special] for when there is an assembly during Mincha. - static const Special pmAssembly = Special ( - "PM Assembly", - [ - Range(Time(8, 00), Time(8, 50)), - Range(Time(8, 55), Time(9, 30)), - Range(Time(9, 35), Time(10, 10)), - Range(Time(10, 15), Time(10, 50)), - Range(Time(10, 55), Time(11, 30)), - Range(Time(11, 35), Time(12, 10)), - Range(Time(12, 15), Time(12, 50)), - Range(Time(12, 55), Time(13, 30)), - Range(Time(13, 35), Time(14, 10)), - Range(Time(14, 10), Time(15, 30)), - Range(Time(15, 30), Time(16, 05)), - Range(Time(16, 10), Time(16, 45)), - ], - mincha: 9 - ); - - // /// The [Special] for Mondays and Thursdays. - // static const Special regular = Special ( - // "M or R day", - // [ - // Range(Time(8, 00), Time(8, 50)), - // Range(Time(8, 55), Time(9, 35)), - // Range(Time(9, 40), Time(10, 20)), - // Range(Time(10, 20), Time(10, 35)), - // Range(Time(10, 35), Time(11, 15)), - // Range(Time(11, 20), Time(12, 00)), - // Range(Time(12, 05), Time(12, 45)), - // Range(Time(12, 50), Time(13, 30)), - // Range(Time(13, 35), Time(14, 15)), - // Range(Time(14, 20), Time(15, 00)), - // Range(Time(15, 00), Time(15, 20)), - // Range(Time(15, 20), Time(16, 00)), - // Range(Time(16, 05), Time(16, 45)), - // ], - // homeroom: 3, - // mincha: 10 - // ); - - // /// The [Special] for Tuesday and Wednesday (letters A, B, and C) - // static const Special rotate = Special ( - // "A, B, or C day", - // [ - // Range(Time(8, 00), Time(8, 45)), - // Range(Time(8, 50), Time(9, 30)), - // Range(Time(9, 35), Time(10, 15)), - // Range(Time(10, 15), Time(10, 35)), - // Range(Time(10, 35), Time(11, 15)), - // Range(Time(11, 20), Time(12, 00)), - // Range(Time(12, 05), Time(12, 45)), - // Range(Time(12, 50), Time(13, 30)), - // Range(Time(13, 35), Time(14, 15)), - // Range(Time(14, 20), Time(15, 00)), - // Range(Time(15, 00), Time(15, 20)), - // Range(Time(15, 20), Time(16, 00)), - // Range(Time(16, 05), Time(16, 45)), - // ], - // homeroom: 3, - // mincha: 10 - // ); - - /// The [Special] for an early dismissal. - static const Special early = Special ( - "Early Dismissal", - [ - Range(Time(8, 00), Time(8, 45)), - Range(Time(8, 50), Time(9, 25)), - Range(Time(9, 30), Time(10, 05)), - Range(Time(10, 05), Time(10, 20)), - Range(Time(10, 20), Time(10, 55)), - Range(Time(11, 00), Time(11, 35)), - Range(Time(11, 40), Time(12, 15)), - Range(Time(12, 20), Time(12, 55)), - Range(Time(13, 00), Time(13, 35)), - Range(Time(13, 40), Time(14, 15)), - Range(Time(14, 15), Time(14, 35)), - Range(Time(14, 35), Time(15, 10)), - Range(Time(15, 15), Time(15, 50)), - ], - homeroom: 3, - mincha: 10 - ); - - /// A collection of all the [Special]s - /// - /// Used in the UI - static const List specials = [ - // regular, - roshChodesh, - fastDay, - friday, - fridayRoshChodesh, - winterFriday, - winterFridayRoshChodesh, - amAssembly, - pmAssembly, - // rotate, - early, - covid, - ]; - - /// Maps the default special names to their [Special] objects - static final Map stringToSpecial = Map.fromIterable( - specials, - key: (special) => special.name, - ); -} diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index f833d2b5d..c60c24609 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -4,7 +4,6 @@ import "contact_info.dart"; import "schedule/advisory.dart"; import "schedule/day.dart"; import "schedule/period.dart"; -import "schedule/special.dart"; import "schedule/time.dart"; /// What grade the user is in. @@ -123,38 +122,12 @@ class User { /// Computes the periods, in order, for a given day. /// /// This method converts the [PeriodData]s in [schedule] into [Period]s using - /// [Day.special]. [PeriodData] objects are specific to the user's schedule, + /// [Day.schedule]. [PeriodData] objects are specific to the user's schedule, /// whereas the times of the day [Range]s are specific to the calendar. - /// - /// See [Special] for an explanation of the different factors this method - /// takes into account. - List getPeriods(Day day) { - final Special special = day.special; - final int periodCount = special.periods.length; - int periodIndex = 0; - return [ - for (int index = 0; index < periodCount; index++) - if (special.homeroom == index) Period( - data: null, - period: "Homeroom", - time: special.periods [index], - activity: null, - ) else if (special.mincha == index) Period( - data: null, - period: "Mincha", - time: special.periods [index], - activity: null, - ) else if (special.skip.contains(index)) Period( - data: null, - period: "Free period", - time: special.periods [index], - activity: null, - ) else Period( - data: schedule [day.name]! [periodIndex], - period: (++periodIndex).toString(), - time: special.periods [index], - activity: null, - ) - ]; - } + List getPeriods(Day day) => [ + for (final Period period in day.schedule.periods) period.copyWith( + int.tryParse(period.name) == null ? null + : schedule [day.name]! [int.parse(period.name)] + ) + ]; } From 522771d8cc52ce6f2065e77a413415836e9b562f Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Apr 2021 14:09:16 -0400 Subject: [PATCH 124/251] Refactored out Admin dataclass Renamed Scope -> AdminScope moved User.admin.scopes -> UserModel.adminScopes --- lib/app.dart | 8 ++--- lib/src/data/admin.dart | 65 ----------------------------------- lib/src/data/user.dart | 33 ++++++++++++++++++ lib/src/models/data/user.dart | 56 ++++++------------------------ lib/src/pages/drawer.dart | 8 ++--- 5 files changed, 52 insertions(+), 118 deletions(-) delete mode 100644 lib/src/data/admin.dart diff --git a/lib/app.dart b/lib/app.dart index 574582ec8..d79f993dd 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -9,9 +9,9 @@ import "package:ramaz/widgets.dart"; /// The main app widget. class RamLife extends StatelessWidget { - static bool hasAdminScope(Scope scope) => Auth.isSignedIn + static bool hasAdminScope(AdminScope scope) => Auth.isSignedIn && Models.instance.user.isAdmin - && Models.instance.user.admin!.scopes.contains(scope); + && Models.instance.user.adminScopes!.contains(scope); /// The routes for this app. static final Map routes = { @@ -33,11 +33,11 @@ class RamLife extends StatelessWidget { child: FeedbackPage(), ), Routes.calendar: (_) => RouteInitializer( - isAllowed: () => hasAdminScope(Scope.calendar), + isAllowed: () => hasAdminScope(AdminScope.calendar), child: const AdminCalendarPage(), ), Routes.specials: (_) => RouteInitializer( - isAllowed: () => hasAdminScope(Scope.calendar), + isAllowed: () => hasAdminScope(AdminScope.calendar), child: const AdminSpecialsPage(), ), Routes.sports: (_) => const RouteInitializer( diff --git a/lib/src/data/admin.dart b/lib/src/data/admin.dart deleted file mode 100644 index 18bb0e89c..000000000 --- a/lib/src/data/admin.dart +++ /dev/null @@ -1,65 +0,0 @@ -import "package:meta/meta.dart"; - -/// Scopes for administrative privileges. -/// -/// [Admin] users use these scopes ([Admin.scopes]) to determine what they can -/// access and/or modify. -enum Scope { - /// The admin can access and modify the calendar. - calendar, - - /// The admin can access and modify student schedules. - schedule, - - /// The admin can create and update sports games. - sports, -} - -/// Maps Strings to their respective [Scope]s. -const Map stringToScope = { - "calendar": Scope.calendar, - "schedule": Scope.schedule, - "sports": Scope.sports, -}; - -/// Maps [Scope]s to Strings. -const Map scopeToString = { - Scope.calendar: "calendar", - Scope.schedule: "schedule", - Scope.sports: "sports", -}; - -/// A system administrator. -/// -/// Based on the scopes granted to them, they can -/// access and/or modify data not normally visible/modifiable to all users. -@immutable -class Admin { - /// A list of scopes available to this user. - final List scopes; - - /// This user's email. - /// - /// This is needed here so it can be indexed in a database. - final String email; - - /// Creates a user with administrative privileges. - const Admin ({ - required this.scopes, - required this.email, - }); - - /// Creates an admin from a JSON entry. - Admin.fromJson(Map json, List _scopes) : - scopes = [ - for (String scope in _scopes) - if (stringToScope.containsKey(scope)) - stringToScope [scope]! - ], - email = json ["email"]; - - /// Converts an admin to JSON form. - Map toJson() => { - "email": email, - }; -} diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index c60c24609..e51c10444 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -6,6 +6,39 @@ import "schedule/day.dart"; import "schedule/period.dart"; import "schedule/time.dart"; +/// Scopes for administrative privileges. +/// +/// Admin users use these scopes to determine what they can read/write. +enum AdminScope { + /// The admin can access and modify the calendar. + calendar, + + /// The admin can access and modify student schedules. + schedule, + + /// The admin can create and update sports games. + sports, +} + +/// Maps Strings to [AdminScope]s. +AdminScope parseAdminScope(String scope) { + switch (scope) { + case "calendar": return AdminScope.calendar; + case "schedule": return AdminScope.schedule; + case "sports": return AdminScope.sports; + default: throw ArgumentError("Invalid admin scope: $scope"); + } +} + +/// Maps [AdminScope]s to Strings. +String adminScopeToString(AdminScope scope) { + switch (scope) { + case AdminScope.calendar: return "calendar"; + case AdminScope.schedule: return "schedule"; + case AdminScope.sports: return "sports"; + } +} + /// What grade the user is in. /// /// The [User.grade] field could be an `int`, but by specifying the exact diff --git a/lib/src/models/data/user.dart b/lib/src/models/data/user.dart index d99904348..0875499a7 100644 --- a/lib/src/models/data/user.dart +++ b/lib/src/models/data/user.dart @@ -3,7 +3,7 @@ import "package:ramaz/services.dart"; import "model.dart"; -/// A data model to hold [User] and [Admin] objects. +/// A data model to hold and initialize the [User] object. /// /// This data model doesn't really update, however it's a convenient place to /// keep the user object. Any functionality relating to the admin is also @@ -13,22 +13,20 @@ class UserModel extends Model { /// The user object. late User data; - /// The admin object. - /// - /// If the user is not an admin ([Auth.isAdmin]) is false, this will be null. - Admin? admin; - /// The subjects this user has. /// /// For students this will be the courses they attend. For teachers, this /// will be the courses they teach. late Map subjects; + /// The permissions this user has, if they are an administrator. + late List? adminScopes; + /// Whether this user is an admin. /// /// Unlike [Auth.isAdmin], which authenticates with the server, this getter - /// simply checks to see if [admin] was initialized. - bool get isAdmin => admin != null; + /// simply checks to see if [adminScopes] was initialized. + bool get isAdmin => adminScopes != null; @override Future init() async { @@ -36,42 +34,10 @@ class UserModel extends Model { subjects = Subject.getSubjects( await Services.instance.database.getSections(data.sectionIDs) ); - if (await Auth.isAdmin) { - admin = Admin.fromJson( - await Services.instance.database.admin, - // if this object is created, the user is an admin - (await Auth.adminScopes)!, - ); - } - } - - /// Saves the admin data to the database. - Future saveAdmin() async { - await Services.instance.database.setAdmin(admin!.toJson()); - notifyListeners(); - } - - /// Adds a custom [Special] to the admin's profile. - Future addSpecialToAdmin(Special? special) async { - if (special == null) { - return; - } - admin!.specials.add(special); - return saveAdmin(); - } - - /// Replaces the custom [Special] at the given index in the user's profile. - Future replaceAdminSpecial(int index, Special? special) async { - if (special == null) { - return; - } - admin?.specials [index] = special; - return saveAdmin(); - } - - /// Removes a custom [Special] at a given index from the user's profile. - Future removeSpecialFromAdmin(int index) { - admin!.specials.removeAt(index); - return saveAdmin(); + final List? scopeStrings = await Auth.adminScopes; + adminScopes = scopeStrings == null ? null : [ + for (final String scope in scopeStrings) + parseAdminScope(scope) + ]; } } diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index b63f990d8..b65e2e0f4 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -17,11 +17,11 @@ class NavigationDrawer extends StatelessWidget { String? getRouteName(BuildContext context) => ModalRoute.of(context)!.settings.name; - bool get isScheduleAdmin => Models.instance.user.admin! - .scopes.contains(Scope.calendar); + bool get isScheduleAdmin => Models.instance.user + .adminScopes!.contains(AdminScope.calendar); - bool get isSportsAdmin => Models.instance.user.admin! - .scopes.contains(Scope.sports); + bool get isSportsAdmin => Models.instance.user + .adminScopes!.contains(AdminScope.sports); @override Widget build (BuildContext context) => ResponsiveBuilder( From e72e8d0e85f0783d6e946583cf25ae22ba116e1a Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Apr 2021 14:10:26 -0400 Subject: [PATCH 125/251] Fully migrated Special -> Schedule Renamed Schedule -> ScheduleModel Renamed ScheduleModel -> ScheduleViewModel Added static Schedule.schedules to allow for easy schedule lookup --- lib/models.dart | 11 +- lib/src/models/data/schedule.dart | 14 +- lib/src/models/view/admin_schedules.dart | 31 ++++ lib/src/models/view/builders/day_builder.dart | 25 +-- .../view/builders/reminder_builder.dart | 2 +- .../view/builders/schedule_builder.dart | 91 ++++++++++ .../models/view/builders/special_builder.dart | 171 ------------------ lib/src/models/view/calendar_editor.dart | 14 +- lib/src/models/view/home.dart | 2 +- lib/src/models/view/schedule.dart | 26 +-- lib/src/pages/admin/specials.dart | 45 +++-- lib/src/pages/builders/day_builder.dart | 29 ++- lib/src/pages/builders/special_builder.dart | 100 +++------- lib/src/pages/dashboard.dart | 6 +- lib/src/pages/schedule.dart | 25 +-- lib/src/services/cloud_db.dart | 21 ++- lib/src/services/database.dart | 10 +- lib/src/services/databases.dart | 28 ++- lib/src/services/local_db.dart | 32 ++-- .../widgets/atomic/admin/calendar_tile.dart | 2 +- lib/src/widgets/atomic/admin/period_tile.dart | 28 +-- lib/src/widgets/generic/class_list.dart | 6 +- lib/src/widgets/generic/footer.dart | 4 +- 23 files changed, 302 insertions(+), 421 deletions(-) create mode 100644 lib/src/models/view/admin_schedules.dart create mode 100644 lib/src/models/view/builders/schedule_builder.dart delete mode 100644 lib/src/models/view/builders/special_builder.dart diff --git a/lib/models.dart b/lib/models.dart index 08c5e07ec..d5c70d33b 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -39,9 +39,10 @@ export "src/models/data/sports.dart"; export "src/models/data/user.dart"; // view models +export "src/models/view/admin_schedules.dart"; export "src/models/view/builders/day_builder.dart"; export "src/models/view/builders/reminder_builder.dart"; -export "src/models/view/builders/special_builder.dart"; +export "src/models/view/builders/schedule_builder.dart"; export "src/models/view/builders/sports_builder.dart"; export "src/models/view/calendar_editor.dart"; export "src/models/view/feedback.dart"; @@ -52,8 +53,8 @@ export "src/models/view/sports.dart"; /// Bundles all the data models together. /// /// Each data model is responsible for different types of data. For example, -/// [Schedule] keeps track of the schedule (as well as associated data such as -/// the current period) and [UserModel] reads the user data. +/// [ScheduleModel] keeps track of the schedule (as well as associated data such +/// as the current period) and [UserModel] reads the user data. /// /// Each data model inherits from [Model], so it has [init] and [dispose] /// functions. This model serves to bundles those together, so that calling @@ -64,7 +65,7 @@ class Models extends Model { static Models instance = Models(); Reminders? _reminders; - Schedule? _schedule; + ScheduleModel? _schedule; Sports? _sports; UserModel? _user; @@ -72,7 +73,7 @@ class Models extends Model { Reminders get reminders => _reminders ??= Reminders(); /// The schedule data model. - Schedule get schedule => _schedule ??= Schedule(); + ScheduleModel get schedule => _schedule ??= ScheduleModel(); /// The sports data model. Sports get sports => _sports ??= Sports(); diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index ce59c158b..13ade1b70 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -8,7 +8,7 @@ import "model.dart"; import "reminders.dart"; /// A data model for the user's schedule. -class Schedule extends Model { +class ScheduleModel extends Model { /// The current date. /// /// This helps track when the day has changed. @@ -61,6 +61,10 @@ class Schedule extends Model { /// Initializes the calendar. Future initCalendar() async { + Schedule.schedules = [ + for (final Map json in await Services.instance.database.getSchedules()) + Schedule.fromJson(json) + ]; calendar = Day.getCalendar(await Services.instance.database.calendar); setToday(); notifyListeners(); @@ -127,7 +131,7 @@ class Schedule extends Model { } // So we have school today... - final int? newIndex = today?.period; + final int? newIndex = today?.getCurrentPeriod(); // Maybe the day changed if (newIndex != null && newIndex == periodIndex) { @@ -161,12 +165,12 @@ class Schedule extends Model { void updateReminders({bool scheduleNotifications = false}) { reminders ..currentReminders = reminders.getReminders( - period: period?.period, + period: period?.name, subject: subjects [period?.id]?.name, dayName: today?.name, ) ..nextReminders = reminders.getReminders( - period: nextPeriod?.period, + period: nextPeriod?.name, subject: subjects [nextPeriod?.id]?.name, dayName: today?.name, ); @@ -196,7 +200,7 @@ class Schedule extends Model { for (int index = periodIndex!; index < periods!.length; index++) { final Period period = periods! [index]; for (final int reminderIndex in reminders.getReminders( - period: period.period, + period: period.name, subject: subjects [period.id]?.name, dayName: today?.name, )) { diff --git a/lib/src/models/view/admin_schedules.dart b/lib/src/models/view/admin_schedules.dart new file mode 100644 index 000000000..555cd6918 --- /dev/null +++ b/lib/src/models/view/admin_schedules.dart @@ -0,0 +1,31 @@ +import "package:flutter/foundation.dart"; + +import "package:ramaz/data.dart"; +import "package:ramaz/services.dart"; + +// ignore: prefer_mixin +class AdminScheduleModel with ChangeNotifier { + final List schedules = Schedule.schedules; + + List get jsonSchedules => [ + for (final Schedule schedule in schedules) + schedule.toJson() + ]; + + Future saveSchedules() async { + await Services.instance.database.saveSchedules(jsonSchedules); + notifyListeners(); + } + + Future createSchedule(Schedule schedule) async { + schedules.add(schedule); + return saveSchedules(); + } + + Future deleteSchedule(Schedule schedule) async { + schedules.removeWhere( + (Schedule other) => other.name == schedule.name + ); + return saveSchedules(); + } +} diff --git a/lib/src/models/view/builders/day_builder.dart b/lib/src/models/view/builders/day_builder.dart index 3a6def5e0..391e07746 100644 --- a/lib/src/models/view/builders/day_builder.dart +++ b/lib/src/models/view/builders/day_builder.dart @@ -1,7 +1,6 @@ import "package:flutter/foundation.dart" show ChangeNotifier; import "package:ramaz/data.dart"; -import "package:ramaz/models.dart"; /// A view model for the creating a new [Day]. // ignore: prefer_mixin @@ -10,12 +9,12 @@ class DayBuilderModel with ChangeNotifier { bool _hasSchool; String? _name; - Special? _special; + Schedule? _schedule; /// Creates a view model for modifying a [Day]. DayBuilderModel({required Day? day, required this.date}) : _name = day?.name, - _special = day?.special, + _schedule = day?.schedule, _hasSchool = day != null; /// The name for this day. @@ -25,13 +24,13 @@ class DayBuilderModel with ChangeNotifier { notifyListeners(); } - /// The special for this day. - Special? get special => _special; - set special (Special? value) { + /// The schedule for this day. + Schedule? get schedule => _schedule; + set schedule (Schedule? value) { if (value == null) { return; } - _special = value; + _schedule = value; notifyListeners(); } @@ -43,19 +42,11 @@ class DayBuilderModel with ChangeNotifier { } /// The day being created (in present state). - /// - /// The model uses [name] and [special]. Day? get day => !hasSchool ? null : Day( name: name ?? "", - special: special ?? presetSpecials.first, + schedule: schedule ?? Schedule.schedules.first, ); - /// The built-in specials. - List get presetSpecials => Special.specials; - - /// Custom user-created specials. - List get userSpecials => Models.instance.user.admin!.specials; - /// Whether this day is ready to be created. - bool get ready => name != null && special != null; + bool get ready => name != null && schedule != null; } diff --git a/lib/src/models/view/builders/reminder_builder.dart b/lib/src/models/view/builders/reminder_builder.dart index 3952ee796..7c32450b7 100644 --- a/lib/src/models/view/builders/reminder_builder.dart +++ b/lib/src/models/view/builders/reminder_builder.dart @@ -6,7 +6,7 @@ import "package:ramaz/models.dart"; /// A view model for the dialog that allows the user to build a reminder. // ignore: prefer_mixin class RemindersBuilderModel with ChangeNotifier { - final Schedule _schedule; + final ScheduleModel _schedule; /// The type of reminder the user is building. ReminderTimeType? type; diff --git a/lib/src/models/view/builders/schedule_builder.dart b/lib/src/models/view/builders/schedule_builder.dart new file mode 100644 index 000000000..bdab857f2 --- /dev/null +++ b/lib/src/models/view/builders/schedule_builder.dart @@ -0,0 +1,91 @@ +import "package:flutter/foundation.dart" show ChangeNotifier; + +import "package:ramaz/data.dart"; + +/// A view model to create a [Schedule]. +// ignore: prefer_mixin +class ScheduleBuilderModel with ChangeNotifier { + /// The special that this special is based on. + Schedule? preset; + + ScheduleBuilderModel([this.preset]) { + usePreset(preset); + } + + /// Numbers for the periods. + /// + /// Regular periods have numbers, others (eg, homeroom and mincha) are null. + List periods = []; + String? _name; + int _numPeriods = 0; + + /// The name of this special. + /// + /// See [Schedule.name]. + String? get name => _name; + set name (String? value) { + _name = value; + notifyListeners(); + } + + /// The amount of periods. + /// + /// Grows and trims [periods] as necessary. This is [Schedule.periods.length]. + int get numPeriods => _numPeriods; + set numPeriods (int value) { + if (value == 0) { + periods.clear(); + } else if (value < numPeriods) { + periods.removeRange(value, periods.length); + } else if (_numPeriods == 0) { + periods.add( + const Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 50))) + ); + } else { + final Range prev = periods [value - 2].time; + periods.add( + Period.raw( + name: value.toString(), + time: Range( + Time(prev.end.hour + 1, 0), + Time(prev.end.hour + 2, 0) + ) + ) + ); + } + _numPeriods = value; + notifyListeners(); + } + + /// Whether this special is ready to be built. + bool get ready => numPeriods > 0 + && periods.isNotEmpty + && name != null && name!.isNotEmpty + && !Schedule.schedules.any((Schedule other) => other.name == name); + + /// The schedule being built. + Schedule get schedule => Schedule(name: name!, periods: periods); + + /// Switches out a time in [periods] with a new time. + void replaceTime(int index, Range range) { + periods [index] = Period.raw( + name: periods [index].name, + time: range, + ); + notifyListeners(); + } + + /// Sets properties of this special based on an existing special. + /// + /// The special can then be fine-tuned afterwards. + void usePreset(Schedule? schedule) { + if (schedule == null) { + return; + } + preset = schedule; + periods = List.of(schedule.periods); // make a copy + _name = schedule.name; + _numPeriods = schedule.periods.length; + notifyListeners(); + } +} diff --git a/lib/src/models/view/builders/special_builder.dart b/lib/src/models/view/builders/special_builder.dart deleted file mode 100644 index 59569abe2..000000000 --- a/lib/src/models/view/builders/special_builder.dart +++ /dev/null @@ -1,171 +0,0 @@ -import "package:flutter/foundation.dart" show ChangeNotifier; - -import "package:ramaz/data.dart"; - -/// A view model to create a [Special]. -// ignore: prefer_mixin -class SpecialBuilderModel with ChangeNotifier { - /// The special that this special is based on. - Special? preset; - - /// Numbers for the periods. - /// - /// Regular periods have numbers, others (eg, homeroom and mincha) are null. - List periods = []; - List _times = []; - List _skips = []; - String? _name; - int _numPeriods = 0; - int? _mincha, _homeroom; - - /// The times for the periods. - /// - /// See [Special.periods] - List get times => _times; - set times (List value) { - _times = List.of(value); - notifyListeners(); - } - - /// Indices of skipped periods. - /// - /// See [Special.skip]. - List get skips => _skips; - set skips (List value) { - _skips = value; - notifyListeners(); - } - - /// The name of this special. - /// - /// See [Special.name]. - String? get name => _name; - set name (String? value) { - _name = value; - notifyListeners(); - } - - /// The amount of periods. - /// - /// If a period is added, a [Range] is added to [times]. - /// In any case, [periods] is recalculated. - /// - /// This is essentially `special.periods.length`. - int get numPeriods => _numPeriods; - set numPeriods (int value) { - if (value == 0) { - times.clear(); - homeroom = null; - mincha = null; - } - if (value < numPeriods) { - times.removeRange(value, times.length); - if (homeroom == value) { - homeroom = null; - } - if (mincha == value) { - mincha = null; - } - } else { - if (_numPeriods == 0) { - times.add( - const Range(Time(8, 00), Time(8, 50)) - ); - } else { - final Range prev = times [value - 2]; - times.add( - Range( - Time(prev.end.hour + 1, 0), - Time(prev.end.hour + 2, 0) - ) - ); - } - } - _numPeriods = value; - periods = getIndices(); - notifyListeners(); - } - - /// The index of Mincha in [times]. - /// - /// See [Special.mincha]. - int? get mincha => _mincha; - set mincha (int? value) { - _mincha = value; - periods = getIndices(); - notifyListeners(); - } - - /// The index of homeroom in [times]. - /// - /// See [Special.homeroom]. - int? get homeroom => _homeroom; - set homeroom (int? value) { - _homeroom = value; - periods = getIndices(); - notifyListeners(); - } - - /// Whether this special is ready to be built. - bool get ready => numPeriods > 0 - && times.isNotEmpty - && name != null && name!.isNotEmpty - && !Special.specials.any((Special special) => special.name == name) - && (preset == null || special != preset); - - /// The special being built. - Special get special => Special( - name!, times, - homeroom: homeroom, - mincha: mincha, - skip: skips - ); - - /// Switches out a time in [times] with a new time. - void replaceTime(int index, Range range) { - times [index] = range; - notifyListeners(); - } - - /// Toggle whether a period is skipped. - void toggleSkip(int index) { - skips.contains(index) - ? skips.remove(index) - : skips.add(index); - notifyListeners(); - } - - /// Sets properties of this special based on an existing special. - /// - /// The special can then be fine-tuned afterwards. - void usePreset(Special? special) { - if (special == null) { - return; - } - preset = special; - _times = List.of(special.periods); - _skips = special.skip; - _name = special.name; - _numPeriods = special.periods.length; - _mincha = special.mincha; - _homeroom = special.homeroom; - periods = getIndices(); - notifyListeners(); - } - - /// Gets the period numbers for all periods. - /// - /// Any non-normal periods (eg, homeroom) are represented by `null` - List getIndices() { - int counter = 1; - return [ - for (int index = 0; index < _times.length; index++) - if (index == homeroom) - "homeroom" - else if (index == mincha) - "Mincha" - else - (counter++).toString() - ]; - } -} diff --git a/lib/src/models/view/calendar_editor.dart b/lib/src/models/view/calendar_editor.dart index e37679d52..20f02806e 100644 --- a/lib/src/models/view/calendar_editor.dart +++ b/lib/src/models/view/calendar_editor.dart @@ -52,7 +52,13 @@ class CalendarEditor with ChangeNotifier { .instance.database.cloudDatabase.getCalendarStream(month + 1) .listen( (List?> cal) { - calendar [month] = layoutMonth(Day.getMonth(cal), month); + calendar [month] = layoutMonth( + [ + for (final Map? day in cal) + day == null ? null : Day.fromJson(day), + ], + month + ); notifyListeners(); } ); @@ -104,11 +110,11 @@ class CalendarEditor with ChangeNotifier { await Services.instance.database.setCalendar( date.month, { - "calendar": Day.monthToJson([ + "calendar": [ for (final CalendarDay? day in calendar [date.month - 1]!) if (day != null) - day.schoolDay, - ]), + day.schoolDay?.toJson(), + ], "month": date.month } ); diff --git a/lib/src/models/view/home.dart b/lib/src/models/view/home.dart index 2af22702f..ce25da3c7 100644 --- a/lib/src/models/view/home.dart +++ b/lib/src/models/view/home.dart @@ -16,7 +16,7 @@ import "package:ramaz/services.dart"; /// have an up-to-date instance. // ignore: prefer_mixin class HomeModel with ChangeNotifier { - /// Listens to [Schedule] (and by extension, [Reminders]) and [Sports]. + /// Listens to [ScheduleModel] (and by extension, [Reminders]) and [Sports]. HomeModel() { Models.instance.schedule.addListener(notifyListeners); Models.instance.sports.addListener(notifyListeners); diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index 0f407851d..e475553ee 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -5,9 +5,9 @@ import "package:ramaz/models.dart"; /// A view model for the schedule page. // ignore: prefer_mixin -class ScheduleModel with ChangeNotifier { - /// The default [Special] for the UI. - static const Special defaultSpecial = Special.covid; +class ScheduleViewModel with ChangeNotifier { + /// The default [Schedule] for the UI. + static Schedule get defaultSpecial => Schedule.schedules.first; /// The default [Day] for the UI. late Day defaultDay; @@ -15,7 +15,7 @@ class ScheduleModel with ChangeNotifier { /// The schedule data model. /// /// Used to retrieve the schedule for a given day. - final Schedule schedule; + final ScheduleModel dataModel; /// The day whose schedule is being shown in the UI. late Day day; @@ -31,12 +31,12 @@ class ScheduleModel with ChangeNotifier { /// Also initializes the default day shown to the user. /// If today is a school day, then use that. Otherwise, use the /// defaults (see [defaultSpecial]). - ScheduleModel () : schedule = Models.instance.schedule { + ScheduleViewModel () : dataModel = Models.instance.schedule { defaultDay = Day( - name: schedule.user.schedule.keys.first, - special: defaultSpecial + name: Models.instance.user.data.schedule.keys.first, + schedule: defaultSpecial ); - day = schedule.today ?? defaultDay; + day = dataModel.today ?? defaultDay; } /// Attempts to set the UI to the schedule of the given day. @@ -49,7 +49,7 @@ class ScheduleModel with ChangeNotifier { date.month, date.day ); - final Day? selected = Day.getDate(schedule.calendar, justDate); + final Day? selected = Day.getDate(dataModel.calendar, justDate); if (selected == null) { throw Exception("No School"); } @@ -66,19 +66,19 @@ class ScheduleModel with ChangeNotifier { /// If the dayName is non-null, the special defaults to [defaultSpecial]. void update({ String? newName, - Special? newSpecial, + Schedule? newSpecial, void Function()? onInvalidSchedule, }) { final String name = newName ?? day.name; - final Special special = newSpecial ?? day.special; - day = Day(name: name, special: special); + final Schedule schedule = newSpecial ?? day.schedule; + day = Day(name: name, schedule: schedule); notifyListeners(); try { // Just to see if the computation is possible. // TODO: Move the logic from ClassList here. Models.instance.schedule.user.getPeriods(day); } on RangeError { // ignore: avoid_catching_errors - day = Day(name: day.name, special: defaultSpecial); + day = Day(name: day.name, schedule: defaultSpecial); if (onInvalidSchedule != null) { onInvalidSchedule(); } diff --git a/lib/src/pages/admin/specials.dart b/lib/src/pages/admin/specials.dart index adcae15d0..7142237de 100644 --- a/lib/src/pages/admin/specials.dart +++ b/lib/src/pages/admin/specials.dart @@ -1,56 +1,55 @@ import "package:flutter/material.dart"; +import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; /// A page to show the admin's custom specials. class AdminSpecialsPage extends StatelessWidget { - UserModel get model => Models.instance.user; const AdminSpecialsPage(); // If the user is on this page, they are an admin. // So, model.admin != null @override - Widget build(BuildContext context) => ModelListener( - model: () => model, - dispose: false, - builder: (_, UserModel model, __) => ResponsiveScaffold( + Widget build(BuildContext context) => ModelListener( + model: () => AdminScheduleModel(), + builder: (_, AdminScheduleModel model, __) => ResponsiveScaffold( appBar: AppBar(title: const Text("Custom schedules")), drawer: const NavigationDrawer(), floatingActionButton: FloatingActionButton( - onPressed: () async => model.addSpecialToAdmin( - await SpecialBuilder.buildSpecial(context), - ), + onPressed: () async { + final Schedule? schedule = await ScheduleBuilder.buildSpecial(context); + if (schedule == null) { + return; + } + await model.createSchedule(schedule); + }, child: const Icon(Icons.add), ), bodyBuilder: (_) => Padding( padding: const EdgeInsets.all(20), - child: model.admin!.specials.isEmpty + child: model.schedules.isEmpty ? const Center ( child: Text ( - "You don't have any schedules yet, but you can make one!", + "There are no schedules yet. Feel free to add one.", textScaleFactor: 1.5, textAlign: TextAlign.center, ) ) : ListView( children: [ - for (int index = 0; index < model.admin!.specials.length; index++) + for (final Schedule schedule in model.schedules) ListTile( - title: Text (model.admin!.specials [index].name), - trailing: IconButton( - icon: const Icon(Icons.remove_circle), - onPressed: () => model.removeSpecialFromAdmin(index), - ), - onTap: () async => model.replaceAdminSpecial( - index, - await SpecialBuilder.buildSpecial( - context, - model.admin!.specials [index] - ), - ) + title: Text(schedule.name), + onTap: () async { + final Schedule? newSchedule = + await ScheduleBuilder.buildSpecial(context, schedule); + if (newSchedule != null) { + await model.createSchedule(newSchedule); + } + }, ) ] ) diff --git a/lib/src/pages/builders/day_builder.dart b/lib/src/pages/builders/day_builder.dart index e314ff208..ffac92908 100644 --- a/lib/src/pages/builders/day_builder.dart +++ b/lib/src/pages/builders/day_builder.dart @@ -6,12 +6,11 @@ import "package:ramaz/widgets.dart"; /// A widget to guide the admin in modifying a day in the calendar. /// -/// Creates a pop-up that allows the admin to set the dayName and [Special] +/// Creates a pop-up that allows the admin to set the dayName and [Schedule] /// for a given day in the calendar. /// /// If [day] is provided, then the fields [DayBuilderModel.name], -/// [DayBuilderModel.special], are set to `day.name` ([Day.name]) and -/// `day.special` ([Day.special]), respectively. +/// [DayBuilderModel.schedule], are set to [Day.name] and [Day.schedule]. class DayBuilder extends StatelessWidget { final DateTime date; @@ -77,21 +76,19 @@ class DayBuilder extends StatelessWidget { runSpacing: 3, children: [ const Text("Schedule"), - DropdownButton( - value: - (model.presetSpecials + model.userSpecials).contains(model.special) - ? model.special : null, + DropdownButton( + value: model.schedule?.name, hint: const Text("Schedule"), - onChanged: !model.hasSchool ? null : - (Special? special) => model.special = special ?? model.special, - items: [ - for ( - final Special special in - model.presetSpecials + model.userSpecials - ) DropdownMenuItem( - value: special, - child: Text(special.name), + onChanged: !model.hasSchool ? null : (String? value) => + model.schedule = Schedule.schedules.firstWhere( + (Schedule schedule) => schedule.name == value ), + items: [ + for (final Schedule schedule in Schedule.schedules) + DropdownMenuItem( + value: schedule.name, + child: Text(schedule.name), + ), ], ) ] diff --git a/lib/src/pages/builders/special_builder.dart b/lib/src/pages/builders/special_builder.dart index 1e23b7e86..2552536dd 100644 --- a/lib/src/pages/builders/special_builder.dart +++ b/lib/src/pages/builders/special_builder.dart @@ -4,37 +4,37 @@ import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; import "package:ramaz/widgets.dart"; -/// A widget to guide the admin in creating a [Special]. +/// A widget to guide the admin in creating a [Schedule]. /// -/// The [Special] doesn't have to be created from scratch, it can be based on -/// an existing [Special] by passing it as a parameter to [SpecialBuilder()]. -class SpecialBuilder extends StatefulWidget { - /// Returns the [Special] created by this widget. - static Future buildSpecial( +/// The [Schedule] doesn't have to be created from scratch, it can be based on +/// an existing schedule by passing it as a parameter to [ScheduleBuilder()]. +class ScheduleBuilder extends StatefulWidget { + /// Returns the [Schedule] created by this widget. + static Future buildSpecial( BuildContext context, - [Special? preset] + [Schedule? preset] ) => showDialog( context: context, - builder: (_) => SpecialBuilder(preset), + builder: (_) => ScheduleBuilder(preset), ); - /// The [Special] to base this [Special] on. - final Special? preset; + /// The [Schedule] to base this schedule on. + final Schedule? preset; - /// Creates a widget to guide the user in creating a [Special]. - const SpecialBuilder([this.preset]); + /// Creates a widget to guide the user in creating a schedule. + const ScheduleBuilder([this.preset]); @override SpecialBuilderState createState() => SpecialBuilderState(); } -/// A state for a [SpecialBuilder]. +/// A state for a [ScheduleBuilder]. /// /// A state is needed to keep the [TextEditingController] from rebuilding. -class SpecialBuilderState extends State { - /// A controller to hold the name of the [Special]. +class SpecialBuilderState extends State { + /// A controller to hold the name of the [Schedule]. /// - /// This will be preset with the name of [SpecialBuilder.preset]. + /// This will be preset with the name of [ScheduleBuilder.preset]. final TextEditingController controller = TextEditingController(); /// If the name of the schedule conflicts with another one. @@ -51,9 +51,9 @@ class SpecialBuilderState extends State { } @override - Widget build(BuildContext context) => ModelListener( - model: () => SpecialBuilderModel()..usePreset(widget.preset), - builder: (_, SpecialBuilderModel model, Widget? cancel) => Scaffold( + Widget build(BuildContext context) => ModelListener( + model: () => ScheduleBuilderModel(widget.preset), + builder: (_, ScheduleBuilderModel model, Widget? cancel) => Scaffold( appBar: AppBar( title: const Text("Make new schedule"), actions: [ @@ -61,7 +61,7 @@ class SpecialBuilderState extends State { icon: const Icon(Icons.sync), tooltip: "Use preset", onPressed: () async { - final Special? special = await showModalBottomSheet( + final Schedule? special = await showModalBottomSheet( context: context, builder: (BuildContext context) => ListView( children: [ @@ -72,20 +72,11 @@ class SpecialBuilderState extends State { child: Text("Use a preset", textScaleFactor: 1.5), ), ), - for (final Special special in Special.specials) + for (final Schedule schedule in Schedule.schedules) ListTile( - title: Text (special.name), - onTap: () => Navigator.of(context).pop(special), + title: Text (schedule.name), + onTap: () => Navigator.of(context).pop(schedule), ), - const Divider(), - for ( - final Special special in - // only admins can access this scren - Models.instance.user.admin!.specials - ) ListTile( - title: Text (special.name), - onTap: () => Navigator.of(context).pop(special), - ), ] ) ); @@ -101,7 +92,7 @@ class SpecialBuilderState extends State { label: const Text("Save"), icon: const Icon(Icons.done), onPressed: !model.ready ? null : - () => Navigator.of(context).pop(model.special), + () => Navigator.of(context).pop(model.schedule), backgroundColor: model.ready ? Theme.of(context).accentColor : Theme.of(context).disabledColor, @@ -114,8 +105,8 @@ class SpecialBuilderState extends State { child: TextField( controller: controller, onChanged: (String value) { - conflicting = Special.specials.any( - (Special special) => special.name == value + conflicting = Schedule.schedules.any( + (Schedule other) => other.name == value ); model.name = value; }, @@ -131,47 +122,10 @@ class SpecialBuilderState extends State { ), ), const SizedBox(height: 20), - ListTile( - title: const Text("Homeroom"), - trailing: DropdownButton( - value: model.homeroom, - onChanged: (int? index) => model.homeroom = index, - items: [ - const DropdownMenuItem( - value: null, - child: Text("None") - ), - for (int index = 0; index < model.numPeriods; index++) - DropdownMenuItem( - value: index, - child: Text ("${index + 1}"), - ) - ] - ) - ), - ListTile( - title: const Text("Mincha"), - trailing: DropdownButton( - value: model.mincha, - onChanged: (int? index) => model.mincha = index, - items: [ - const DropdownMenuItem( - value: null, - child: Text("None") - ), - for (int index = 0; index < model.numPeriods; index++) - DropdownMenuItem( - value: index, - child: Text ("${index + 1}"), - ) - ] - ) - ), - const SizedBox(height: 20), for (int index = 0; index < model.numPeriods; index++) PeriodTile( model: model, - range: model.times [index], + range: model.periods [index].time, index: index, ), Row( diff --git a/lib/src/pages/dashboard.dart b/lib/src/pages/dashboard.dart index 15ab3a100..e0ca0b54e 100644 --- a/lib/src/pages/dashboard.dart +++ b/lib/src/pages/dashboard.dart @@ -8,7 +8,7 @@ const List weekdayNames = [ ]; class Dashboard extends NavigationItem { - final Schedule scheduleModel = Models.instance.schedule; + final ScheduleModel scheduleModel = Models.instance.schedule; /// The reminders data model. final Reminders remindersModel = Models.instance.reminders; @@ -107,7 +107,7 @@ class Dashboard extends NavigationItem { /// Holds the schedule info on the home page. class ScheduleSlot extends StatelessWidget { /// The schedule data model. - late final Schedule scheduleModel; + late final ScheduleModel scheduleModel; /// The reminders data model. late final Reminders remindersModel; @@ -141,7 +141,7 @@ class ScheduleSlot extends StatelessWidget { Text( scheduleModel.hasSchool // if there is school, then scheduleModel.today != null - ? "Schedule: ${scheduleModel.today!.special.name}" + ? "Schedule: ${scheduleModel.today!.schedule.name}" : "There is no school today", textAlign: TextAlign.center, style: Theme.of(context).textTheme.headline5, diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index 5466449eb..dba200aae 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -6,7 +6,7 @@ import "package:ramaz/models.dart"; import "package:ramaz/widgets.dart"; class ResponsiveSchedule extends NavigationItem { - final ScheduleModel model = ScheduleModel(); + final ScheduleViewModel model = ScheduleViewModel(); ResponsiveSchedule() : super(label: "Schedule", icon: const Icon(Icons.schedule)); @@ -14,7 +14,7 @@ class ResponsiveSchedule extends NavigationItem { /// Allows the user to select a day in the calendar to view. /// /// If there is no school on that day, a [SnackBar] will be shown. - Future viewDay(ScheduleModel model, BuildContext context) async { + Future viewDay(ScheduleViewModel model, BuildContext context) async { final DateTime? selected = await pickDate( context: context, initialDate: model.date, @@ -51,10 +51,10 @@ class ResponsiveSchedule extends NavigationItem { ); @override - Widget build (BuildContext context) => ModelListener( + Widget build (BuildContext context) => ModelListener( model: () => model, dispose: false, - builder: (_, ScheduleModel model, __) => Column( + builder: (_, ScheduleViewModel model, __) => Column( children: [ ListTile ( title: const Text ("Day"), @@ -75,23 +75,18 @@ class ResponsiveSchedule extends NavigationItem { ), ListTile ( title: const Text ("Schedule"), - trailing: DropdownButton ( - value: model.day.special, - onChanged: (Special? special) => model.update( + trailing: DropdownButton ( + value: model.day.schedule, + onChanged: (Schedule? special) => model.update( newSpecial: special, onInvalidSchedule: () => handleInvalidSchedule(context), ), items: [ - for (final Special special in Special.specials) + for (final Schedule schedule in Schedule.schedules) DropdownMenuItem( - value: special, - child: Text (special.name), + value: schedule, + child: Text (schedule.name), ), - if (!Special.specials.contains(model.day.special)) - DropdownMenuItem( - value: model.day.special, - child: Text(model.day.special.name) - ) ] ) ), diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index fc8d25d14..b8e298f35 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -129,6 +129,10 @@ class CloudDatabase extends Database { : "${_now.year - 1}-${_now.year}" ); + /// The document for the schedules of the calendar. + DocumentReference get schedulesDocument => + calendarCollection.doc("schedules"); + // Service methods @override @@ -157,7 +161,6 @@ class CloudDatabase extends Database { /// No-op -- The user cannot edit their own profile. /// /// User profiles can only be modified by the admin SDK. - /// Admin profiles may be modified. See [setAdmin]. @override Future setUser(Map json) async {} @@ -177,6 +180,15 @@ class CloudDatabase extends Database { return document.throwIfNull("No entry in calendar for $month"); } + @override + Future> getSchedules() async => ( + await schedulesDocument.throwIfNull("Cannot find schedules") + ) ["schedules"]; + + @override + Future saveSchedules(List schedules) => + schedulesDocument.set({"schedules": schedules}); + @override Future setCalendar(int month, Map json) => calendarCollection.doc(month.toString()).set(json); @@ -210,13 +222,6 @@ class CloudDatabase extends Database { Future deleteReminder(String oldHash) async => (await remindersCollection.findDocument("hash", oldHash)).delete(); - @override - Future> get admin => - adminDocument.throwIfNull("User is not admin"); - - @override - Future setAdmin(Map json) => adminDocument.set(json); - @override Future>> get sports async { final Map data = await sportsDocument diff --git a/lib/src/services/database.dart b/lib/src/services/database.dart index 8e3e8daa2..bd390e392 100644 --- a/lib/src/services/database.dart +++ b/lib/src/services/database.dart @@ -78,6 +78,10 @@ abstract class Database extends Service { /// with [calendarKey]. Future> getCalendarMonth(int month); + Future> getSchedules(); + + Future saveSchedules(List schedules); + /// Changes the calendar in the database. /// /// The fact that this method takes a [month] parameter while [calendar] does @@ -103,12 +107,6 @@ abstract class Database extends Service { /// deletes it. Future deleteReminder(String oldHash); - /// The admin object (or null). - Future?> get admin; - - /// Sets the admin object for this user. - Future setAdmin(Map json); - /// The sports games. /// /// Admins can change this with [setSports]. diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart index 214251fd9..bf5969743 100644 --- a/lib/src/services/databases.dart +++ b/lib/src/services/databases.dart @@ -1,4 +1,3 @@ -import "auth.dart"; import "cloud_db.dart"; import "database.dart"; import "local_db.dart"; @@ -47,20 +46,16 @@ class Databases extends Database { for (int index = 0; index < cloudReminders.length; index++) { await localDatabase.updateReminder(index.toString(), cloudReminders [index]); } - - if (await Auth.isAdmin) { - await localDatabase.setAdmin(await cloudDatabase.admin); - } } /// Downloads the calendar and saves it to the local database. Future updateCalendar() async { for (int month = 1; month <= 12; month++) { await localDatabase.setCalendar( - month, - await cloudDatabase.getCalendarMonth(month) + month, await cloudDatabase.getCalendarMonth(month) ); } + await localDatabase.saveSchedules(await cloudDatabase.getSchedules()); } /// Downloads sports games and saves them to the local database. @@ -119,6 +114,15 @@ class Databases extends Database { Future> getCalendarMonth(int month) => localDatabase.getCalendarMonth(month); + @override + Future> getSchedules() => localDatabase.getSchedules(); + + @override + Future saveSchedules(List schedules) async { + await cloudDatabase.saveSchedules(schedules); + await localDatabase.saveSchedules(schedules); + } + @override Future setCalendar(int month, Map json) async { await cloudDatabase.setCalendar(month, json); @@ -140,16 +144,6 @@ class Databases extends Database { await localDatabase.deleteReminder(oldHash); } - @override - Future> get admin => localDatabase.admin; - - @override - Future setAdmin(Map json) async { - await cloudDatabase.setAdmin(json); - await localDatabase.setAdmin(json); - } - - @override Future>> get sports => localDatabase.sports; diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index f78b37b3d..2cd4f6464 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -153,6 +153,9 @@ class LocalDatabase extends Database { /// The name for the sports object store. static const String sportsStoreName = "sports"; + /// The name for the schedules object store. + static const String scheduleStoreName = "schedules"; + /// All the object stores. /// /// This is used in [signOut] to purge all the data. @@ -171,7 +174,7 @@ class LocalDatabase extends Database { try { database = await (await idbFactory).open( "ramaz.db", - version: 2, + version: 3, onUpgradeNeeded: (idb.VersionChangeEvent event) { switch(event.oldVersion) { case 0: event.database @@ -186,6 +189,9 @@ class LocalDatabase extends Database { ..deleteObjectStore(reminderStoreName) ..createObjectStore(reminderStoreName, autoIncrement: true) .createIndex("hash", "hash", unique: true); + continue two; + two: case 2: event.database + .createObjectStore(scheduleStoreName, keyPath: "name"); } }, ); @@ -250,10 +256,19 @@ class LocalDatabase extends Database { ); @override - Future setCalendar(int month, Map json) async { - await database.update(calendarStoreName, json); + Future> getSchedules() => database.getAll(scheduleStoreName); + + @override + Future saveSchedules(List schedules) async { + for (final Map json in schedules) { + await database.update(scheduleStoreName, json); + } } + @override + Future setCalendar(int month, Map json) => + database.update(calendarStoreName, json); + @override Future>> get reminders => database.getAll(reminderStoreName); @@ -280,17 +295,6 @@ class LocalDatabase extends Database { ) )?.delete(); - @override - Future> get admin async => database.throwIfNull( - storeName: adminStoreName, - key: Auth.email!, - message: "Admin data not found", - ); - - @override - Future setAdmin(Map json) => - database.update(adminStoreName, json); - @override Future>> get sports => database.getAll(sportsStoreName); diff --git a/lib/src/widgets/atomic/admin/calendar_tile.dart b/lib/src/widgets/atomic/admin/calendar_tile.dart index 4c47b42a2..0722ce353 100644 --- a/lib/src/widgets/atomic/admin/calendar_tile.dart +++ b/lib/src/widgets/atomic/admin/calendar_tile.dart @@ -37,7 +37,7 @@ class CalendarTile extends StatelessWidget{ Expanded(child: Text("No school", textScaleFactor: textSize)) else ...[ Expanded(child: Text (day!.name, textScaleFactor: textSize)), - Expanded(child: Text (day!.special.name, textScaleFactor: 0.8)), + Expanded(child: Text (day!.schedule.name, textScaleFactor: 0.8)), ], const Spacer(), ] diff --git a/lib/src/widgets/atomic/admin/period_tile.dart b/lib/src/widgets/atomic/admin/period_tile.dart index a3e695048..7190d5ba3 100644 --- a/lib/src/widgets/atomic/admin/period_tile.dart +++ b/lib/src/widgets/atomic/admin/period_tile.dart @@ -4,10 +4,10 @@ import "package:ramaz/constants.dart"; import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; -/// A widget to represent a [Period] when creating a [Special]. +/// A widget to represent a [Period] when creating a [Schedule]. class PeriodTile extends StatelessWidget { /// The view model to decide the properties of this period. - final SpecialBuilderModel model; + final ScheduleBuilderModel model; /// The times for this period. final Range range; @@ -18,19 +18,15 @@ class PeriodTile extends StatelessWidget { /// The [Activity] for this period. final Activity? activity; - /// Whether this period is skipped. - final bool skipped; - - /// The index of this period in [SpecialBuilderModel.times]. + /// The index of this period in [ScheduleBuilderModel.periods]. final int index; - /// Creates a widget to edit a period in a [Special]. + /// Creates a widget to edit a period in a [Schedule]. PeriodTile({ required this.model, required this.range, required this.index, }) : - skipped = model.skips.contains(index), activity = null, start = range.start.asTimeOfDay, end = range.end.asTimeOfDay; @@ -40,22 +36,8 @@ class PeriodTile extends StatelessWidget { height: 55, child: Stack ( children: [ - if (skipped) Center( - child: Container( - height: 5, - color: Colors.black, - ), - ), ListTile( - subtitle: Text(model.periods [index]), - leading: IconButton( - icon: Icon( - model.skips.contains(index) - ? Icons.add_circle_outline - : Icons.remove_circle_outline - ), - onPressed: () => model.toggleSkip(index), - ), + subtitle: Text(model.periods [index].name), title: Text.rich( TextSpan( children: [ diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index 612256c46..08f197c5d 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -134,11 +134,11 @@ class ClassList extends StatelessWidget { if (period.id != null) "ID: ${period.id}", ], - title: int.tryParse(period.period) == null + title: int.tryParse(period.name) == null ? period.getName(subject) - : "${period.period}: ${period.getName(subject)}", + : "${period.name}: ${period.getName(subject)}", reminders: Models.instance.reminders.getReminders( - period: period.period, + period: period.name, dayName: day.name, subject: subject?.name, ), diff --git a/lib/src/widgets/generic/footer.dart b/lib/src/widgets/generic/footer.dart index febfda8e6..cf86464af 100644 --- a/lib/src/widgets/generic/footer.dart +++ b/lib/src/widgets/generic/footer.dart @@ -16,12 +16,12 @@ class Footer extends StatelessWidget { static const double textScale = 1.25; @override - Widget build (BuildContext context) => ModelListener( + Widget build (BuildContext context) => ModelListener( model: () => Models.instance.schedule, dispose: false, // ignore: sort_child_properties_last child: Container(height: 0, width: 0), - builder: (_, Schedule schedule, Widget? blank) => + builder: (_, ScheduleModel schedule, Widget? blank) => schedule.nextPeriod == null ? blank! : BottomSheet ( enableDrag: false, onClosing: () {}, From 7a01a4aeb3dc8700ced57891479748324d001ef7 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Apr 2021 15:33:43 -0400 Subject: [PATCH 126/251] Migrated all JSON from Map -> Map --- lib/src/data/contact_info.dart | 2 +- lib/src/data/feedback.dart | 2 +- lib/src/data/reminder.dart | 6 +++--- .../data/reminders/period_reminder_time.dart | 4 ++-- lib/src/data/reminders/reminder_time.dart | 4 ++-- .../data/reminders/subject_reminder_time.dart | 4 ++-- lib/src/data/schedule/activity.dart | 20 +++++++++---------- lib/src/data/schedule/advisory.dart | 2 +- lib/src/data/schedule/day.dart | 2 +- lib/src/data/schedule/period.dart | 4 ++-- lib/src/data/schedule/schedule.dart | 2 +- lib/src/data/schedule/subject.dart | 6 +++--- lib/src/data/schedule/time.dart | 12 +++++------ lib/src/data/sports.dart | 18 ++++++++--------- lib/src/data/user.dart | 8 ++++---- 15 files changed, 48 insertions(+), 48 deletions(-) diff --git a/lib/src/data/contact_info.dart b/lib/src/data/contact_info.dart index 9abe5b274..e29810313 100644 --- a/lib/src/data/contact_info.dart +++ b/lib/src/data/contact_info.dart @@ -25,7 +25,7 @@ class ContactInfo { }); /// Creates a contact from JSON. - ContactInfo.fromJson(Map json) : + ContactInfo.fromJson(Map json) : name = json ["name"], email = json ["email"], phoneNumber = json ["phoneNumber"]; diff --git a/lib/src/data/feedback.dart b/lib/src/data/feedback.dart index 0e6c7a9d8..91d24a918 100644 --- a/lib/src/data/feedback.dart +++ b/lib/src/data/feedback.dart @@ -30,7 +30,7 @@ class Feedback { name = anonymous ? null : name; /// A JSON representation of this feedback. - Map toJson() => { + Map toJson() => { "message": message, "email": email, "name": name, diff --git a/lib/src/data/reminder.dart b/lib/src/data/reminder.dart index e323f80cf..51ed63442 100644 --- a/lib/src/data/reminder.dart +++ b/lib/src/data/reminder.dart @@ -32,7 +32,7 @@ class Reminder { /// Calls [Reminder.fromJson] for every JSON object in the list. static List fromList(List reminders) => [ for (final dynamic json in reminders) - Reminder.fromJson(Map.from(json)) + Reminder.fromJson(Map.from(json)) ]; /// The message this reminder should show. @@ -53,12 +53,12 @@ class Reminder { /// to [ReminderTime.fromJson] Reminder.fromJson(dynamic json) : message = json ["message"], - time = ReminderTime.fromJson(Map.from(json ["time"])); + time = ReminderTime.fromJson(Map.from(json ["time"])); @override String toString() => "$message ($time)"; /// Returns a JSON representation of this reminder. - Map toJson() => { + Map toJson() => { "message": message, "time": time.toJson(), "hash": hash, diff --git a/lib/src/data/reminders/period_reminder_time.dart b/lib/src/data/reminders/period_reminder_time.dart index 402701425..cf786b001 100644 --- a/lib/src/data/reminders/period_reminder_time.dart +++ b/lib/src/data/reminders/period_reminder_time.dart @@ -23,7 +23,7 @@ class PeriodReminderTime extends ReminderTime { /// /// `json ["period"]` should be a valid period for that day, /// notwithstanding any schedule changes (like an "early dismissal"). - PeriodReminderTime.fromJson(Map json) : + PeriodReminderTime.fromJson(Map json) : dayName = json ["dayName"], period = json ["period"], super (repeats: json ["repeats"], type: ReminderTimeType.period); @@ -33,7 +33,7 @@ class PeriodReminderTime extends ReminderTime { "${repeats ? 'Repeats every ' : ''}$dayName-$period"; @override - Map toJson() => { + Map toJson() => { "dayName": dayName, "period": period, "repeats": repeats, diff --git a/lib/src/data/reminders/reminder_time.dart b/lib/src/data/reminders/reminder_time.dart index 9cdc6e34f..a9e535ca2 100644 --- a/lib/src/data/reminders/reminder_time.dart +++ b/lib/src/data/reminders/reminder_time.dart @@ -61,7 +61,7 @@ abstract class ReminderTime { /// "name": "Monday", /// } /// ``` - factory ReminderTime.fromJson(Map json) { + factory ReminderTime.fromJson(Map json) { switch (stringToReminderTime [json ["type"]]) { case ReminderTimeType.period: return PeriodReminderTime.fromJson(json); case ReminderTimeType.subject: return SubjectReminderTime.fromJson(json); @@ -96,7 +96,7 @@ abstract class ReminderTime { } /// Returns this [ReminderTime] as JSON. - Map toJson(); + Map toJson(); /// Checks if the reminder should be displayed. /// diff --git a/lib/src/data/reminders/subject_reminder_time.dart b/lib/src/data/reminders/subject_reminder_time.dart index e16712328..635aed9c1 100644 --- a/lib/src/data/reminders/subject_reminder_time.dart +++ b/lib/src/data/reminders/subject_reminder_time.dart @@ -14,7 +14,7 @@ class SubjectReminderTime extends ReminderTime { /// Returns a new [SubjectReminderTime] from a JSON object. /// /// The fields `repeats` and `name` must not be null. - SubjectReminderTime.fromJson(Map json) : + SubjectReminderTime.fromJson(Map json) : name = json ["name"], super (repeats: json ["repeats"], type: ReminderTimeType.subject); @@ -22,7 +22,7 @@ class SubjectReminderTime extends ReminderTime { String toString() => (repeats ? "Repeats every " : "") + name; @override - Map toJson() => { + Map toJson() => { "name": name, "repeats": repeats, "type": reminderTimeToString [type], diff --git a/lib/src/data/schedule/activity.dart b/lib/src/data/schedule/activity.dart index 1d2609a4a..727bbd068 100644 --- a/lib/src/data/schedule/activity.dart +++ b/lib/src/data/schedule/activity.dart @@ -24,13 +24,13 @@ class GradeActivity { }); /// Creates a container for activities from a JSON object. - GradeActivity.fromJson(Map json) : - freshmen = Activity.fromJson(Map.from(json ["freshmen"])), + GradeActivity.fromJson(Map json) : + freshmen = Activity.fromJson(Map.from(json ["freshmen"])), sophomores = Activity.fromJson( - Map.from(json ["sophomores"]) + Map.from(json ["sophomores"]) ), - juniors = Activity.fromJson(Map.from(json ["juniors"])), - seniors = Activity.fromJson(Map.from(json ["seniors"])); + juniors = Activity.fromJson(Map.from(json ["juniors"])), + seniors = Activity.fromJson(Map.from(json ["seniors"])); @override String toString() => @@ -93,11 +93,11 @@ String activityTypeToString(ActivityType type) { @immutable class Activity { /// Parses a JSON map of Activities still in JSON. - static Map getActivities(Map json) { + static Map getActivities(Map json) { final Map result = {}; - for (final MapEntry entry in json.entries) { + for (final MapEntry entry in json.entries) { result [entry.key] = Activity.fromJson( - Map.from(entry.value) + Map.from(entry.value) ); } return result; @@ -124,9 +124,9 @@ class Activity { type = ActivityType.grade; /// Creates an activity from a JSON object. - factory Activity.fromJson(Map json) => json ["message"] is Map + factory Activity.fromJson(Map json) => json ["message"] is Map ? Activity.grade( - GradeActivity.fromJson(Map.from(json ["message"])) + GradeActivity.fromJson(Map.from(json ["message"])) ) : Activity( type: parseActivityType(json ["type"]), diff --git a/lib/src/data/schedule/advisory.dart b/lib/src/data/schedule/advisory.dart index f46ec551f..5b78358a2 100644 --- a/lib/src/data/schedule/advisory.dart +++ b/lib/src/data/schedule/advisory.dart @@ -21,7 +21,7 @@ class Advisory { /// Creates an advisory object from JSON. /// /// This JSON can be null, so this constructor should only be called if needed. - Advisory.fromJson(Map json) : + Advisory.fromJson(Map json) : id = json ["id"], room = json ["room"]; } \ No newline at end of file diff --git a/lib/src/data/schedule/day.dart b/lib/src/data/schedule/day.dart index e49cd6afd..ce556e1b1 100644 --- a/lib/src/data/schedule/day.dart +++ b/lib/src/data/schedule/day.dart @@ -73,7 +73,7 @@ class Day { other.schedule == schedule; /// Returns a JSON representation of this Day. - Map toJson() => { + Map toJson() => { "name": name, "schedule": schedule.name, }; diff --git a/lib/src/data/schedule/period.dart b/lib/src/data/schedule/period.dart index 581049fc7..cc6a62f44 100644 --- a/lib/src/data/schedule/period.dart +++ b/lib/src/data/schedule/period.dart @@ -19,7 +19,7 @@ class PeriodData { static List getList(List json) => [ for (final dynamic periodJson in json) periodJson == null ? null : - PeriodData.fromJson(Map.from(periodJson)) + PeriodData.fromJson(Map.from(periodJson)) ]; /// The room the student needs to be in for this period. @@ -41,7 +41,7 @@ class PeriodData { /// Returns a [PeriodData] from a JSON object. /// /// Both `json ["room"]` and `json ["id"]` must be non-null. - factory PeriodData.fromJson(Map json) => PeriodData( + factory PeriodData.fromJson(Map json) => PeriodData( room: json ["room"], id: json ["id"] ); diff --git a/lib/src/data/schedule/schedule.dart b/lib/src/data/schedule/schedule.dart index 7565d3749..361b93426 100644 --- a/lib/src/data/schedule/schedule.dart +++ b/lib/src/data/schedule/schedule.dart @@ -93,7 +93,7 @@ class Schedule { "name": name, "periods": [ for (final Period period in periods) - period.toJson, + period.toJson(), ], }; diff --git a/lib/src/data/schedule/subject.dart b/lib/src/data/schedule/subject.dart index c01ab7d67..d5f014520 100644 --- a/lib/src/data/schedule/subject.dart +++ b/lib/src/data/schedule/subject.dart @@ -14,9 +14,9 @@ class Subject { /// corresponding [Subject] instances. /// See [Subject.fromJson] for more details. static Map getSubjects( - Map> data + Map data ) => data.map ( - (String id, Map json) => MapEntry ( + (String id, Map json) => MapEntry ( id, Subject.fromJson(json) ) @@ -37,7 +37,7 @@ class Subject { /// Returns a [Subject] instance from a JSON object. /// /// The JSON map must have a `teacher` and `name` field. - Subject.fromJson(Map json) : + Subject.fromJson(Map json) : name = json ["name"], teacher = json ["teacher"]; diff --git a/lib/src/data/schedule/time.dart b/lib/src/data/schedule/time.dart index 93794d8e8..3eb7c2c0d 100644 --- a/lib/src/data/schedule/time.dart +++ b/lib/src/data/schedule/time.dart @@ -23,12 +23,12 @@ class Time { /// Returns a new [Time] object from JSON data. /// /// The json must have `hour` and `minutes` fields that map to integers. - Time.fromJson(Map json) : + Time.fromJson(Map json) : hour = json ["hour"], minutes = json ["minutes"]; /// Returns this obect in JSON form - Map toJson() => { + Map toJson() => { "hour": hour, "minutes": minutes, }; @@ -87,12 +87,12 @@ class Range { /// The json must have `start` and `end` fields /// that map to [Time] JSON objects. /// See [Time.fromJson] for more details. - Range.fromJson(Map json) : - start = Time.fromJson(Map.from(json ["start"])), - end = Time.fromJson(Map.from(json ["end"])); + Range.fromJson(Map json) : + start = Time.fromJson(Map.from(json ["start"])), + end = Time.fromJson(Map.from(json ["end"])); /// Returns a JSON representation of this range. - Map toJson() => { + Map toJson() => { "start": start.toJson(), "end": end.toJson(), }; diff --git a/lib/src/data/sports.dart b/lib/src/data/sports.dart index fbb126e32..96d790a9d 100644 --- a/lib/src/data/sports.dart +++ b/lib/src/data/sports.dart @@ -78,7 +78,7 @@ class Scores { /// - an "isHome" field, which should be a bool. See [isHome]. /// - an "otherScore" field, which should be an integer. See [otherScore]. /// - a "ramazScore" field, which should be an integer. See [ramazScore]. - Scores.fromJson(Map json) : + Scores.fromJson(Map json) : isHome = json ["isHome"], ramazScore = json ["ramaz"], otherScore = json ["other"]; @@ -87,7 +87,7 @@ class Scores { /// /// Passing the result of this function to [Scores.fromJson()] should /// return an equivalent object. - Map toJson() => { + Map toJson() => { "isHome": isHome, "ramaz": ramazScore, "other": otherScore, @@ -120,15 +120,15 @@ class SportsGame { /// Converts a list of JSON entries into a list of [SportsGame]s. /// /// This method is needed since it casts each `dynamic` entry to a - /// `Map`, and then passes those values to + /// `Map`, and then passes those values to /// [SportsGame.fromJson]. - static List fromList(List> listJson) => [ - for (final Map json in listJson) + static List fromList(List listJson) => [ + for (final Map json in listJson) SportsGame.fromJson(json) ]; /// Converts a list of [SportsGame]s into a list of JSON entries. - static List> getJsonList(List games) => [ + static List getJsonList(List games) => [ for (final SportsGame game in games) game.toJson() ]; @@ -186,7 +186,7 @@ class SportsGame { /// - a "home" field (bool) /// - an "opponent" field (String) /// - a "scores" field. See [Scores.fromJson] for format. - SportsGame.fromJson(Map json) : + SportsGame.fromJson(Map json) : sport = stringToSport [json ["sport"]]!, date = DateTime.parse(json ["date"]), times = Range.fromJson(json ["times"]), @@ -194,7 +194,7 @@ class SportsGame { isHome = json ["isHome"], opponent = json ["opponent"], scores = json ["scores"] == null ? null : Scores.fromJson( - Map.from(json ["scores"]) + Map.from(json ["scores"]) ); // Specifically not including scores, since this can be used @@ -215,7 +215,7 @@ class SportsGame { /// /// Passing the result of this function to [SportsGame.fromJson()] should /// return an equivalent object. - Map toJson() => { + Map toJson() => { "sport": sportToString [sport], "date": date.toString(), "times": times.toJson(), diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index e51c10444..8c5777e56 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -117,7 +117,7 @@ class User { /// Gets a value from JSON, throwing if null. /// /// This function is needed since null checks don't run on dynamic values. - static dynamic safeJson(Map json, String key) { + static dynamic safeJson(Map json, String key) { final dynamic value = json [key]; if (value == null) { throw ArgumentError.notNull(key); @@ -127,17 +127,17 @@ class User { } /// Creates a new user from JSON. - User.fromJson(Map json) : + User.fromJson(Map json) : dayNames = List.from(safeJson(json, "dayNames")), schedule = { for (final String dayName in safeJson(json, "dayNames")) dayName: PeriodData.getList(json [dayName]) }, advisory = json ["advisory"] == null ? null : Advisory.fromJson( - Map.from(safeJson(json, "advisory")) + Map.from(safeJson(json, "advisory")) ), contactInfo = ContactInfo.fromJson( - Map.from(safeJson(json, "contactInfo")) + Map.from(safeJson(json, "contactInfo")) ), grade = json ["grade"] == null ? null : intToGrade [safeJson(json, "grade")], registeredClubs = List.from(json ["registeredClubs"] ?? []); From 6daefdf0cb6b6e9976d34ed211c63a4c158a1beb Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Apr 2021 15:35:02 -0400 Subject: [PATCH 127/251] Migrated models library JSON --- lib/src/models/data/reminders.dart | 5 +---- lib/src/models/view/calendar_editor.dart | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/src/models/data/reminders.dart b/lib/src/models/data/reminders.dart index b50393c2b..cb7bde681 100644 --- a/lib/src/models/data/reminders.dart +++ b/lib/src/models/data/reminders.dart @@ -31,10 +31,7 @@ class Reminders extends Model { @override Future init() async { reminders = [ - for ( - final Map json in - await Services.instance.database.reminders - ) + for (final Map json in await Services.instance.database.reminders) Reminder.fromJson(json) ]; } diff --git a/lib/src/models/view/calendar_editor.dart b/lib/src/models/view/calendar_editor.dart index 20f02806e..1a051af73 100644 --- a/lib/src/models/view/calendar_editor.dart +++ b/lib/src/models/view/calendar_editor.dart @@ -51,7 +51,7 @@ class CalendarEditor with ChangeNotifier { void loadMonth(int month) => subscriptions [month] ??= Services .instance.database.cloudDatabase.getCalendarStream(month + 1) .listen( - (List?> cal) { + (List cal) { calendar [month] = layoutMonth( [ for (final Map? day in cal) From 1e85942447be600b125d87ee341f7b3fc1088f8e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Apr 2021 15:37:11 -0400 Subject: [PATCH 128/251] Migrated services JSON --- lib/src/services/cloud_db.dart | 47 +++++++++++++++++---------------- lib/src/services/database.dart | 28 ++++++++++---------- lib/src/services/databases.dart | 26 +++++++++--------- lib/src/services/local_db.dart | 40 ++++++++++++++-------------- 4 files changed, 71 insertions(+), 70 deletions(-) diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index b8e298f35..a9ef2c0be 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -18,8 +18,8 @@ extension DocumentFinder on CollectionReference { /// Convenience methods on [DocumentReference]. extension NonNullData on DocumentReference { /// Gets data from a document, throwing if null. - Future> throwIfNull(String message) async { - final Map? value = (await get()).data(); + Future throwIfNull(String message) async { + final Map? value = (await get()).data(); if (value == null) { throw StateError(message); } else { @@ -155,46 +155,47 @@ class CloudDatabase extends Database { Future signOut() => Auth.signOut(); @override - Future> get user => + Future get user => userDocument.throwIfNull("User ${Auth.email} does not exist in the database"); /// No-op -- The user cannot edit their own profile. /// /// User profiles can only be modified by the admin SDK. @override - Future setUser(Map json) async {} + Future setUser(Map json) async {} @override - Future> getSection(String id) => + Future getSection(String id) => sectionCollection.doc(id).throwIfNull("Cannot find section: $id"); /// No-op -- The user cannot edit the courses list. /// /// The courses list can only be modified by the admin SDK. @override - Future setSections(Map> json) async {} + Future setSections(Map json) async {} @override - Future> getCalendarMonth(int month) async { + Future getCalendarMonth(int month) async { final DocumentReference document = calendarCollection.doc(month.toString()); return document.throwIfNull("No entry in calendar for $month"); } @override - Future> getSchedules() async => ( + Future> getSchedules() async => List.from(( await schedulesDocument.throwIfNull("Cannot find schedules") - ) ["schedules"]; + ) ["schedules"]); @override Future saveSchedules(List schedules) => schedulesDocument.set({"schedules": schedules}); @override - Future setCalendar(int month, Map json) => - calendarCollection.doc(month.toString()).set(json); + Future setCalendar(int month, Map json) => + calendarCollection.doc(month.toString()) + .set(Map.from(json)); @override - Future>> get reminders async { + Future> get reminders async { final QuerySnapshot snapshot = await remindersCollection.orderBy(FieldPath.documentId).get(); final List documents = snapshot.docs; @@ -208,13 +209,13 @@ class CloudDatabase extends Database { } @override - Future updateReminder(String? oldHash, Map json) async { + Future updateReminder(String? oldHash, Map json) async { if (oldHash == null) { - await remindersCollection.add(json); + await remindersCollection.add(Map.from(json)); } else { final DocumentReference document = await remindersCollection .findDocument("hash", oldHash); - await document.set(json); + await document.set(Map.from(json)); } } @@ -223,31 +224,31 @@ class CloudDatabase extends Database { (await remindersCollection.findDocument("hash", oldHash)).delete(); @override - Future>> get sports async { - final Map data = await sportsDocument + Future> get sports async { + final Map data = await sportsDocument .throwIfNull("No sports data found"); return [ for (final dynamic json in data [sportsKey]) - Map.from(json) + Map.from(json) ]; } @override - Future setSports(List> json) => + Future setSports(List json) => sportsDocument.set({sportsKey: json}); /// Submits feedback. Future sendFeedback( - Map json - ) => feedbackCollection.doc().set(json); + Map json + ) => feedbackCollection.doc().set(Map.from(json)); /// Listens to a month for changes in the calendar. - Stream?>> getCalendarStream(int month) => + Stream> getCalendarStream(int month) => calendarCollection.doc(month.toString()).snapshots().map( (DocumentSnapshot snapshot) => [ for (final dynamic entry in snapshot.data()! ["calendar"]) if (entry == null) null - else Map.from(entry) + else Map.from(entry) ] ); } diff --git a/lib/src/services/database.dart b/lib/src/services/database.dart index bd390e392..9ec79afcb 100644 --- a/lib/src/services/database.dart +++ b/lib/src/services/database.dart @@ -18,7 +18,7 @@ abstract class Database extends Service { /// The key to get the calendar within the returned JSON object. /// /// The calendar is stored along with its month, which means it cannot - /// be a list, and instead must be a `Map`. This key + /// be a list, and instead must be a `Map`. This key /// gets the list out of the Map. static const String calendarKey = "calendar"; @@ -40,18 +40,18 @@ abstract class Database extends Service { // ---------- Data code below ---------- /// The user object as JSON - Future> get user; + Future get user; /// Changes the user JSON object. - Future setUser(Map json); + Future setUser(Map json); /// Gets one section (a course in Ramaz) as a JSON object. /// /// Do not use this directly. Instead, use [getSections]. - Future> getSection(String id); + Future getSection(String id); /// The different classes (sections, not courses) for a schedule. - Future>?> getSections( + Future?> getSections( Iterable ids ) async => { for (final String id in ids) @@ -59,15 +59,15 @@ abstract class Database extends Service { }; /// Changes the user's classes. - Future setSections(Map> json); + Future setSections(Map json); /// The calendar in JSON form. /// /// Admins can change this with [setCalendar]. - Future?>>> get calendar async => [ + Future>> get calendar async => [ for (int month = 1; month <= 12; month++) [ for (final Map? day in (await getCalendarMonth(month)) [calendarKey]) - day == null ? null : Map.from(day) + day == null ? null : Map.from(day) ] ]; @@ -76,7 +76,7 @@ abstract class Database extends Service { /// Months are in the range 1-12. The value returned will be a JSON object /// containing the month and the calendar. The calendar itself can be retrieved /// with [calendarKey]. - Future> getCalendarMonth(int month); + Future getCalendarMonth(int month); Future> getSchedules(); @@ -90,16 +90,16 @@ abstract class Database extends Service { /// [month] must be 1-12, not 0-11. /// /// Only admins can change this. - Future setCalendar(int month, Map json); + Future setCalendar(int month, Map json); /// The user's reminders. - Future>> get reminders; + Future> get reminders; /// Updates a reminder, creating it if necessary. /// /// This function queries the database for a reminder with the same hash and /// updates it. - Future updateReminder(String? oldHash, Map json); + Future updateReminder(String? oldHash, Map json); /// Deletes a reminder at the given index. /// @@ -110,10 +110,10 @@ abstract class Database extends Service { /// The sports games. /// /// Admins can change this with [setSports]. - Future>> get sports; + Future> get sports; /// Sets the sports games. /// /// Only admins can change this. - Future setSports(List> json); + Future setSports(List json); } \ No newline at end of file diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart index bf5969743..38fffae9e 100644 --- a/lib/src/services/databases.dart +++ b/lib/src/services/databases.dart @@ -41,7 +41,7 @@ class Databases extends Database { await updateCalendar(); // await updateSports(); - final List> cloudReminders = + final List cloudReminders = await cloudDatabase.reminders; for (int index = 0; index < cloudReminders.length; index++) { await localDatabase.updateReminder(index.toString(), cloudReminders [index]); @@ -74,11 +74,11 @@ class Databases extends Database { } @override - Future> get user => localDatabase.user; + Future get user => localDatabase.user; // Cannot modify user profile. @override - Future setUser(Map json) async {} + Future setUser(Map json) async {} /// Do not use this function. Use [getSections instead]. /// @@ -88,16 +88,16 @@ class Databases extends Database { /// this function is left blank and [getSections] uses other /// [Database.getSections] to work. @override - Future> getSection(String id) async => {}; + Future getSection(String id) async => {}; /// Gets section data. /// /// Checks the local database, and downloads it if the data is unavailable. @override - Future>> getSections( + Future> getSections( Iterable ids ) async { - Map>? result = + Map? result = await localDatabase.getSections(ids); if (result == null) { result = (await cloudDatabase.getSections(ids))!; @@ -108,10 +108,10 @@ class Databases extends Database { // Cannot modify sections @override - Future setSections(Map> json) async {} + Future setSections(Map json) async {} @override - Future> getCalendarMonth(int month) => + Future getCalendarMonth(int month) => localDatabase.getCalendarMonth(month); @override @@ -124,16 +124,16 @@ class Databases extends Database { } @override - Future setCalendar(int month, Map json) async { + Future setCalendar(int month, Map json) async { await cloudDatabase.setCalendar(month, json); await localDatabase.setCalendar(month, json); } @override - Future>> get reminders => localDatabase.reminders; + Future> get reminders => localDatabase.reminders; @override - Future updateReminder(dynamic oldHash, Map json) async { + Future updateReminder(dynamic oldHash, Map json) async { await cloudDatabase.updateReminder(oldHash, json); await localDatabase.updateReminder(oldHash, json); } @@ -145,10 +145,10 @@ class Databases extends Database { } @override - Future>> get sports => localDatabase.sports; + Future> get sports => localDatabase.sports; @override - Future setSports(List> json) async { + Future setSports(List json) async { await cloudDatabase.setSports(json); await localDatabase.setSports(json); } diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index 2cd4f6464..34040b205 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -22,10 +22,10 @@ extension on idb.ObjectStore { /// Gets the data at the key in this object store. /// /// This extension provides type safety. - Future?> get(Object key) async { + Future get(Object key) async { final dynamic result = await getObject(key); return result == null ? null : - Map.from(result); + Map.from(result); } } @@ -34,17 +34,17 @@ extension on idb.Database { /// Gets data at a key in an object store. /// /// This code handles transactions so other code doesn't have to. - Future?> get(String storeName, Object key) => + Future get(String storeName, Object key) => transaction(storeName, idb.idbModeReadOnly) .objectStore(storeName) .get(key); - Future> throwIfNull({ + Future throwIfNull({ required String storeName, required Object key, required String message, }) async { - final Map? result = await get(storeName, key); + final Map? result = await get(storeName, key); if (result == null) { throw StateError(message); } else { @@ -78,12 +78,12 @@ extension on idb.Database { /// /// Also provides strong type safety on those values, treating them like JSON /// objects. This code handles transactions so other code doesn't have to. - Future>> getAll(String storeName) async => [ + Future> getAll(String storeName) async => [ for ( final dynamic entry in await transaction(storeName, idb.idbModeReadOnly) .objectStore(storeName).getAll() - ) Map.from(entry) + ) Map.from(entry) ]; /// Finds an entry in an object store by a field and value. @@ -217,38 +217,38 @@ class LocalDatabase extends Database { } @override - Future> get user => database.throwIfNull( + Future get user => database.throwIfNull( storeName: userStoreName, key: Auth.email!, message: "User has not been signed in" ); @override - Future setUser(Map json) => + Future setUser(Map json) => database.add(userStoreName, json); @override - Future> getSection(String id) => database.throwIfNull( + Future getSection(String id) => database.throwIfNull( storeName: sectionStoreName, key: id, message: "Section $id is not recognized", ); @override - Future>?> getSections( + Future?> getSections( Iterable ids ) async => await database.objectCount(sectionStoreName) == 0 ? null : super.getSections(ids); @override - Future setSections(Map> json) async { - for (final Map entry in json.values) { + Future setSections(Map json) async { + for (final Map entry in json.values) { await database.add(sectionStoreName, entry); } } @override - Future> getCalendarMonth(int month) => + Future getCalendarMonth(int month) => database.throwIfNull( storeName: calendarStoreName, key: month, @@ -266,15 +266,15 @@ class LocalDatabase extends Database { } @override - Future setCalendar(int month, Map json) => + Future setCalendar(int month, Map json) => database.update(calendarStoreName, json); @override - Future>> get reminders => + Future> get reminders => database.getAll(reminderStoreName); @override - Future updateReminder(String? oldHash, Map json) async { + Future updateReminder(String? oldHash, Map json) async { final idb.CursorWithValue? cursor = await database.findEntry( storeName: reminderStoreName, key: oldHash, @@ -296,12 +296,12 @@ class LocalDatabase extends Database { )?.delete(); @override - Future>> get sports => + Future> get sports => database.getAll(sportsStoreName); @override - Future setSports(List> json) async { - for (final Map entry in json) { + Future setSports(List json) async { + for (final Map entry in json) { await database.update(sportsStoreName, entry); } } From 62f3efb3c07fd0f1377e1fc72d30ebe3e9ed2286 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 13 Apr 2021 23:08:39 -0400 Subject: [PATCH 129/251] Final touches on Special -> Schedule migration --- firebase/firestore/lib/src/data/calendar.dart | 2 +- lib/src/data/schedule/schedule.dart | 12 ++++++------ lib/src/data/user.dart | 2 +- lib/src/models/view/admin_schedules.dart | 1 + lib/src/widgets/responsive_scaffold/scaffold.dart | 3 ++- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/firebase/firestore/lib/src/data/calendar.dart b/firebase/firestore/lib/src/data/calendar.dart index ec611e8ed..0a93089df 100644 --- a/firebase/firestore/lib/src/data/calendar.dart +++ b/firebase/firestore/lib/src/data/calendar.dart @@ -175,6 +175,6 @@ class Day extends Serializable { @override Map get json => { "name": name, - "special": special, + "schedule": special, }; } \ No newline at end of file diff --git a/lib/src/data/schedule/schedule.dart b/lib/src/data/schedule/schedule.dart index 361b93426..6cdf2c46a 100644 --- a/lib/src/data/schedule/schedule.dart +++ b/lib/src/data/schedule/schedule.dart @@ -19,12 +19,12 @@ class Schedule { /// the database. So, the data layer needs some lookup method in order to be /// useful. Specifically, [Day.fromJson()] needs to work _somehow_. /// - /// `late final` means that this value is initialized after startup, but the - /// value cannot be used until it is (and once it is set, it's final). This - /// means that we need to be careful not to access this value until we can be - /// sure that the database values were synced. Dart will throw a runtime error - /// otherwise, so it should be fairly simple to catch problems during testing. - static late final List schedules; + /// `late` means that this value is initialized after startup, but the value + /// cannot be used until it is. This means that we need to be careful not to + /// access this value until we can be sure that the database values were + /// synced. Dart will throw a runtime error otherwise, so it should be fairly + /// simple to catch problems during testing. + static late List schedules; /// The name of this schedule. final String name; diff --git a/lib/src/data/user.dart b/lib/src/data/user.dart index 8c5777e56..a8b6c4fd9 100644 --- a/lib/src/data/user.dart +++ b/lib/src/data/user.dart @@ -160,7 +160,7 @@ class User { List getPeriods(Day day) => [ for (final Period period in day.schedule.periods) period.copyWith( int.tryParse(period.name) == null ? null - : schedule [day.name]! [int.parse(period.name)] + : schedule [day.name]! [int.parse(period.name) - 1] ) ]; } diff --git a/lib/src/models/view/admin_schedules.dart b/lib/src/models/view/admin_schedules.dart index 555cd6918..10553e9f7 100644 --- a/lib/src/models/view/admin_schedules.dart +++ b/lib/src/models/view/admin_schedules.dart @@ -14,6 +14,7 @@ class AdminScheduleModel with ChangeNotifier { Future saveSchedules() async { await Services.instance.database.saveSchedules(jsonSchedules); + Schedule.schedules = schedules; notifyListeners(); } diff --git a/lib/src/widgets/responsive_scaffold/scaffold.dart b/lib/src/widgets/responsive_scaffold/scaffold.dart index da57274f2..1dbecd016 100644 --- a/lib/src/widgets/responsive_scaffold/scaffold.dart +++ b/lib/src/widgets/responsive_scaffold/scaffold.dart @@ -112,7 +112,8 @@ class ResponsiveScaffold extends StatelessWidget { appBar: appBar, drawer: info.hasStandardDrawer ? null : Drawer(child: hasNavBar ? secondaryDrawer : drawer), - endDrawer: info.hasStandardSideSheet ? null : Drawer(child: sideSheet), + endDrawer: info.hasStandardSideSheet || sideSheet == null + ? null : Drawer(child: sideSheet), floatingActionButton: floatingActionButton, floatingActionButtonLocation: floatingActionButtonLocation, bottomNavigationBar: !hasNavBar || !info.hasBottomNavBar From f964d4f73fc212e65ab2701f6f4e6fccedd1d03c Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Apr 2021 13:44:45 -0400 Subject: [PATCH 130/251] Cleaned up changes to Admin --- firebase/firestore/lib/src/services/auth.dart | 29 ++++++++++++++++--- firebase/firestore/node/admins.dart | 17 +++++------ lib/src/models/data/user.dart | 2 +- lib/src/services/auth.dart | 4 +-- lib/src/services/cloud_db.dart | 17 ----------- lib/src/services/local_db.dart | 6 +--- 6 files changed, 37 insertions(+), 38 deletions(-) diff --git a/firebase/firestore/lib/src/services/auth.dart b/firebase/firestore/lib/src/services/auth.dart index ef5c725d7..e2e964b7c 100644 --- a/firebase/firestore/lib/src/services/auth.dart +++ b/firebase/firestore/lib/src/services/auth.dart @@ -32,11 +32,32 @@ class Auth { /// Available scopes are held as constants in [Scopes]. static Future setScopes(String email, List scopes) async => auth.setCustomUserClaims( - (await auth.getUserByEmail(email)).uid, + (await getUser(email)).uid, {"isAdmin": scopes.isNotEmpty, "scopes": scopes} ); - static Future> getClaims(String email) async => dartify( - (await auth.getUserByEmail(email)).customClaims - ); + /// Creates a user. + static Future createUser(String email) => auth + .createUser(fb.CreateUserRequest(email: email)); + + /// Gets the user with the given email, or creates one + static Future getUser(String email) async { + try { + return await auth.getUserByEmail(email); + } catch (error) { // ignore: avoid_catches_without_on_clauses + // package:firebase_admin_interop is not so good with error types + if (error.code == "auth/user-not-found") { + await createUser(email); + return getUser(email); + } else { + rethrow; + } + } + } + + /// Gets the custom claims for a user. + static Future> getClaims(String email) async { + final fb.UserRecord user = await getUser(email); + return dartify(user.customClaims); + } } diff --git a/firebase/firestore/node/admins.dart b/firebase/firestore/node/admins.dart index 22cae71d5..29dae00ab 100644 --- a/firebase/firestore/node/admins.dart +++ b/firebase/firestore/node/admins.dart @@ -12,10 +12,13 @@ Future setClaims(Map> admins) async { for (final MapEntry> entry in admins.entries) { final String email = entry.key; final List scopes = entry.value; - assert( - scopes.every(Scopes.scopes.contains), - "Cannot parse scopes for: $email. Got: $scopes" - ); + if (!scopes.every(Scopes.scopes.contains)) { + throw ArgumentError.value( + scopes.toString(), + "admin scopes", + "Unrecognized scopes for $email" + ); + } Logger.verbose("Setting claims for $email"); if (entry.value.isEmpty) { Logger.warning("Removing admin privileges for $email"); @@ -24,7 +27,6 @@ Future setClaims(Map> admins) async { "Previous claims for $email", () => Auth.getClaims(email) ); await Auth.setScopes(email, scopes); - await Firestore.uploadAdmin(email); } } @@ -36,10 +38,7 @@ Future main() async { await Logger.logValue("admins", getAdmins); if (Args.upload) { - await Logger.logProgress( - "setting admin claims", - () async => setClaims(admins) - ); + await setClaims(admins); } else { Logger.warning("Did not upload admin claims. Use the --upload flag."); } diff --git a/lib/src/models/data/user.dart b/lib/src/models/data/user.dart index 0875499a7..bd505e952 100644 --- a/lib/src/models/data/user.dart +++ b/lib/src/models/data/user.dart @@ -20,7 +20,7 @@ class UserModel extends Model { late Map subjects; /// The permissions this user has, if they are an administrator. - late List? adminScopes; + List? adminScopes; /// Whether this user is an admin. /// diff --git a/lib/src/services/auth.dart b/lib/src/services/auth.dart index 14c20193b..6f76e4947 100644 --- a/lib/src/services/auth.dart +++ b/lib/src/services/auth.dart @@ -63,9 +63,9 @@ class Auth { /// /// Returns null if the user is not an admin (ie, [isAdmin] returns false). static Future?> get adminScopes async { - final Map? customClaims = await claims; + final Iterable? customClaims = (await claims) ?["scopes"]; return customClaims == null ? null : [ - for (final String scope in customClaims ["scopes"]) + for (final String scope in customClaims) scope.toString() ]; } diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index a9ef2c0be..a3fe1b33a 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -53,17 +53,6 @@ class CloudDatabase extends Database { static final CollectionReference userCollection = firestore.collection("students"); - /// The admin profile collection. - /// - /// Each admin has their own document to store their data. Note that the - /// documents themselves do not grant admin privileges, since admins can modify - /// their own document. Rather, the scopes of their privileges are stored in - /// FirebaseAuth custom claims. See [Auth.adminScopes]. - /// - /// To access a document in this collection, use [adminDocument]. - static final CollectionReference adminCollection = - firestore.collection("admin"); - /// The course data collection. /// /// Sections, not courses, are stored in the database. Each section has its @@ -115,12 +104,6 @@ class CloudDatabase extends Database { CollectionReference get remindersCollection => userDocument.collection("reminders"); - /// The document for this user's admin profile. - /// - /// The collection is indexed by email. - DocumentReference get adminDocument => - adminCollection.doc(Auth.email); - /// The document for this academic year's sports games. /// /// The collection is indexed by `"$firstYear-$secondYear"` (eg, 2020-2021). diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index 34040b205..deb5da93f 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -147,9 +147,6 @@ class LocalDatabase extends Database { /// The name for the reminders object store. static const String reminderStoreName = "reminders"; - /// The name for the admin object store. - static const String adminStoreName = "admin"; - /// The name for the sports object store. static const String sportsStoreName = "sports"; @@ -161,7 +158,7 @@ class LocalDatabase extends Database { /// This is used in [signOut] to purge all the data. static const List storeNames = [ userStoreName, sectionStoreName, calendarStoreName, reminderStoreName, - adminStoreName, sportsStoreName, + sportsStoreName, scheduleStoreName, ]; /// The idb database itself. @@ -182,7 +179,6 @@ class LocalDatabase extends Database { ..createObjectStore(sectionStoreName, keyPath: "id") ..createObjectStore(calendarStoreName, keyPath: "month") ..createObjectStore(reminderStoreName, autoIncrement: true) - ..createObjectStore(adminStoreName, keyPath: "email") ..createObjectStore(sportsStoreName, autoIncrement: true); continue one; one: case 1: event.database From 1ac44a58198a92b720a51aaf2b88778640ad6158 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Apr 2021 13:45:20 -0400 Subject: [PATCH 131/251] Fixed errant call to ScheduleModels.updateReminders --- lib/src/models/data/schedule.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index 13ade1b70..1541034be 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -140,7 +140,6 @@ class ScheduleModel extends Model { // period changed since last checked. periodIndex = newIndex; - updateReminders(scheduleNotifications: first); // School ended if (newIndex == null) { @@ -153,6 +152,8 @@ class ScheduleModel extends Model { nextPeriod = newIndex < periods!.length - 1 ? periods! [newIndex + 1] : null; + + updateReminders(scheduleNotifications: first); } /// Updates the reminders given the current period. From 9a86a953fa2b90005cd8ec9f37f9d2a2e0410809 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Apr 2021 13:45:32 -0400 Subject: [PATCH 132/251] Refresh schedules and calendar together --- lib/src/services/databases.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart index 38fffae9e..65c02bc08 100644 --- a/lib/src/services/databases.dart +++ b/lib/src/services/databases.dart @@ -24,10 +24,10 @@ class Databases extends Database { await localDatabase.init(); // Download this month's calendar, in case it changed + await localDatabase.saveSchedules(await cloudDatabase.getSchedules()); final int month = DateTime.now().month; await localDatabase.setCalendar( - month, - await cloudDatabase.getCalendarMonth(month) + month, await cloudDatabase.getCalendarMonth(month) ); } From c83b495c01ab85fed02828d8a1eec45d64c99ef8 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Apr 2021 13:45:51 -0400 Subject: [PATCH 133/251] Hide sports page until Covid-19 subsides --- lib/src/pages/drawer.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index b65e2e0f4..33a0fd5e7 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -57,11 +57,11 @@ class NavigationDrawer extends StatelessWidget { leading: Icon (Icons.notifications), onTap: pushRoute(context, Routes.reminders), ), - ListTile ( - title: Text ("Sports"), - leading: Icon (Icons.sports), - onTap: pushRoute(context, Routes.sports), - ), + // ListTile ( + // title: Text ("Sports"), + // leading: Icon (Icons.sports), + // onTap: pushRoute(context, Routes.sports), + // ), if (Models.instance.user.isAdmin) ExpansionTile( leading: Icon(Icons.admin_panel_settings), title: const Text("Admin options"), From bfe1cae14e7678379b2f4bd8eec0659b7071c29d Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Apr 2021 14:31:29 -0400 Subject: [PATCH 134/251] Added better support for testers, thanks to Ms. Taub --- firebase/firestore/constants.yaml | 5 ++++- firebase/firestore/node/students.dart | 12 ++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/firebase/firestore/constants.yaml b/firebase/firestore/constants.yaml index 05a025b11..53986b31f 100644 --- a/firebase/firestore/constants.yaml +++ b/firebase/firestore/constants.yaml @@ -13,4 +13,7 @@ corruptStudents: testers: testt@ramaz.org: first: "Test" - last: "Account" \ No newline at end of file + last: "Account" + taubj@ramaz.org: + first: "Jennifer" + last: "Taub" \ No newline at end of file diff --git a/firebase/firestore/node/students.dart b/firebase/firestore/node/students.dart index 18c27da41..bffe1fbbf 100644 --- a/firebase/firestore/node/students.dart +++ b/firebase/firestore/node/students.dart @@ -56,6 +56,10 @@ Future main() async { User.verifySchedules(studentsWithSchedules); + if (Args.inArgs({"-t", "--testers"})) { + studentsWithSchedules.clear(); + } + final List testUsers = [ for (final Map tester in testers) User.empty( @@ -64,7 +68,11 @@ Future main() async { last: tester ["last"], ) ]; - Logger.info("Found ${testUsers.length} testers"); + Logger.info( + "Found ${testUsers.length} testers. " + "Use the --testers flag to only process testers" + ); + Logger.debug("Testers", testUsers); studentsWithSchedules.addAll(testUsers); Logger.info("Finished data indexing."); @@ -77,5 +85,5 @@ Future main() async { Logger.warning("Did not upload student data. Use the --upload flag."); } await app.delete(); - Logger.info("Processed ${students.length} users."); + Logger.info("Processed ${studentsWithSchedules.length} users."); } From 59bc694788296c9dd70339341e75a3c48b504c9d Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Apr 2021 15:08:53 -0400 Subject: [PATCH 135/251] Removed unnecessary ! by updating cloud_firestore Fun fact, I wrote the fix in firestore --- lib/src/services/cloud_db.dart | 5 +---- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index a3fe1b33a..4f371550b 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -184,10 +184,7 @@ class CloudDatabase extends Database { final List documents = snapshot.docs; return [ for (final QueryDocumentSnapshot document in documents) - // QueryDocumentSnapshot.data() is never null. - // I opened a PR to make the type non-nullable: - // https://github.com/FirebaseExtended/flutterfire/pull/5476 - document.data()! + document.data() ]; } diff --git a/pubspec.lock b/pubspec.lock index 46d7c4878..7049f6b8d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -63,21 +63,21 @@ packages: name: cloud_firestore url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.0.5" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.1" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.0.5" collection: dependency: transitive description: @@ -147,7 +147,7 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.0.3" firebase_core_platform_interface: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 872feb145..456e4dbf5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: # ------------- Services ------------- # Firebase/Google - cloud_firestore: ^1.0.2 + cloud_firestore: ^1.0.5 firebase_auth: ^1.0.1 firebase_crashlytics: ^1.0.0 firebase_messaging: ^9.0.1 From b7a2b518e0a246a480a396b14ef465d404547fcc Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Apr 2021 15:24:19 -0400 Subject: [PATCH 136/251] Removed Admin data from admin firestore.dart --- .../firestore/lib/src/services/firestore.dart | 26 +++---------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/firebase/firestore/lib/src/services/firestore.dart b/firebase/firestore/lib/src/services/firestore.dart index 5b0bf7f02..3e312d0c3 100644 --- a/firebase/firestore/lib/src/services/firestore.dart +++ b/firebase/firestore/lib/src/services/firestore.dart @@ -21,11 +21,6 @@ class Firestore { /// The name of the feedback collection. static const String feedbackKey = "feedback"; - /// The name of the reminders collection. - static const String remindersKey = "reminders"; - - static const String adminsKey = "admin"; - /// The students collection. static final fb.CollectionReference studentsCollection = firestore.collection(studentsKey); @@ -42,14 +37,7 @@ class Firestore { static final fb.CollectionReference feedbackCollection = firestore.collection(feedbackKey); - /// The reminders collection. - static final fb.CollectionReference remindersCollection = - firestore.collection(remindersKey); - - static final fb.CollectionReference adminsCollection = - firestore.collection(adminsKey); - - /// Deletes reminders froma given user that fit a predicate function. + /// Removes and returns reminders from a given user. /// /// If [transaction] is null, one will be created and passed to this function. static Future>> deleteRemindersFromUser( @@ -64,7 +52,8 @@ class Firestore { ); } - final fb.DocumentReference document = remindersCollection.document(email); + final fb.DocumentReference document = studentsCollection + .document(email).collection("reminders").document(email); final fb.DocumentSnapshot snapshot = await transaction.get(document); final Map data = snapshot.data.toMap(); @@ -104,7 +93,7 @@ class Firestore { for (final User user in users) { batch.setData( studentsCollection.document(user.email), - fb.DocumentData.fromMap(user.json) + fb.DocumentData.fromMap(user.json), ); } return batch.commit(); @@ -162,11 +151,4 @@ class Firestore { ]; return calendar; } - - static Future uploadAdmin(String email) async => adminsCollection - .document(email) - .setData( - fb.DocumentData.fromMap({"email": email}), - fb.SetOptions(merge: true), - ); } From 4b8f64821a5ab73d442f197831e5dfed7f24d416 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 14 Apr 2021 15:45:20 -0400 Subject: [PATCH 137/251] Auth.signOut now revokes auth -- no more forced signing in --- lib/src/services/auth.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/services/auth.dart b/lib/src/services/auth.dart index 6f76e4947..e715f7efc 100644 --- a/lib/src/services/auth.dart +++ b/lib/src/services/auth.dart @@ -81,6 +81,7 @@ class Auth { /// Signs out the currently logged in user. static Future signOut() async { await google.signOut(); + await google.disconnect(); await auth.signOut(); } From 26f10be9cea0d7e66e0ba5409097a91ea604f85d Mon Sep 17 00:00:00 2001 From: Brayden Kohler Date: Wed, 14 Apr 2021 21:35:49 -0400 Subject: [PATCH 138/251] Added CloudDatabase.registerForClub --- lib/src/services/cloud_db.dart | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index a3fe1b33a..2090243af 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -91,6 +91,9 @@ class CloudDatabase extends Database { static final CollectionReference sportsCollection = firestore.collection("sports"); + static final CollectionReference clubsCollection = + firestore.collection("clubs"); + /// The document for this user's data. /// /// The collection is indexed by email. @@ -234,4 +237,12 @@ class CloudDatabase extends Database { else Map.from(entry) ] ); + + Future registerForClub(String clubId, Map json) { + final DocumentReference clubDocument = clubsCollection.doc(clubId); + final CollectionReference members = clubDocument.collection("members"); + final String email = Auth.email!; + final DocumentReference userDocument = members.doc(email); + return userDocument.set(Map.from(json)); + } } From ba854caf4ca2db34c06df65fef0bf0f665b53c3d Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Apr 2021 00:38:05 -0400 Subject: [PATCH 139/251] Updated web icons to be maskable --- web/favicon.png | Bin 2241 -> 0 bytes web/icons/Icon-192.png | Bin 26828 -> 20145 bytes web/icons/Icon-512.png | Bin 104064 -> 68967 bytes web/manifest.json | 6 ++++-- 4 files changed, 4 insertions(+), 2 deletions(-) delete mode 100644 web/favicon.png diff --git a/web/favicon.png b/web/favicon.png deleted file mode 100644 index 33eb745055e52c374bc6d35180d64ebeb3d47a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2241 zcmZ`)XHb*f5`GgETh z)C3T`3J3^D4NYm%krEJ)`i1Y$o%`eN&UtqB+4IcV*_ku@Z>+r~FH{T)006JGmANB3 z!VeDw%*Ndlzg`|Do>q=_0PvSQ0L0z{fNeGvI|~3|2mqM(008|A01zc)GjIm%!qKZX zmgd00q372XK4mjpq1JX7uAdNLL47%&n-B*!&_sH(2`wE>ZKO8pF#o4~i0qqCk1TX9 z`|SX0a}y`4<_c$gpu`1X!_AJb9m`3ZG0cVE`b3)j{HfpxBu%NybZuCP>S%6rT0lU( zRwe?-ecZ|+pk!(sIp%;Bc4NV0PQipu2f>^C#8AWub8DngII0j#9F;ASc8;`Q-`{On~^ixOVyg zAUK1{lAj@SU_B5y64Vb2g(_vrcP0Kssld;57M0JxddbGnb6wvS@dx1wpmjkq(XZsv zE_YK-@DwB!mnAuU-2ZWV!RQQeZfZ4(ev)s8!F4XKy8h`pY4=4m;jJ<7D$x)MfruTe zj3I>XyQmkqlfQ_Btp;PF!LdJyw?Y?LB=_3qXPtY-*0NaiE`db9OX(fHCrw(i#HbQh z!lJMJ8L$Dd?wCJAag&oaBqgQ)tUQa(G__&i)}!?SjQeo?R)1HdY1dVZYE>iXqmJoPM58<@Bc1xV#`2!YjV5v68d9`hRqd3EftlN2#i_`VsWhiKh@PDk zcU45%tO&E*Ae}b;JMT7gL^|0IGUh7J>Q0(6DbXl{k?TbFHu4H-yqNJ{f1bsfVe{;v zADsuOjX_YKsKd?XT~VC?pVO64!oxfbP1rxBjh0)KOXW zH2hMI)G+EZG1x?Oxv#ctaOKg9kUo7(0MP(2CX{JodmE3(h$~({t^ZzO6DOZVJ>6GK z*kW2{$@>m1me#kI74)X|kCaPN`llE0`@Op&%^zc_4Gg!B#pQ92v@!YQkq_q4SBrx6 zzBUgMTy?@NDw5jUr%Y{l2TL!d$#6A8hfVdHQ~X`voE%`|Z<_Sjk)4^Gh&C30DOqZ% z3;Q`gH*98+e5Abi+k?cQJN(JQYSW)U@6(|ud_sswlOJS&f~%7GZJP8x%SmUAmDjXZ)%#(VCcp3 zrFjYd7`&_y2*ZbIZc0xhr^L(kRc_UAds03Dmji@3B~K{tPPfglXR{wcylG5}=>Jvd zZ9w@Y6$o5X#iq&aU2A0+D-MbE?iAFzt#qn$aduP$PRAE2l&g*Mhvo4M%qHF#MD)CQr6~-6XV{#uN+i?y(Qpt!+SdY?w-KS z^7FepZtDZZuVyS-O5E2t-5jxJ=kT)-dF zyp|OeMY<*XqamZxwsYN7M9z%&0g?whYQ~8N~pKK=XGy(05sX_SrwtHs;S|mp{K8- rtFMJpMj-SN2wN9(um2GQg?Rb-ME-vP`snTeTL4&N?9Gc!J?{JsLahu6 diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png index 38049cc52e96a3d4f7f9275ee8c62c4a038f6b1d..fd2787f45d523bf939362985f2f5f6ed8f6c710c 100644 GIT binary patch literal 20145 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

KN%?}GcfUNY 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 literal 104064 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

-dfg{BEZ zz0|gk2^i&e_VCMT-Ch}gvgiTGj{WN6*ltF+YuhwL|7TvPUeaPG8@4)UN{^8JTYUjC zIaZzcyHx@GF9KNE1@}HBL%ruG;QrFohBVP~X!!HAXcqs}m%+dl%pAY{;@6a!3r=5^ z4U()#`Y;jav{pPMs?CGCT50}|wXTU*TXV^KKef`~W9w1lS6-a!01gKch9?}yw;o=f zO?u@Y21~xXGcApXx{iR_t$dgFKd{0UQ!YZJy*o%=)cH?-ihzF3vK#JBbcfE{hj2U8 ztss09=Kdbh<*E8i0$$#W#0x3bU27rA!JmVqrWQ^#GhZ3N9@|L>p13hQ0Bc`D|LR$7 zI?)NKVj4(dqFN4Lg*hgdK#2yc0MP!##h+ikR~ny}ty=JFnJD2atdpY;gd;HNI1158 za4%}hNI+21;Bu9oYulI%@e=qN77@AME%nb(%5+OA-5)i4^5l9gni=@$FPHWkNa;YZ zgC>mHrMEYqtigZTJvY@3`>G9C9)C4Sn2LEv0p0qx_2d@K=Hp!?jYBAYLTpuuj9!XY zZe3WgKD)JZO-2+lQz0l;Z|-V4CMjUKTmgW|!6|$l(0}@4=~B574Xao2GPk5*L6{`f zOcjH{hY729!9UO))LIeC9R1lfOtt0{{wi1^j~m7?k1Tf~p0QFcaG$oCO@aU*bFD^D#e91SR!FE#KGsX#e96K@(xpow~0l zZ9nddBA3%{H#)Y{l%Pij+R6OA{P|OD0SGg&Gv3qG)0NzKFxCyX->uL$=_yw1aU{6I zsVGg}okDkWSAsxb6IYA$w>m;lN2mH;JjAHZS(uRcO#%iL*f#TH&`Je^JCsZcaIg%A zv3BW=SZ$^5B2miY+15k8nq)6&bG$DI^I5j;%Y8UT=v8TesL|6sXmH|%8g3Wtzq{XO7 zk+5z~)_d0V(opH5c)m5ZZN_CD#M)Kp7ejw9G=&%-h~OiUTlY#C38Me73#KkG*OhrB z4C5i3-?00$N6!%dyo~A;$4yGId!YeLjB42!%Hkk?&jH+I3@{y3(7By8|enr^As!Pb|P$pZ_k8tE}xo2~ahm)1c#4YEBuo!hfi;BHvr| zTqJkyW4=bBLQ!}Fj75I4Y#FTTdxtm;O(`b;q0wFuE>SF>3A0YQ3{x#u-MC{-Ho27X zyX3G%&Ome3{QJT^PuYpOh}2fS(nSEYnsYR9SA#eKWreF}SqS}=z9cyZ zo7!HP(4M>bb#ZhD=#z?XD?F;BSEt^F{12Ez_~2#J59Zz?DGKF&aD3aAPb_XD+?|hM zRT&RKx=Eh)>(1V1`tR7jPtkdSkqAyTj-)5Biz9wXH?G$-Q5zquI^e##wL=tF(wrj6 z1S~GxamwFj>M>N0ZC#zpgSTX)&Y@Vsui2Caog3(&tR-@K0_;s#2;7fQ^LFl@Sf`qX zHTtc;ujdQ*FQ?Rj)JRH(PdZ|;zVuQY8(H$P7o`#X{K4N1f6g`^hw$)Ab4F2lr$zMu zu-tBrCJDed$Jo{{SalxBW~o>5M5Ti)M1i$4*7T7hBysYiUhsiqX81Dlhbm#kT=q_~ zg_^x`T<6xCQ=IV6DT01Qn$n1J2O4(JpavMnPIS}GkM;SZ?--*-z$AoQ0%6|!)Td5~ z-55{lBo@!-gmg6psPybaEMtP-L(leqgjAqi{uKw*VYSyQlbmv#TDB(sciD+AD4%6# zONsv7u&8@<{*?Xtu!r_t5u-#kh_0XJXA-eD<6=`@jWV#}bYMMY{V z_Bn3p5hWm98d!f4D?N|2eVGJ<4nTwS;7p()acC8m;nzZY{4epbl$3Blg#S+W@h7Vr zIMWFMsacp)2dvy;a-b9e3B;*T2W@u|vTh2PP!b?+gG&}^%byWE+Qi-eg!Oz2qB_Om z1R-oR;g8@|N0X_@M7ZoZMMD#BCmOuE_U(`NGMb8qIJiKtd=X3W@=Idma}gFZ+me|% zC%+Mb$j~^9dz#SV3f}7Nic$LFVO7sK!$>*Uye~o&Sy@u4Kl7CizCkk9Z@0pXuu@(` zcy%t(d&_=kIeSfBJrugX2xZ^RsKpEJ?Ae;545^57Aa~!?9Q8uin8A|Q-EMskWqpL> zP5s*9x8g^Zi&3Y*Y{K^=x07?P4EWWlp(RL3_AbvFO)OnA9E3rmi+{zqz~F@JBH6nR zF=R_z(O8{#+6dTQpAWX)QJ3bS2aN;c z6_A`aWPyCtw4~>!jHGqhFtQ}bguqUW@IBVXtV0}3=3VWBxs^G_#Uh z$8SQ<58@yU=uqx|l;bLPDzNej1TGe9zGH2Un#f1G&6OP_mC(X7w5J*In=QoZ!eUJ=L0V(?!!`e8JAIytyC21Q~qYPeq!h7K(svC!7?O zmioF?*lB21n{ACHjXQfgUZh`H#rJ2gLJ@1y6VnR`d!&w?ZL5TRy5{;#F9GZ3*)Bf9 zfRHA!WYzf-nQeAat)Lb5T7)Q~qF>4M{;0tQ%|>v8LSv#ea0|Wv8ZH=}54C^GIlREP ze&@tx!!tWiW(rLOKsYS=t==W%VTW1>*s^1S%O1jX|SP<6WXs}+T; za2q;1PNKZR0`D>s5vKN|>i9s^i=Zsn9M7XXJ=esHGZ6H_GrBsF{u@1`{NaFpcx>NX z_DX^W@y|#O$TG!j>SBy7OBCj!KnrQb}%hlC@#SYc>97Jp~&m7C=7GFp+$q{YILYj zE$m|6Gohl-=1#b-&Xto7R_wz#E5mJy9yrTp_1L26JK-58? zyg-mk1C{gApdRn{KBXO)(Qs^m(tR-){0PkdKXq8Gdr?y&$inueMR$g^mVpbqy7JeT zfRaE18GzoS!B1OGFQC;8NNLE_fe7MC<5LMq%b4*h;V@poQhw!Z;w5!$-% zX05fZ{!gj6&YED+SL&)ov|}e}SdSgdqhn zDgfSoUQpO|H27yD=Zq&2ll8- z%A5+dAT9j-QUg;SDJoKfXlmSAUqDLiA0&f?=N`{ipN(ZXv@e4Z1X3D^lQ>vNPIl=kc9{cJb8+Vnr&0KH4T7oM5@-!qWz<=OS|B5Q$td-;Xy zvD#$*7ovm4cIK?Y(9DMG8{=T`?Fz~oV3j?7Rg zV1ppd(;b)y6TmuR-`0@Y0=oTJ?nEhqVedXXFO>`u_`Ju;e&4psB!hrar`4^?zv;9I zV0RGg#~&9#wnIh;d;(YbyWXr#te?rN@5C1=Z4rZm+`f7yFO^JiD0J4zh~%E&!~x-j z4c`D*eclV(>D;0Q5!%7vA+xMjS$jv=1)w=-41+_e#HyR0U=64ToJt5bqsYFt8pCyv zdnA9r*e(g>7BqaJNLLO@inM%sQVU~N;Lw|q6Z@JXA%D}^4z$=I&~M)h^fd4=?0W`( z(SzjlR;C0p!6YP}>RybtozX4fpjZaZyGAgSO+9|_PPU&n+vfDPz;@vtlJuc6L1f~o zqp8|>!beO;;1Fwlr-#VkbiW2}RHz1UFV;uvNF)yhkN;iA%zf`{Bs~ZA-`N3->G++X ziFG~saMlZlcMek0%f+~0P_cJq>X+eA=v3Py-olG1GHqP~zAJczfDH&(uYNfL!q-uz&& zD&Nn!UABXf4%0mUjZ1 zHSxwJ?~Q#5X zE*S+CN3|fdm-Y0)Q?=FT{Lw zWZWWNTc^dIVEdJ$HLx@WWbeaG7Qh&A{@CahcIzwrruukYMnNK+aY{T7;qz(4rN za(lG&91JIa6QM6CeKWpF{8EQLuMQk4`feMH+DBzf8#@8mEAK5k4@75g^LyZt)h4mN zd~32we)8nQMDlhvvNt`5%dKnM;s~loV()3Nka5EKu!Ja)ufNwmq$1FIA!XVD2@c!( zkte6j6~7@E;N?F6$JOQK|D4kwWL02WPr0UT^L#54#;a;|G-Qzm`*CXWUl`pMGt+A~ z7#NkFYXbpjfCa;35VWv_rieYiNdI-2iHJU`sO8!15Q-R}=ea^54S`$9Lx5t^WKH>z z9=~KMhoWXxs)>-SG!gmSg-dcktxiiCXPE4e4Nq)Zms`-qY{{qz3%r4>JnV>@0p>~R z=wpeFH;SZjE0*xNS8qM zwHUd4AK!JPhkcCx|26#P9f?orxr-ix*WUW4ZdO=_-K5gsIx0@wbd|K>PA8$~B*Y40Vdpo@L3k4};JCiXT zyFKdqyJO3hluHwKS2S&gcpCzt2Pj|TVX;b2s*@`!C~BzpzHQEWLGBWs>;K5dsU&lR zNK&ZbL9528x3zEA=1b%tPh`NSFQXIJ?%~A8w*ovDaS$m3~+$P$T)-YCK zE2Pe{UsM!3t>hScRMqgTHdAzcXp5PqYFH@&jB z!BelW9ZGvvts4segTGPq?s_x}I(q!<;7N^(|Fe-HHIt3DaD~DA8Ll{_&9c3Jv;cF} zt`!Mh4QQXQw>bDg+3TV^Kw4fy6q(M<1x=$o^=n~`{@L-?19ctB=($}DL=uMW4_uJJ zt~Q_a{qR~&2{UA(!OOeLw|5@Mdd>QOSWY(!0TW4%cX{n56lIL3D;0G^jp3d zI-S^oaYL7RBxW(&IG9dI*bdzt4k*O8=Fv^-vVd}4eJb@!&iI!(A`k9~(LY^sK!HqM zSd(p+j&dK|^H`2!)5=pcdj0NuyR%qcAzxWO`*(w%w_7C;p|^rvtWR8%DA#|l0xtMy zgk8CB!(fce1tp=$Ij8!y^SvkNKw65=8sky7>HyIgB1yJ|BTpzf2IFSEF_-IGyH$Wl zs!TvR5L^3J*0w5n1$NyC0=G6t6tU@l4@`!mH7wC``w$!I_IIKRh(s)-9P*-QDZ zui&rird0vR$u#lP9#vV&O0l z0df%_eeI=cL4*DQUhp7ZH?la_69blGdXL(>0PsqwLYD0(T3yjSyXW)Y=`AFzwzwAc zi5_>JVxkBkoomkS0lkEA*9m0@2J8(NWWH!|nL=q2L*61{>wn}_h_c$}gsKyCw@L!1 zJ`dY3#LV|qBvx=xzpVWuJ2v$BK*$5fHmhfxB0JeVi3~7>KzcUf5+4b(naY!=A9uT| z)E`AKAb_kzbQ>Da5TpJ^&H>Z(*@Dt_+z$z18_AjwdGm5eIR)))&`OBQ9Qm{(wfSgWD_fuW-@9 zR(5he+q?Kfw5e4@Usnr7`g~G)XjIxV?4T-9cW?6o<--2)kue_g!f-7MNk=T*WUZhP z@lJU&l-+9zxJ$uliWsb6R3?U268-!_+>ys7<``?CvCNxT@nE7v{k(xDJiMeCTCKNE zt|32Rp27*ubV-<^^)jPg-9s=${cI8vG5^X|NdWA2J)voa>Ru5aGD9Rnd(S*o8Zs=0 z_W98d$iiLUn0b~x$P9JrX)Mna*jJ)?@$dYq5!8x7mTq0#7S}|+S8q?%P)kRZCjid~ zgYKl?Ck8a2V3h^IZesbsku@s}_d{u;{|h7B+0_(nKY?&wFsLFjb#`>E@KKE^bvorT zG;Q5-i|hCxU@uxaGuHFMZx_Wg8@412Vvq}0vOoTIx@*JpbAICR%vccN!Gdbs;%3^9 z>>Sn&gU43JW{51CQb$a#U(!?@ZIBseaF9Ihek#@@-rXlslnqU7&ChPg$Z{4K#{Dvj zhsgedpE*9+w&cy{iWx|q#W{t+AUwM-f|H%gZtPGtu#Q!9iAYFCd%%)aG~{29CRXD6 zpTEP6tGoYwOr|Gle6nYk@2%SIDU!!@hM&i;l)4W76Eqkk%=a`VQ1)-LC)_0NS9I&? zR*u^UvK0(+a3zbS$&4>Jar_=-UR(o+qi!)lwt?9d#BAKy!Q}x1guaGE=DC1Vu6txZ z82OIk-QH*b(<7$Q7?1x#Grx6@xkrICQ|w83I#pca0`QEaub=bUN>6Kk4o1*Ky1!08 z^(9le-pLS`Hl7(VX<*k@g-N!npzG+oVW0U%SK#pIStBYO;eQZ#tYF8pJ>;xC@pV8? zQ?T72?~t#7{VEYrjkW}L0-)3yG2dp2rfpUC^?j*tIeuSm+%10HE)BzVq$ zj{AB%!xV9yb3XUNZqQv)oz($?G*|V zQu6b9?V8ScOvb|J9-ABiMZS)aqFDARfszAE` za(7~c+<;mQ;T3ea-wSlO33NczMurLgLk9Zc2egRsPJR^O`JU_z{>w7Zc=oQ>rY#Y` z$D{czUn$*lC96NRemgMd&D9;9Ynr@}ttB6>y1u*c+{KVKKW^<%w&xy9 z^>Gf8Vq3H9{h30O*Jpf~o_F?{seNef$)h<}{K88n3MQMOU!H4G5_`s&lC}C!{&dB6 z63^fEy5!F~bmHhH{)W8ua@19!OdLUZP?agoYPB`p6t>Ld(tL-~U-%9+?aV9Vs@Rp; zRrb&RvXgdY$9FdGOufpM%9`S-{V-rt6m86_ceCeCcB$BP@LF`dq^`I5LTHB(pRr}g zGbCPC&c{V&w{hrX#laPOxA>N(KVw&oS9Ld<9sa82d$x*MwG$1~ z3UCDH0zOy`$63ktE4oiwyxROlI?PR!awhc5b;a&(3-E$ zpt_U4%D35VRe#zS3CRaZT3kepp<70Pajmf*f3!*3;NuX*7FPNVy-p)T0AZJf6P`!u zdmz=&n};a>@_Ms}jB{)mmlDodlVVCD=C^?Qoe2dk@F$W_@SZ1zeDG6Rt&n({A2_`A z;;+z@R)RLdfYTJIGQ`KpV&NYA6gR&C7(b2Xw)sg*3QXNQ#>sI`F%9tVdWp9En7c)Z zTr;R*n2_fBp**mEV-`HTD#SQTV_kQ3Sbga$XKn~1qm8mtbXN*uSqAPjM>8VPzxGkO zyMoK2YMPR|n$?A~h(mW*M#aD2LF!Ws7tcJ|Dc&VxWu0aPRYt6YW;_EGD%yb z80O@mmw$A(3(hm;&Q)ShF&RD~UhTTtxaH+4YSjWZ#@6|S*P9dXV5!trre%-uFhu`E zL51f;WuWmPm+~nIkju4{kw%e6I}qEDdb?Ff#+LRt|28&PD1hJec8^N*`6m1mXYYDE zD&H>1aP`V)(r$(k+=}yXe#ekSoh2NAb+&$Qt|2%wGtN#UI6qDP7EUxh zeVip`wbL-Ze>aI~T0>~M>!@OxOU^Q=py|4S(4Sq?GnO-J+YP2iot2BaX} zzh50X`SobY9Y;y29y^PnCH98#sqWfmr|bPCOZ$bX5%QJRaxT@JBZE9v>0g4UG%LXw zq41gTopOA=LY%zEpEhu*7g2_G>31Knm$2eqINfNgUp$*ge~RQ5@nUgviljJN#NcD; zsBGzA)klm+PY6@L=*)+_i1`?SQSt_Q<;wqktfN)=EvwUOp|dvR6u(u)=_#3(b3^`$ zZ1*nGVAkej@<)-T?a)bvDB47s$<*%-7YWk@$u!GGIzyqZ^RHCSH2NZ4Ec3*g?UW+_ zZ0kJLr~QQeNvZ?gAH@^9=c!6ip7@!5bS|ni?wMSS_{O&$99Rys<#fBMlT;X=K1sDi z8hBdj=xuk034Sgq9wZ70niuHj?6sYmf8Uw4_c3 zB-SW+7PzZa%*f#Ea#*z>M+S;%BZ-%$u(3?+vR;LpV#zS3*sE&yFa{QXxXYmQ;gn9$ zxy!Ci&baTQfW@Roa44W=k7#t@p0b=jxjVI+^TJmQt+)>!{FJWG@<^h%1!IyU3j&DD zd`jk+9;)%(m@u+nub^t&acr7Hb#% zRm3b->tC_@zPqEz?IVFPet`R-mS&-<^rYI*sq9t;23fdfIH!))>g2XY?7)uCk`f^j zl>(g=6}rHJ6hAKd%`#QN{XUb}CJl3n2bS5W<+s@E?EOL%;2(XR(%P*KS z7suiCm9x~fGiB<`C%w;NZDQKS@5O`7))+#T*?q?Cq5238u7~lmEQ?B|S~Aj4#AH(_ z7{$IK$-TKQKSokT|Kn7Tf`xn~{?RAXpZ3HjbyZmbT%Z!E%xC9&@77`b`a_;g;u&e2 z{qR!H&;3@PSgQ|Hp91)X9RH$S)Ac^iNI(`*-L%Z0Gv+^TyN|Yih51;ch}}Qs;QQki zvTJ-mQlrcH$oGSNbWw&&%u<)aOuL3!q-UR3naC!Km&)=y@WUmc1g@aws+B-{r}_Ok zO_qapW8a1y+Ix~TE{SMr*BP9AZ9|^yd5S&zQlu1h{*q%3(!@(YjW8m^7Gq^=@nbPp zzliZ|D3y|x=Y3R`9TLQ2k;dJ;OSg-gv*aMd5Ji0TusE76I!5rW7u9f?W69f!A6(OG zhPJOdJjx!t#d%@(W~||HLXpO1Yqlh{kR0#veIL>;m=5Bbz4)2Eke$ur&S1Gbu@GUN z!1EG<*IqU5F3d0AXw*_sFkvM2MzpORm$Pp2QKQoFSN}e7OBS9j*>6Z0)|&b~NVe&( z{5;gN?a{tyQhM>Qy?ZQ!eSqACH39s6B$T2M;WZ6_LhzLPKG8L=ApC8ou0 zO6?x!s>sIswuq@;>nBN=RlePEJI@8(TTssFw=J5SlNqhJRDTGW>u%h+M1MKrpPBe? z-ZTde{^1&|y<}T_o4@EjR9{LxlcE`x6`wz&^eMRid`*&U0P86OxrJi0aE^|#JQ^b% z`D1(V7M(WzQ5I%J&J-UQJon(}1X=^cO^0VJ^Zrheh#a4%Y?atOcH*EB)oF?KC(->| z$ob#_yjDz4q-XP^91;g2c;6D))Q_xN)D092`PdE7XWl=HMsE*#b+Giq8k@`+Yr$Xdg|s2_SP1%n)!$w1wXu6^%iG z&EAu^J5lP6^M6cF?338OD>&D^?Ny;9!ANU0O*Y(sQ0=`nb_11q@27QC0_evQ154j~ zjbOrjh~gOfj3pg$-DY~2i?}isYSk0m57+a7*c|^Jaq~YOHzO93=9kO2%vf zXV*h-?nXO;B>gEpdnoi#0Ok?V=1s#>+3m-fi+Hs058#tQ9HjQe>5Fo8fdv7qhN%SN z@VYJ!IYqG6*j093HrdmsE_B1Ej)ZOXK0MQRN3n49DzghmV|aN+E%KcSzgDr4t;ecT zwQj82ukJ)%$B7(oYC(lOYx8f;%tG3%`}5!X54+ub-wPkK@aqULI#qxFL$dYFDdwY{ zf98WPG2EdSPfU6|*UD*RqyxXO@Za^6T(wK((!J`*6#ggc13war8Sr@FQnc`;-J2gu z^d4=?#7{=>&C_V%VZ9vss517IR@MckzAR-lj4ImLGIjR58S7u$quLlg^fA+EQ&X7n z*%cA(>qs~hn@ijQ1AX+IdNv+e$t&pD&)tUBJs}`L}1ZUBky*F_fTKUlO9=`wpk=XbVwnbT7? z%fC?K-f>Pb-K|y`L7^8r8%&Ergi#MfyjS z1Y|dNsc_Mi>_0BZ@gwQ@Jr`kHw5y(34zJ^eQX@T^ypXj<+`r&HYy`oCrAkdtT{8P- z--gJ-$*aM-o!$rUTtG=VYnMg~`m4&?e@ghv_awz)vUr1@QBzYeZu@O{;-J!?fsrcG z!OP*>@01Elw}=jtt@}dnne1EzWCsQ*iHihmIJxT|J8Lrjesj5kH)k(6j*P=8$xm5A z0DE)n*zJ?%MOGy2;-WPu0H5J;{1^C3>E2oejaTW!!l6_A<*%H*kAZp0)Y3S~xE({4 zemY2Df^0+eqf!UmZqWlgM_MJu8hh%;7M}C5+RlBxE!MHrWcm|LEpFrbxp6C18<=~2 zHHp%Z1vwTf^#crBuajy1k%nebeffy_nRXu~RQ_>!_PSf6n4}T>bZ9?W|Kgwxrr<-~ z>-#>)R{#AWBRIM2-4y{jb){Z)MWN^UUL!ARj&C6i>ZZ4mC;oFW7GQIC*h1awugS z$iq+7P5v?(uI?+9|H`e{`Q4L$^B<-D5kNo15*&N0T_h!W!+tG=1|r zjCxmCleCurt_p=@0RTqzDaRS2R|&e zcSXdolx<7}I^osp==ycA+8uoBW6(LV?#z?_HOC^RzSF_2Z$MGaG*aBEHO?#|y2#72 z{ZRCY^#@bB$=#G3`HV(xl~b|i>z{9X?JCmK|K4B`M~L6SmcXTXm&?WecbY`G!)r33 zlJ$u+j%)Ag=mv{0-`i}q7dAgee6b#eU~?DVbH1(UYenryfBKfE0S(RwID-x@B+^5t z`AAxW-|Xs%B0E^7g=)ISABsJUZ^cR=fn(wNTs>{A>pyZrUo09nfu*a|IB2bK@`8hi;B&L^DY154C|E(4~_wN`00Lpn60`~|vRld^WW5lkT zcit+YQo6}MiasModm&nBM=F*EB_?5w9lTL+@7HTI7$hOZFgV;q4#dNuE<3hjYL_f} z9YOd2AD88R?`n%$WJcQ8idn@!k^P@`y+5@|fvi8d{r;GoKzmZ)-K*($6BLOvU-Kt7 z>BO@(dz&=ywizSj?kt=`^`YSYZSg*Ca-Toy`J+E8Q8GP?D6;b0?vIP3n@`*>e_cNP zYA4>a56k;o!uCDv*ZL)!$e$91h?1YzFvHfU^&LXXy`@76A+;ag(IxhsMW+Vq{oRnBz&4qzJikqUo-Fj3ieco8=5#ln@FX%vIkK^>v7L z=55=N2e3qF%O)$%d+lJtsStdKa&?_`G6|IAMHQ3srL(dx4tERgii`dyYN=Z~DGRiY zSfz}{t`q&FCBl^ZP$(R4(^R}6VaX9U|T`l-qk{)}n)NC{2Xi$Uln{ zKvRVQYsCGR+MO8WqdJ`LzbmDQDa!E$->qFMe46{MHGe{I86jhkqe@9+ar)efM?9)` zMBrmKR)&7Uod@6fmkq&8d6YvJk?z@6VZ#LFo|b?l^QPqLg$?2@+BwozmSQ-7VdXaOb|ybAFs3sGDzpYpprQc*k5{B>4DE zgzlE0NcJp3>DC}n{t6_9!Z?1mBXh0bU&rrDS1IiJE0#~;iaU-V&s+EP8FHb|^0WP= z4_i@$StA_065nm}7a!HxoWc8n4*yknpjTX>Z#qz0?seup+1f&3Z%=J5_xKFWK6IvV zJ8he_ORLV2&777wM^&LR6uw&$?M3FMHx?FLirv75R>_(B zdaA1v)7Vjf>J(VFf< z&we!Wkozlb%C4qa*+A*EiL3;9gV6lS$s}|KAgA;>{SeVm1(bdWy!ZYLmdrI{-Dj}UDbaTh3D>3M4n=6GZb5JFYif=sm2?+x_i&n zoM0yo`tQ(WJ_0?J6!wHW3->b0%cm5FUAg3B&BRc=uoxXBgclFL8~q0ggPE~?_1D>s z=O6GU{d=B{==wO6bU#(mW$C+5W380VPB5GuK92czvcLV^CG)A`<3+ zRHX*WZkijOC^YdPs=4i!z^-d&KL#lx*)nMXjXbTJRmD$o-D|OY!sm|}^8Q?*rc6w7 z%{bJMZNcker01S@SM=`o!rb<)3+KO1iDqe_SFsoCr(zQ`zG0ZFvEo|)Z#273X1D#fFf_3WkBlA?DNo-Jq^bQbliUR190^6P9YqrymB zrkjmRmfL^bWR)Zqkrr$l7fSZus7mhMiSlSvHjrT2h!_)6&Q>yFw0_?rvt(@1IO&)+ zxlN=MOkrgc0_u#`1nzv|(#VM+*;k&6R5BN`-*-jv3)v-u`Sdm%3~EB?UbQz0qS5|% z@Ct;Rb3;xgTv_9X6g7@^?2&X4CY=csU-3)EWHFQ%@OJpK5&?StQEnOE zMDMzk`Qh@TJ1^;miXR|!tqvWP8H=n_@@iMV^^dfZ>j%g|p+DQCG$wwTKAhtuHX|dH zh}5T;x5z#Rb?N75iI-h*P&x`oD{X&vXKA&98MU#C`kc>KbD5E)mo2$lCRFsyt#sAI zm@SehDXjKg*LmPk8ss5C+axmoETqC$sHHQ-`sN{-HN3#9>M;2;xYtaYfF;16V!z#* zlr=_%SU8HVIs5vxguV!N=m3uY-ff}O*HstCk_$>|vaY*SfppL-nGP7%rcq^G{jhXi zF>8Lq5?%L3>1ccv0~AhGrX|(lf!w7#;twd{N=~^>Ytvqw@KG&`kmrq-)6F<~SmnkY z+v|OkJR*W`)&-qxO0uQL$Ex1;9kN#DRH^q2l3PXh`T8N_h!7~;vQ{3}am=oQazk&T zq99PmKHaX0yeS^7JnXJ-e8z~jOqn=Z(dNi0>13{0b}Nl0U2-Q77w4b$_>w7YpO`IQ zBr=WSEqo}Lo()*O!9t$(G0WJLY_jOh*D{$XiQ&0VP?}KYkB|{J?~aY7dVVSNCwd8r z`o(mq&b57Rzk-JXkt|er7d^8alm&!seuU)wKetc<2#oX=)j9jJ3dz==>cTIee3mH3 zpBYN%Elrz_N+kFGm`JyeE$VMAvxb!xG`?7~|91BIo932eetvmF2Q@8x9i-)t=PTyI z(P)BF3lDeYf2Ku0|GSSMd?L!KlI_g(0PrR`6gs84+j2ThG()fjcu^jODwQ0$<{K|HVV<;U9_(U~6+8Gn< zRiUKjAD@qI*!)!GJhnEFD;X#KmG0kbDs_GAKXI)Tk4j|OIH(4n`DlRG4BkmLflR#Y zD3s6m5$r^a7sF~QTwo~7N)vqcKHgDm!XBJnvXBOrKfyYk@K3AXvQXsPh|AF zes%b(RDKpTT64HKU|izHt(;XxG@Fnu9$|KvJ?E5CssAk)C0|u1Fbg@)O)e?a_)14l zh+MRGf82Y{b)k`y2P@^JidZuml#_^^e8c0zTBqA&<@SS{sIHTC1{8bl$P4^usy zXoKTI(os7dDkO1({j2&l&1&sRrtrMtlTNTINi8bwKS7o*3uo}y`*^=YLvu^>`rwqH zXaJ!E4yNuOQ%b(xN%E?B_f2rjo%wbF83TRjmFfzb8evLV=Hf$t4q6R^ZS<}zv}1uf z-c^~$cNEF)d*;Mu@DC>rbpN${n#cQ{@TmHK?9ArIZn20uv&$|wIG9VeT2iExLG z0Ao12oW^RP;qW3uhn2N6TtkSOB!uaUvlfgGP4Qy+B(|@s3&O=BU>Pdjm?Vj>EUjx$ zHvDbGeu_OWD-}gE{2BU>@U+w)hySvkn8|s=>tD9`{V8>~cayr{o3;^)q&Ba&Y`x`L zd)n|`!Iy0hcI}Dw=lY{-*`$ZtLLL?UZG|s1^0gG>FMExxS2|)ir6W5f5kGE$@v(rm zbf5Ze3;d;=s}vwmW-BjO-N7wB(D{uro~LEYt5Vj{o~|ZEwsDv03v8U-j!(N>SesyX z)O85&ecbeac@#9O{YC9aOOX#-J(*Z(Sy`O8~K7QXa4=6F@9esbX9hjC@ zaF{8dZL(^m_ykpTi?q{)DuiQv=7!s&#co$Ce~0 z=GLe9$2K+^BEn5K0i>PKXs6k%fj#v`L4as;+1tZ_4kjN~PbW7yvXt@vi)DwS@Z4tg-1>WCtfl${Z7p*XW)xooBbg9GV}NKJUD%`h zZ~(2~&qWd;`{R{$ph8)8fiNNL%UcKEM6L$5T?fLKcT_ZBsk#SJ}ojsiw~U&lv_}0EmiWGfyy23Br|(6{CQwQ zIV~+M5B7p|8MZ@$ONS5TM^=CHs_M;kyYbJq_32+5zmZveNCAhp8MAkP%$0*n-RpLg zz_@i|7JD{a$&CG;Ctjcj(v>X~kFoMbTv(SjrtQU4SN-SKz^nHu_Y=!%z;)75()GNa z-m)2kWirbtoC^dj@qVlDDzmJ#Cl?;`zxf-@b@wu?zj4UW@L;i8NxBC4&H^fi&Oa1b zZP0vTR(h61v$crIaq0w{uw1Y93f&PTA6$QXG;L{?3|4H~7VG>-uj=jhP=0%h?oWMtG)=5e{ z7_h!p4qd`LSkhkcn4B}>L@F>lzR&ijGrg-UC8~^huGEXUk>%|swi4!rgzJxwEd7Wl zp^pGs=b_mBViqnO=IhsnSt%<@uFTL%80N=Qq0wV;FIZ=F;KY&C5!Y@q;VXGD(4m71 z0pBtu<-7wr7g3GUZl%73Faw6Sk4Hv3v{cG94N0?u6jolxFtO8C+|A$)EI?+_*=M3YVp2OVKTyj3L4A@|@c4YTkO?aF_Md*){;JB@B5(7KKDIr9lPT};__Q;a z?2RIS9p^kk)a^@cOEKLH((b{3tvFf7J-^nMNT_1rS;@H^Kr^uTFBZS&S;!)F?7!J? zs+f&Q4k4YZ_D@g6{AqP_O<%7>7!JcUMh`0D-F#y^$pAU5ju&32k-Pd zHJyhojoHw}Z#^8%9t^{uZSgwp;9RSekwtyJ9W;{=D{u|{AX}LB&1@^cloRf0(H9U} ztHpdZmumM$b~0S|knX=Ul{Vo9f!}>{9fsvenViEo_Z&c!qSZEp=BtvFsp9g9Efr>Ij{_9~fFXg#q1e-o3%`A+ z$VjOvEKBhv9iHU3PU=sYEoX#D*Ly`p2e)49|37p_R&T@wu^(>Z_(w`uWjYnc!EHLv zu)HY_)SSFtQWW6y%^+u^fYlcSq=MPCDdLlYd@j@h*g zWN4DXGNi(={7Z%v4=+BOkBWo|6|qS7nsy)x0}wCEHul~{Kkj@x*M9)#OZm@F-u@31 zD6r8*A~q%j3XA(ER9Xw71H%eI3WXU9m=a{H*jk+rx^$k$kr@6!B5rBv3~69pm4*s@ z@%JjnUQx`C(^uBMOOG4o*^as3^9s*0+SjpVCOfiG8qPhEV(s8!vd4ime+a!p$;mP%#olZW@;QSdR{F+}5d<)<_ra&4X~OTYS} zBHN{bHuxJSA%p+??AJATF=2~;$rw3!w?FRcdc`e;l7%}#Zd%D%`IhI0Tqnqrq?|VI zk~Y{5|D5|D_UVy9;`F0RmT-}R>;KJi(K1%?ps>P&3)56q-XkpR-0eLrJnES{DWXl7 zCK)o$sFwdw_6lP_QpGS*f=TEDLCR@uGl7X^eX3L0`uv#>7P&MP`FoAqdrjL{9%AcR zuWDH_ScGA<&t>9Hu%d|tjdd>c^u2&;h)-h!!!EF>z`%fx{g7Z&{Nt`>%L$Iikcyg^ zB0)eh(-{*3x$4D+R8k2+aRTXKyLEubJo#`r_hr~=$^2aDY*M^8(iM7NdQ)2=88ioN z*AZn0##rb70#kx-wS`*j>=cib#!ahdqsu9dj7_e!pAtoR{%fJSyra@uC3d{r$^ijmTytzg%Bk~`ET_v`QaMiP0# zRlF!^HY*p<`+Dmi4rxbz*t9;g9E>&41~c;1_ldk;0Mj`p-KZGYzbaX zI8%NW?g(VR+IL($$Kc(v_^HO}<=RAN<)Jsd?I&ZnjUMthGM^%t|MWW*weu}Quy?xU z@W&kC30XA$UBHmwEglmjM3xpDy!R*bP8E(Vl?r77RDk?%$Re0eaLUMD-?i3TH0A8G z`#G?$q+te*EW6_)I;ISL^znMoS{&<#z0G^&HU_jO|4!B*rWbv)y?*rjC{X0JO8`*HUgg9C+ zWo~UW(blWm$7ek14>I&vb?hT+@H;G%IkD#m-nuy~Ho`>fgFRWKZcVVK&gj#{|IhlvNibM0Dq% zXEU{!QS;Ko+b1f9^Q)2B*KjSAJ}{83ofA4|$oTjL4ZN}HNf|_cLHUeZW)r8zP3m9| z^Lq=6bNzi?1agqA!o%O- z-qEXZzs#`jZft$0koCGRP@y;V!hT%jTGar5Zfy3 zNt8v8;d~z=Bl+TOg3on~k4wE$tY^EXWy{b-KT{OSL7y=py1C!-=dLM-QTB+D^5;s1 zJ^u82y(S$j#sMI;oSrYVGb&-cFKT>10E=~eix~FO;m-ki_n~>EAcY;|SoNnm=k>r= z>Gkrc7HIg# z3+&hMfWxmk|0>*YV+tA$GtzszWy)A7UEi-5L3LI>k|h@Yir=QJ5whxn!5h&KyN>6N z@2#^eCDhlpLuS`s4z-P>W*nUWRvg8z1X5+iDfq=#p)IIu&|YG7WuCDJ@^TkE#o^PW zKW=L0bLqS`{@wW2w9G2?o*&%xiI+{X%{1xiE9P|{{BUTOWsU5ll0W0am9nJ?lyBq& zpv%SHHZU#;_PO_xafoCK%&BVi0ecpa*4Hi4aN#n8vrQ~Gm^T|!WWIH}Fs;3(^U=;+ z@`j^NUeA2$t|`qrlY#8x&R zWs>DsVf;hMJ3g)_WCNIj#ZB%#^hUuIIXh3SPZY)kx;k7=r>Vc3SnnW}w<*@DMA2ZW zT^E!gFe7j#!TeeLUQPo>H|Vh{lq3^3tulWlslU(xv>L7+0&CCoiH*@_Ms#*-lQuEf z72@^Sn`uY2%SyQslh zs7HFcQ4*c$koi&VARMn-dx^RX*BzrsD z7xJD)l1?=(V|DwodAeS~%6yPaSgS1e*W)l3lLRBBbR#QgDSsY5~|8#JV}GFzti&(nYG?$W4c2DUBr)5eDFOd{%S#+ zt?-{O;T=4~kK0oMX|^jDI}fN&bif?0&g08sLPC7Q?s?rJbtO%S%6dfPzfsWS6_a>P z1?x%&GkMsE-3|X7PALSqt|bA$I~Zes)+6AkCOqHkl=bzy&=|vTgWU&~kW(*^k6%?u zphf9*j1kp@`{F-NYKSl02?e zsT0+MWr+R$HK-ElZ#1R;?m!zd$)~e19X5jQY9I^^n+iu?`OXUzyutsR<8;8glf0M0 zDU|6ggX-*^xZ~poXYcg@>4;aAvSD=!L8(Tgs#qKb?al5s+#K)oaU=^UXW!h&jvAWb zySJy?gwRcbZwNIKNcRVqUu6DH8EknVu)+N~xuB#_f*ZW9XTF4t4r}hhi%~o;GGrJT z+fy$k(0zjmqLiv)MtGQ7a`w#YYTvH$j+?szGjtJ6)OAZ~OXeid}ct#9( zIK?#1aK=Z%=|gx)E#~x?4%P)9A&$6F`Gs?_^)zlc{VuOBdwG04O_PpdDT3nbE?R_g z=aWjwZ~o$5Dwx-E85TEZ~A=Ax8J67f91|Oc1Sfn_-vXgS*dMQ(DzP{d}Dp~dR7t;)b zhEH}HJWWy}^YvRjbZJc!r6bwcYep0fas(fNWcb!MO810sFy?jd+N*efLa;M_vWhHj z>y^D8Q1bwR0A6^Jd8VU9%gB?k@>+w+xyM>5in*^})41lzwI9DW%uURbSb0dH zRoWBO{C=;O_d>tCRc|+@TD7lu4lm3Py1AO@zdaJTvesv>Z2yda3-Tkgl~F}QJbQ#k z{sM0`rbV0A{YSfH3Ec}e_)w;uTQ-JYKl3)LkWGz?`4tp(fB^}sb!6#&7{ma9oKO6OK_BzOHVZ^=vH<4?m9#p_{T#FWM;Q6&Q`I6V>rX{cA<+AvhB_rZ8X+O&Na-p-4ei0bVKz}e~+^h+ivQPsj2 zwVP`^sCj*C9i?UczASRYlecYcMN47*_ELa1f+`r8yY6)z_x@KWd=EP^>aom3S#fi2 zfZIjb)-9tn@fA+B8`evH^cZnH;o;-wqq#Qql@lw@xk}17?>we&4I=0aqqFWea0%wz z>O4q)skcSvP}kC->hq3Gb?8-b8TtIt#QAD*+K0fhMTa`Jg}2qx{;ek-aj}ZbyByvp zuHv{|KO6&per61hi0ft-F@T+6*t^>Tks3ju(azr+M|W68>$}eHOy}=1xTPCSW? z06}D0YJ{)-{&@iOo_ue}^z)Fux8P%vp`YGX2mj?U`LaG<9{c_a(+qnbG6~KLraSfb z3>Y116W0K-OG{%*90+@7PUuV|3;Nh-SXR6?Oq0&OU_$n0)L4BpjFSRZ+aQ=YkU}9 z6Y6=!+&Evn=K+CexUcto`GRDQiJi%&L!-83}4X;4j; z1W9G%pwfq$R>Hh5RO&0vc<|dIQ$ybB_%mT_5>+kSJyppWuED) z-Ac>4h*4I2YfV`vX$jR5W(HdO&*l{MU^oZiA!k0odF3ulSrNFWX7R-t8V0Ybk=>%T zA7`(mQc2P-+r;z~`QIk&B7{&MkGlS9IXl-Q-^sH=VXljo9VS?#fTQm>)K^G#Ia0Xq zT_?CAj*{m#uU_1yp_b5b41%C7Hf2*wn%5cN8xxX2uysBVa|Iar%UD{H;tzwB{AioO z5eYk)IKt0kG-~KCu^yrR7*8mgXmZ@v^)-{MMxAMCG)N-h|Y`Az~}6S-bG7*uV(-)Xj^B z_iX(0?$iCZSS*}G%ucG;leI$zM>J0@x<{Ds2AU9cvgn!=Z3|?z`Za0eafhoMyB7*@}RuC(W*-KwaVJ?qNs zE9E%aC=XG76Oc2dc6qmUA2BUSAfzJbqlqpuwpM1(Jm&qWqV~W4Hi%BrZai3e?Oc^z z1OLL|qIM8e7c+Sw>=P2~`{(=OL6?IIici}d8M^NM4q(1-j5V~wueMn_tXMKCPu3{K z)2S>o13NH-R{OdKbaP;x`+y@FEHq;4^7%+)^DO5_^ zJ;`v3q^M$kxkF(=K>#I+lOfJUg9t z^H!&GR=@dAvwk;=LJCv7l6B$7}yO zC9lH|#ErdeUQd~&2+t(??z3!Lsu3dM89*ouOTmNs3?=E)9e`2$2h|RciDko}S92U* zQ`NG*1`UEwjpSDXxw4!9-8-6|TZ4UZgW0PMsSi+og30Z}$mysCZ#0BQ%zAzoJ-UOR z5xRcPAr6G*ubVUyBPD}UGj@CKW;SfrNO35O6$vljPIVi2c8jkc=i#$QSL9|&C^#$Q z$ZR5gJv1jaAZn5tH>{4$SU2~xsK5V$STgu^8JhTiu;5~27*Xa@tsH>d2PyrzU65_$ z<4%7(uYaMEwQ^{>=(6U*HTX*b9Ns!Dr>o+7?0D1y)?4Hu5Iys$8U!xG9CQn3cbn`M zc$$^VKbK!_7W{COnL9M}5f8{%tsDGdq(*4vJhh+tuk9Th>@g1;(NT!^q2-)*g4-i- zUiorlbTy7vP0JlZ^$P46tS{rj6oTFxQMMFrdT3N(<2U7`?N|B_!IitN>9DLx886|6 z|NF5+>4^cZJ9wIq#G6cE%5x;*9QqE@Or2=F3U=uv9<1V-ztc`z4Cfe`2`96%gJi)x z)w!sQ%B=v3bPc};0n%|aAOeY&fS=CDBh#5uEv%D>LTjXDn8JpdTnZm_$NX|Ec-yr` zBpX-vYF1jVrJ{akJ`s9V4869nyhVlF4#A^m5HjQxxEpeK^nUrN z^_gTP#6J^c@5>Y`-by$$LdX*cXg-{|dGfa3G|~>v1%v#Lqu}_Kj1*s3Oi6@p`vDfz zJO|JVCLR;XlLn*I2zl9+(7na@uZP~M0w|NCmMm0Iyy436fpYE7mh-JAkGRw{4dbKW zMt5Z3pHQmVpY_^<)O|Z1z;HpSv0gQ+KpEuF*f^?b#ZdjW2XG6zc>6c2fw?h#`6IeN z`<*AYG0cV*-hWw;lTD(0&JEK#LaGZwul<%j_jlV zMmK$lYAV`Cwc}vj7PR>s&f^Uj_K^kMwV`b$!YTGSEUNVHF9t8emhkn>RvL`hxZ}wk>L%8gT*8KETUlQ+ zmV#b9z?<#*pp>HHYEhP2c4-QWUQ9l)?xW-IV)@4NEnRs{3{Q@1lGk!I5bVjyl%K=j z2+YPu6DuSH;wk_{hFva|03WP7#k?Jz3of*;yv^Ct$N|~PCWN%y!p;RDGz-V%HuJ8M zbX2*X$ z^*9=Muix+c>mA#rgW47_zg{ku-#k8KfrxNh44{)2_Z3lHND=aq=eY&~UR- z{89+|Cv(7(y!|cCjC=0iuC#+d&vX`am<7D?D~1wdy;D>yTJqZ)<%abSzpmDCQ~W<| zM>uv9ww?IgMD5@K8^8Vo=#7c(Cw#h_dvi(f$~_$+hlAkPEHAOgX8mq3qhn_-*upH_ zZYDM2Yj~XJDKguqnnnxeo$O6qY4%3Tc{vT(=_LmM{h@O=9#M)oUYQty8gs91qF`;g z{O)?UkX+o6X4FG;w$b-l*AZS~5$cyeYqtKxjd_7 z=&_pvA$d6O+7!$Y?0V~RUFc-+3LWe#FW53qJU+K~Cb%KJpl;@CK|~$Oqchjd31V>7 z@OJI&dR@+)zjsLSHdUm#EtDS&~2rLcwv0-8&w?*BSgA z=R2WHmdGEW1ro%37PfkSMFB?z)8)}qK{+C-C+kA>AE{dBLjq@`YncO#U&R+NO%Vuw z@!hzY_njA!Ze0$GPu{=C03{M+=-mpHI)TjyrND^Nm_>&YzJ-8}%^Bc(7Z#ek zH@yTNn|=K(r%{9G;_>_qCF>OpHrei#wGzR7P{oPDCo|&d*gO8jMwBf=pAsw!yhJ3A z*PGCuE2s8bHh%|`e+M3s^RvloA7k-_q?7SqaYNs*GT%_sucY+n2VII?%D|2_mhCtD zoJ3PW#lWOrNNHq(ncdNCNR$2nKP4DT7rHjoSQ(R4k zzo&|@N4__$A+cn@h(~Q)8g(4YAmy=-BOPemhchOJP|J7mh>_ki;(mN>%EM_&Eok^$ zFszhDRE35kyF*T}O`D->Q0;8iJ2DG&u+^)OS2ukZuK-1+v3Zdk@<@{HSanYC*@52k zXZw__&kvh|_oERQ4IJt37>z8%dWwYGrbwmmf3iBk90V86S5D6MnGg(YR59FsI%C6d zVfeJ8STn8Q>7tRZnoFR%o>n|I8KCZ2&&X~exCDX2^K^avcohh`TknrqhfMYoU9i{E z$X!6ReA_d(K7%}l3PAzQy`H9FWL2gw z%lWkRm4BcK>hN#!9O(SFvwrn>mF+q1xBwyO%%k-|{(Mbq3gI!-WH_O2V?|7hyQq*J zR-_s!=Z3t<^@hu*>67F7>6KIlL?kE=5uF+8+#h>ODvnqGAe#g>Q$$VxP`vrMgzP=@ ztG^OY#WJCCxj0FD2CDg+vShorI(`#rhNVdePjA*V%11#_eKl~jLeks(*O=nr7U#5> zRDyF`)h0W&Y_l0H`O%%z?*dy%AX}&6gM&dq3=X?v_RPcG_dyJ<_g@4i-TXWI#?6BO z6gsRV0a&bZ&{yata3~ScwzRLq&A}I5+p=_&px@YsSo_uq7xZwKi$2=^ry|WVRT|GL zRUjPbZc-!P?>rQPCjI~>B`gPg6yV*oka~*Im;TaU0vEmTeAM#ustZ2UG{gv;1Q8As zd1LaIv93}%o1M#^(!iUf*vN$*s|YNP*;|GTRb4m&qK3WYWY>{6^V#sLab=1hH+s)M zWsQLGDRX*wIcKZt_~;O~27koLgWy>}%wl>zl5AhcA2C(*y4Ssp`7p!a1PknPm}YT$ zQgG!CeJKLQ{E@RUMZ(k~9X=|FF0`;yO$g~_!2hAl7MJ$iu!^OVq$_*>@Dq{<|GRbA zJJy_*?fOgr>@pl)1>oCsV9EBW>^Nb`)>`KRSS`9bEtn>Lua^MqTh078@$Rl*wptC% z(yug)>;0p~%sXy!{*kQ{DpjMM2u^R>$%f?_)xllzAMbeDQ|+&>Aa=BM(rcR#NQ2pT zL0XEKpP(WqOd)M}zl1E3%d0;Q?s1ESOSA7*6fGzaASw9+ytJDH!=u+bwN44YIRNSP7f;~4Kj>aSTQ zSv>V#f!kW(h9O_qHe(KvGcjrtGLKCmTTw5ma2l|19#@uJkCbcOI94h=rI3}03VfkX z2eRN|d^&38e@f0GF=*qDb8goLzp--|cC>y!dn*|!QEui4o7(sI33{@<-ZC>zBVcA6 zYN=n~t7~`L#{V^W87&SWNQB{4G+^zN!Ph!WvD1>#{eRvneAIP0&)3uFYtJZ4VLBSg z5pv?HY4EMPx0L@YS-d@#z{tjEvcK4d_9yoQwGqZIhQL(|z|N!%68`I~iZ zuaS>cocivOqOUFE2=SJo3vtkMQ6in!1IE@EakcqqkhQG#rOk;mqT#8F`!lt_iCea+5rs33Q< z*U?$gnpBiyBQDuqI+@q0rd_41jQF}5r1(1dM30+&%8+sY5^lGyHIVpxHRe_OF>y8X zP9#M%ndIlT2{rTZlLY<0%8LBqv6m#0_&uxo-HU;56q{|F0C_ID&#c$mONvViPFCm zs8_Iw(63I(*n4p!#rdJJ-_-U8H9(0+)dxSDC89scwG3ZZsTHw*dG?>KUekezGdG=C zH318+t%DRDcbeBQecC?TC~i<7Thwm(5WPkG2UdAM%^%%jF5F4v2T*nErA@BI=Tw4s zjDDY6)_PaaB4Ju6ItCA>MX>CoT7FwcD+-!_n+D?>q|fr(I(E@sHiw7Y?a+`2Xi*`) zVz&L(sy-5JCaWUB`*(DMqAk-Y+zRhu>@%SWat3bc?7^yr!K)|1{ZJ(VeR|LUHXXE; z!EslbNw?U>=vdF_jNJUjGbH%x#X5L?d7GTM6Z4T&6lE|`hg1*!q+O#eVvDlhWxXQ+ zJ$3qHdpK`ks&4!J_9-(G_(T}$&dfH5FpEEmI{2vGv6Dq_tB;-2c z8sZq}@iB|vnee`nM6%y|XdPYtxwzZWC9(2%dKECK2;^s?Xd@ zSdhh~AzO&5QDWaHi6CvW@D@xVr2faO{X7qUxcI-Civ9@=$R&GAw>&T|3DV5VL+LEh zR47FcH@cuM>T^NFYBJ~wK8HX03@9)HO@QtpEv4W9!EGQ2UW2?^Qa$p|_yC_3N_`F= z3!X7IW_p6i)2S%V_Be;r1V!e6ulm8ap1<#LlDh}{y0Kr5G=W(-*aL}utu7S@x6zp? zG>r`D_ayMF+vc0rclxM%GB_P7hL>U6IJE1xI{--a?NXQG4YbNwf)?kQuW%&&3Vk5T z)qxqq$0bYX-za0qB$65BJov{>-R%{|d)hEI+tMdx?}0Q14R-v$&iiC%wf|rQ`X^We zt5T4ddH6zE4Vzz=WFNMri_t_IQ_f|x%Zy#oNPn+<;BHS@cxuKZ9_+V9EYaAk6O%^; zc_WFk1PgxP7c9JC!#{iLjO09J^wGfjLH<+fIKn_@A+_XT4B3F(vOYuG)?C9hpmu;_ zgLd%$CbsbOB2d^~E(&sINbFKDGT`V&E)jG@=S;-K}K`mepl^nSqA-v%7JKBKMBFHkwKqf(r-4 z{Nk!K>H1JLRwKK%HtLVr4e^0zN!k0Djgb&=2~Qt z*j^H$t3&~w<`jGL^V6QeOQK-9;_z{dYrSz(prJ*r=rWCh$=D&;KXib4yW1>a*5l1$ zWYs64XdjtbWdZ_bQlqV0-Vfp|YzIJD*W^X7AOk#SXtMIJ#RFy!wk zmb-=07Dy7bi+DQpuDP?vq+-MW)!nof+}gGD7u0YMPyT&kj+Oe>gXaU=#eq0~ocm-9 zi>oWa9fux`uul3HFhpg|vH3+OBHz4#{Qqq82;?9E5TZBLygKmPxR38cw;WJno`uSx zxIH#bu?1E$)P!qkcD?)4Nq(IgzuqE@KQjg^vZr5U+LCS+hf1bo53h7auGi&{z_EF} z>l}U8eh>HI4dIbEMBy{BZqrM2UxhJh?%E#jOsEiDWuPqxpGh)}wa7YL+?4A%Xeh;@ z3`na0Bi^Xcz6OHD?JiJCC(z1N4jS@2g|0kNPaMc6L|*sR%6JyJ-1n}dS?glCsE$jv4}OLq4J$=>I@mf z-&P1D7LKuKZlKw3w^^@;=LWDhl#&~vHf`RK@^C%1{DI^&$u1)NZrKy_Ror2Vbd*Ud zp|Y2lR(H6YQAHn&o${!tuzJDOwA^y4I#weKe^9LbnCXdR$EMF}cmKcV+Rxkkd%SFW z0UFJk3AFmp;c|Xk%YoVSD@1;YTWFK^Wj5*=8I2=Db_1GSTmtyApMq7}SKJ&iZZ>tj zubEO|7p%XK3xEI+e%BX@iLUWa!B$~+jzzy+=BEn0pn&hWXNO=t$3ye7l;+tm}FO?@?#9M=NXMquue>puTsb&gNgvySVtBS zU_0yQyaOA7IuL*Ul*j_P1nAGN5%hBN|SYCS}FUr3G zopzF5N*)llkM&yDorR)M?)5BMXAM|!k^>8fEFF3>^YF!Un#Kc@pQ@#F$M5S_zjY&0 z^Vz2nTwJo6+wXojL;3oeJb}eEYR1wSCT2`-KY=S9V8@()V-f1?Co`q18U0mhcweg< zGick;2O)c@NTw&ql8X6M8T}Kqe*|TU@HL9awhRq;>sbdO2tUBi_ z&&-aTS-bj0n$MH#po1&hB2?I=2nHebNOLaKCoW{X-oBRa_${IHLeR)@xq(}zG{z_^)!+?Z$A>3XN1gs5ShXkpR=&1df4h%QPtyU-=%Eq7xh~oz|VqIc_zk?{;9alJ^?PK`L)Hgd%jMO@JDX2F{9u|aVhVd!K|GJO#7TfQ&;di5hq%A*Q z$I3*Qd}^(cWzG)+KrJSHpWyfmB|0L6a;p=ToC9YNbn8vcEQ2_|Q3 zd@yh*Xwlk`fp1$?=X~az$+RwdPhz6J*HW+xL5?Q@0aO15upyU|8}z<)i08sonv2C^ z)U3>p*)M!N#zw^A{EN<@U4{Wjzh>mvPoD(8&v{7{#Fo#><9Pmo&Hdt_Sir8g%oV)= zALqHbU|b%YmfSCxWs^P?;IDIaLO7oi?T|p(pIOp87)_R)n^NTg`yVRBe-FE(igRF$ ziDTh&G}ZWu(ziuHfeZCcdx=R4?&2AoV=(HW!1ZA=^N9>;xZa;0W&fWNL>N>%))7PF zuB|DLzfhb{SJqW56ggYJygRo^&-UkicqR>lyf-+-{qdfRa>sv2e-VW9^s8SYFleb~ zuLj151De%6N*M}rKap3Tm5Wf)(8TSrx?$gihvb9^b&kMbuQ(X&C4HkaWpQ=y4IP~Z z$V|TVI%||g{~w-n**J6ZS;<_u;|LjXxI zhNRXJ5J9wQKY~S8CM5u&zmpG5uv2p;vRjNuYltnj?LXomEdCIYeO^m(IPcFm)%7hN zp!+b^VI&>ek1$zpfENs-H!#~%zB~;VN$9@6q<4b;74zszzoZi`yWR@e%ovrbk|b+= zKLngMrx_B*tOi;)KMKmv?x-PKL|KYBypap~G!t0e8|c;S$!NFeklubB1AgyJUJm@K z%jX=atRuvjOa-sMy&zH|M|w#WJXxGW!I;`DfqG7c+fHgRwGV1&*kh@`n>VNT0%_Pu z-|f&{tS50^`w9!TLk&Jf8<{|lR72tj)Q?6^<;DCvo%PY&pMe+NANH&|TE$hwp(|M3 zfpGm__NHiBvCcDX+QlYc0It3D_3vXu(J5{m*wKmM+w{u>?^Pa`k55G^?O31tFxH)4 z{giSt{xw$&BMlB=NW)Ffs{75rK-_stp#^OCe*#Rcy96e$^)P6PCjr8{$Q8z%92(a= zXGLx%1LNl$aIBq9E(>I5EmP}T+GRXHYZQ|Cj5 zTSOxa1Y~tpijn@jRg9tjBMDZ!EoLr3Co1Su?_FOSi5j~mtg zP74T0e-~y0jSXmo$xSVY%KSmiPB^$KAzCK;!hN(ah95N#vqZsjF;bG$nDIWSPWbwo z%-gOQrtfxjSbdr;29rBZWacZ4ky|ngb}FOCwN<64AK=LK!vGF%f=l`I*&AytG8Dl&bXJK{euPj74GHHOkMRTqNVt6pzZol-xyIPD%a^eappqTFxEK`Z)`j73~=0 zTQA%a551X@_Zi-JYy?;>5Wu_c%VjPaDCg?4cJdoCZP01>g(^ZWqI50&U32M_sU!=}x%jpbZE*CWtR#J|LKi(krIh7+) zSg*#%(C-FqQZ?1~nDoba60m4wk_fj9D8~jSe(8fLSiniL~%iskAHV^v>jD9O^*r$L&hL>U8tMFiFbN2^;hgE(gFp;wE)xo%2 z8}bb3GE@-6VN{0RWd@ZzNX`c!IV0wBh8_p8Hm1IG{+0I;rQE>p=_pG!A$(Gf&(dO; zz*jooHGJZWD_86u{1*j=zp=f;?Wp(L>OqMlW6cF#a`DFx|nq(R;}-``sATK?%mIp@BwYi7^hpGlHbc5`2Sfgf_W z8=-zCTUX4N0iiUJJ>%?~c#}zb)Q_?Nl=f$1p3wKMgFXathjaUqUJlily1fw@A-UyA z*!MU;t4+oL}K2nxt*?X2~+*ycXUl6AEKUd2@Q z`o>jhhof2<&o;wHPA&Vp4uy7@kIaQ619h6|G6DdWn&aW~F6b`y&h^<{XJ+9oRLKP|9Kh%au;ONa+R+0#RvEVM1H=segicoI zmf0xwYR#^F4j?G{j6e0p8oU;cA>SBjOf!@?PTLOdTs$p#hKIZ06iD$B*|Eir8)POU(d`d+?)PYdw~ax~e)*LVwiU9pM&n`2^oUd< zwKJb|%svg5%7Jt=En@+xQQBTK_s8|I`@n;!@_Y87c)w7QTqb`05C_oKl(D+|wAK;+ zH}=^5f_^_XMl8GW*$AaPF56`irxVH)HKhAd&)YOUEe9;#4YY#O^cIqzfU)azWI6dQ zk=E1+lK3z-17%E}cpN!T8d*y`o-_8Z%gG1rrYBJ!^3Qu%j;}9<@zV@h5)BpPQEN&s zeka2e^!)5w@$qpSU;a4etoZBu^T2&9wondvjd8!D(P}#`d73bUu%$)f(h-mjXz*x& zW#Zj`*#2XFv6fBF^0+39>Xin=T9*yic}=ojukEYYgU6~1vWpf=Nmd0)qD0z^LotT3 z$bVs>Pd4oqg4u8QNM|rgK8?Je$8!hx#al3#8v(xu)TXASNnZQz)b(bcCFWDt;!dcm z{4N?LK8tn1FXor5@(cW4rZrWB$2>H9RbOC2Ij_%jEKxdi*g%3XadFvK&2_0mXoC+y zkAVUI`3FM&^F7J1&G=837}{wgcp}XwUUFtdc4afqjXmPNOy@k5AqZq|5q+^*Qb(Xd z8E)`fEWAYQVKl9L8Y1S_gD%CrHgAct1Z_|bH?TM7;r z4peW(mhM!*Qa4LV<(Z2s?b zf#~FixVF>nF{ZAP4o+OQF5uXS$ z1~(89S_rotZ_X4MZ$Caz77FC>i!WQ2?^~X3--IlrZU!q{_ zG~3C)g8G~43b3i63F>R${YOnIB8E}n@0Hk$>3QhWTzTVO#ZW7;wH`hOc}Rb#lITp@ z)YIe(6@148PC4Hibi}D#P(!gi9x+4%&G_&Y2gmo{DrB|nnx9?=|+DX}m!6#mfR08Hoj6~_oXiNl98vN0vz)Gm5>!`_9YrkmnU#BG0X5r~#Q znZK4GhG;$h=NP6g?OIY=LIAcduGE|e>Rze*AdN$98vKY2kyHfxL_QBc?hjIuaKkcn zrHm-KXT>;y1dfe@h~K29$L|&VWDlUp5bsrvX)T{vGn;8Dh?pzylVB-`__yZnnO!~1 zw8J;WtvFcO7kScibXNr*MQ8Syq|T-L2>_=N^q|6~PQNr!2oMmWa$t*WY4uz3o5d-+ zj$9i*$g(%IiF(iPjs}h(=oXx=3!bB2@2z2g0ZHp>Nt(1%S^~Ry3UD+DDeSjv*AH(0 zB|L(WQ=5TH_yuVTC&a1@d@J`LVQE=nw)o&|e*c~vYD{OZCb0)IAnh|rU@m1WE+8v; zVB#JbNwLTCU|C#>NTC;()m#poyh;VTVupmY3Of0ACo=z9^#nq8nRMKHmD~qScb-v- zEsdn<`4aXQJI9v2Y#~Cf^^=73y~;0e@QmceF(HE=tmSvfLE9U*mqYf^Fq1W+^ygKS z4LP2&;x^-YxJi;X&1&QO$VSJxjz9Fa(KqZ;ppoJNPx3lV# z0(k^$6PjMENWSw19(@owbWWkuYl z__6gP&a;+W64Yt-F{`LkNyO7n-U%wiUDNO2Bjx3GXqZ4;nYOpp!x={Gy^1K2-Ceuj z*WEPS8#ZtOG&yz<}+^7UMoxQuoaYTwzP%$wN+TKBJl9gq8rKrAep* zd`($Jy<44c-Rp0=K|6v3e+we{^k#P=%*GC+|XB8moRMW-2@!s~;fm!jrJ zdzL;m34n+&uShd)NcvA0q&j6`vq!%)9qtfI#Ji~Seyqhs<5q271%DhArcmc2dbMNS zXR@9#4$UJZp|B->Vm)GpAE1_y1&$GM8;qg``mNaH1*11+ck`fx!SsT2T~r>5PHGed zf=WC3q3Z7H!fEyb3T~QVSd~ibuueg=z4}=%7OiCRuDNoQL3`Jj7f>vFCLz`aovu0IGU5p!i z#!<4?r_9@8*%%OQ3PhRLer{rd+HF}ubA(2yDdt-7&+ZeeT)ZYGn7RN4q+rIF-cJ8^ zJ_n5>8Zz#Xm)j-iZ4qw*juu47UWP<-@@2v*iiUe&s-+611>@gp^~N25w|Fp{B(4HH z1YGO6%263Pi$UCJV$aOI-|Jz=QoKM0mvQ%uoUV!ZTud0KmD>f_urO;Uk|x;1i+; z07!<2EMzpsy5~RVe()r5L`zEF3>_E2jmUx}B%x&ml-lif|CC&MeHp^;4!>~sEax|c zO*Etl!#e9w!&`E+L5eKDexz|vCg$KJ?WISx`0hJ^yzi_X=R4Sp=AAA(yi<$^zZXoEEun(6WQO5kq__G4T&%;xLw9Rm3 zNpzP_2AFHhm#)!fA<;^m+9TQg@;@pV=sD#`aE%zp$wu zQjdshnc+N1Yw|FnEW~xl1~QevEFM!1MQGU$qQd_4lX`n@#gFX?1DS6U_$*#yyoaRT z@u@)=?4j{=xqhnmA1f@|KqMyC8HxZ9|4~iyg`{J?960S2W*`HauW1I)D!3a69D!c^ zeD*XPgdxwxv19<<W^$u{%?S0xZ@;Q1vCkQF>ofV(&!6Px3=C*c7IlC71N&`^#z5 zmDc|+)>xKMAU5f6CuOVE9B9F$TX1Fdj!>e-2hY8@q6Zi9P?p<&Q}NI><8mEoA-IV~ z9GppbhQ9u%{~5?2Oq4XFgh>1vT?A@`N1mL5Flkau6> zXvKWCIWE|9spEaF7OUKS0QefI{)2-%#8Qtjy_x2E#_m9tD_>MtW}A^Z>pu9f0a?-k zee`8%AO$(=w>`8|^2l!>2OdGx2Ixv~xxok&ion3q?rBXxe^oUTN8P0lrVfD@2Cy|X zmWW&4qk0lBaj*#@ZGKM={BA1${cxI?{;~aw3R!4;8E$GgpFUfr#uP2xdpPixDuLW1 zROeM*fqv7C>rk`y0O(6ZwObkZk{sxGn5{3r)1+1W^)+bENp@z^V;35ru>j?PGauEA zdcJ~xs-u?8`VEz)wcOy=Pn1ubw8YLY(l1%8(;PjQREd$-hSxZFX0BWAa1ml0+)aW1 zq$Q15A8IlZcGp?!ix^r)9rov3&#Gg~%l`WA!g)$-`-#C5$pPKPQ2@+Wj>QMBlbRXa z<`CX%$Z&9bmg%-0Tj0}WLu?2RC7pkV05fc?#2I1I+K)%9e8%@)F z@_^+kZ~J4&T3dN0mv{r;R)kf-1Rs%!*5Z)(my2_s5H`r;ngigy?wf z9KI~ih@&E^X-6z5;_y1D5M1Rt@B6X)9_&V`oqV#JJf<#l`hy709_V~(VNco=ne}_V zlWM$=gILnB-cdyjdM4Od3I;$22i^kPzp0n752u}hM8@6h=4s~9=|dID3b?<2D{7FS zvilyzGi;LW2&NZ0{`I9$AhJsPYx`)O3-(w(jIUgDY92FVws0bj!Jj2YKd$u4!KI~h z4q*7Fl!FRl{r?7513xOTn#*5nAazFP1sk-lB6K8zRQQNy`37*xlY+|%H2#OmJ9lL1 z0dOkFECApp@=*Qr@F8`|Nof~I1z@5C`v!PzIj#~(AId+a+Js7F8BB8EP1EK$Ea$NK z=!GN^3-Tdk0N_qnFZJbcsD8XGvV4jXb3EPgy&>*0P#VF0`LYbB$J16~yj@NWTmLvIXSVzhVyd zkSp(4DLq8$T+8I@O20uI+ExGvW5n$3G_U_`?IVfj{xk17*eQX$K=CdFczFS&3qUOi zyaCUJFW|epfc*<$Zf#31DR6>>+Lomf5G&b$s_j&ilFh~I@+pO0upZm}9c*63Ky3R8 z_#GX;r}LLpexiuAj0gox8WHF#!wrT(MJre_K(KbCYe_S$sdrEMQlBTLJExHnpASr}`7rJI$ z|N5p*`QP5)>7L}lPoWrp%KOZzBL*%?l0|V`qA;+(^|pvyJ&kne0(CfBY|`yR-C*5U za+t3kryOdI6w=qCp!FuRBf>YY_R8iV3YB^9zVdgP9zMhu3F%zbSz zI&lk2PcF&TBXL$mgNFrShO$%92KSBE_L`3bzEF0$v#V8eNa+LH6B*Lg{4-~sHOklx z5$4R&$FN}v8pU*G%+m?yy>%&wCCn zNN@i=%|}&mcl??~`B-)Zj~dTH?(2U=e!+g;gJoNoa)|!%Rnh=N4TwqYXa2l&phZVg zz!krQ3i^6!g&+Q(e6d*`m3?v^0iSbQ zdGg2sx@fL^meDtUPmUb2B(r7buS;5kY-DC>XfTtGgfzE~mzN*Sr`p9#f5O{;7D(6+ z_)FkA=;bs~O$25MenyG;i|sfc=Ogz)ye57x1oLV7<7obyo<#P`Lz5i<(@~Tre!;?| za67keO6&1wmeVp_|F+M@&qSZewk#|uY5-BD$kjldt%{-DPii2gUwG1tSOEeb6K8Y9 z!qiF~Og64I)yhH^690*1EWD<<12;AN4lTdgoN5xxH<%d9dyCR*^1C~73M9yyC zs8glje}m@NgIlPZ8DI50FO!1R@=&GR+{eimlb;wfQUyMV<`(77XE55=H{uTOe6}-y zpoTw8n0h8~<3k?$Ate#gj&106s{Ay81}Zj{c;IjLjA*GLg^LD=l;Hc+ zi-7_z6sY>lC}m+gn(j+3!T|weD%z@`(R@5oOkTMM2pTz{67+i7vFOa1mUK*7u?R^T z@jTv>uBx}Ts_R-a=+?K*y@K-@n1o_STR zl2l9RdUBi0qn-T{OQ68@L!GpfIcdMtbPNj;FQmZCj*m4FkWJGsssd-X%;rqgI93`h z{Bzw}p9(e&cBw=CWe((QWI((Gvwrts)bE}X17mCCurjs{(|69fzv}Qj$)GfvuQ~^Q zgSZaUDB1SC7-_vT$YC88Y5s!qsrSizjF$@#M#MR5wTHg{E>(l@`KsvZ}9E_|=h^R2iDBSk&MRxEzc3Z@oBHojs~VF_jA-BmM%!-`8h+^wE@ z10+0T`QsjhuaPAmLp&a^*syOh!>xHIh`Rp>goXXmVB&Zm)S@4Rz#!^PZMV91u44#o zP4ZI5+aUojcIzmhWtNvus0GrPWJ^Ibh>yhtXrr4=>5!+lzl;A+J=iQ^BK1?{X!8aq z+oROy9d;0MPpNMxsmW{PeocHN5rU4uC*Y-p;P;Y29)rB^pYQB)zJ&6KT}gT@N3fhq za&ng?$niLcMjHvmnBnlqw0A(8gYBR+cu0QpVTLC>;m=(u5#D zX5AdWpKs{{gD=jtoIms8@!z(g(N90aMw#%e`@9T=O;uJ1p(5=>binWA4+N>uRK@Z( z8m7#se;w};iO7t-=`r;%7Ju=9Tap@8hEi{8@&n&xEa0GVF2`e$=uG~- z7nN8^`X8z!>j-sT7W*N?WYpwCnDopD3MzTMu{rzn5!Nk064OAta$Pm)iuV0&UFUl0 zo2PVdo$@DW?1V(|a3}-UA#JFP*x7br8M)i+#)!tmfg6i&@&*~U)XgWqjpLc4QQk^j z*apYNTI<4?WyaZ(u02u6%n|5ZKw@ZanWnUG^*H2{un(q2`<0~oKlFuo)!jGP3K)h7 zeoh=}$}s?@UBSy(&=jMhg)}RoYp?hLdnqnuGm|(!>it={Nx;25ITGEUXM?(Pfr7j5 zPlx^aAF4CFzn6f|hpBpZ8 zD4>^PqFtd9hAT34 z+A`qqgN1wHwW_CSBz0B|AsN!!56YS=(V&9xd4(6yB0qWaw9OIJ2!&0oBufuJST}ie z=cuzxaovr171w7)v?~L9-VUgW_r)FLte6 z&2*>Fx#!8&AN zguie4j}fQNe;~y%s&0pIEs!*i&iG@`v*1qnHKV3NfB$v}2&4Rp0>S*XcC94Ge(~5) zBN(AV$aX|^gX@}qnS0g!L~e!--QQJFV_%bJ=yiw z^(Ew&b5gO?;7I>p2i&uvI-}x_3kpoPGhppf1|m5pj7JKm|Ch>w8SODBp}XEoWi9q{ zk4y$vn#UCnuhPb^Gc!33eGJop*U{6f8A6Rlob_8!eFvoY|6DuC=ILDpv*iWv8I@Q7 zOXw*qLk;2%#04wdN>vIZ_?l>}adrZ5hhSNeUf^!?#rd(5!r(&9C7K@1-Sy`9uG~HJ zqCGLaZ#n0}zsw>AAa?HL6?p6FfC%YX=GZKfjcWbquzGj>82JA%s0B?`X26X~!imA{ z9hJa}tI5;;gR}U`^?U7KcWML*fQ`w_MB)@h`Und>TRvS0rhNbVc`j}lFe4_@H={Q@ z-qIq}M2}8@X=KXKG#G{e{i3t46PLVz*8D&~4eS!|? zX?s9!>mr0Y1iaUclVvbU0-l7~`!N7xl~{&$_qw*;r8IMgzzZ*(rzKtnCvN_mp%~zO zlips8-JvK>1b@lt`C6Gz|kPaB-&6-1Uj7 z*M;3LwGw}NE8NmogQ;IIgPF}8APX5&!f5DgVIp!k{@kiok++WZn?_#1Dq^4=hh1E^>U?3@| zNeceHF+|t7x4|hO;ypb7=U?+nC7do!N4|HJ6^-6+GkofVdoJdv6ALsllAY;=tG@*k zY03}wRzr93T-5pIy)@Tq*%w(X+UX4iS<;Tq$5_|9WEJ`x*h+i_d_{c2xYB~YKjCkPX=8UjL`DUCB(o}`Y z(vOQ14%75#@2kk+;U6oCEF%py1C8$+`g=s^ifPbJFi@(IqUjcCyc$IpZEr?L)@c2i z)Mz*e0>g&x+b)O70IK2>j4(* z{KpuiP+M`mFj;Uc=1qC*uPLvgB)0BY&TUy{Jeun1r7#|cp^zF_?ii(YgnG85qVm+Q zU`xtK55MhI{*&_L8aIcmo}OPasmu7)1>~vQL|wRvaCl`dYIAf9^u52J?)o_)WG~Lp zC`g~7hD@Z_IWrsmX7)-isQPPx?=DMaH~o5=%=|CL<9W-J0S~v+?lpC*eNDmd_kEdr z23KvhSQm1>B4KE>05M2TE<&!K(E*J^&%+EeK5xhUyz%Ju#*NmvOMp(WzIOS0 z!<<-XHfwV!|EF&y)klrM$iP(=(p0QlJ{)P>nk!;8&H4br|V#<+%x&)zYt1N{` z*+jOg79Pn)!hsXrSLgNZOBU!hdg3+q%;MJZ zl{0y&a88OlB2-S1|MSsDEq7 z!H@igO&)7=@B*g`mqu>+$S9-bcd30fKegRuZe?`Bl0PAVhr!$R*O5x?QWH^O(XS&l zimNJYAB}18um|GK)!b8y<=PBG7Xt>HlCY}c((gBK7T4Xsbe5ePsnZq*dsGiwN({LR z3{<&9KKF1dtv<4Sq=7+p^TYb81ryU8nNopES8UXCDF6?__KFV*nf2(o2HYpkQxpGZ`M_)=#F4k1z zjXdA-VZTPwt?RqEB*KRH@%eQQ)~8gf$IfQGl5K020xW;$gOF4x@uYF9iaQR+{IhZn zM_odOyi);)6?l}z6xjT*UFZBxW104PQbF2;6J|YbjDVMs;g+M@x7Hwi3)@@cwO$|c zC87tB-9zsZ(Hq=U66NqQZku0mDEwE1le*9WUs1nH5gbtK=C&_JcIV zV0*>YDyLmepN=2p7zZ(^LA1SFCf8I^jRVEQS zdHna#F&a>e$WUjyNlu{Z!HnIRHNzq-ku9 z`^z^H2MKNG4Zb;+>6)*Qmp1x07 zhXI)y>?!lTonON_#UID>k~DQmo)OY?GkY_ldg8sZSSrLYjL6Cvt#TH|`_xp{H%U1( z+-q)^p3O6At%@OA>f)^GEk#;;=V{`9$wxx!GW+(@|8?`b9^?1A%(o?$XeE@#EyG0uQd8 ztNKP>rit(l4&}mYGj+&S;m_Of z!*{|w?z<;?S1#O<=c@kZ=v~lz;*tpW_x*7~dgDAa4z|BwHUbVm)*#I0oe-kun?bS=CXIr-jHYC zpnD)V^-HKah>6?Xx3qJDn;k9+Rzg-VRh4~k{n(J7Q+M1TlkpD2dWDphi9RyG;-DeT zqO_*sFCc$jZt4l&mFqatN`KmR`WT=GOJ8-G&qX-mgQ-(E7w?h=e!Ny+Fn)}rp`?ed z%c_%Jg4IX-ulak=3tGlxYHHUiZquC1HZ*dTm6dqxvz{v9gmAgOznu@x{fq7_5wX5n zb>Zm9w0i*?-ycxeCeD!N0zX_iL}yUnbKf#){-jtMFZyUOc7RyicArH)?w;?L8t!=ItTl}W7uQBBM`pRTEuJg6&($}2` z<;i-XZY=A>Cq1~Z@j&{aTZh%x*Kq=OD;cJ#I1#IBhVv}_B#M7t^bDXkdNuT~Q7YpP ztUSsb|A`|ZJhLPr+Jv}nb(mCeC62z`-sJlGH41Rm%?y1PQ(6|!{rI+}9ji-WFw8uZ zDJn0!OL90r_K>p*dq9&|7^1(p-9d6&r`DbFAtTb#eA|xo{M1E3Ulf(_pF6XD{&j;f zq`sy0)*Ls4%)M<*>%G!2s@f{ifac6bf!nrrLecKEZJ?d1>ZKpiqkA!)(!yT%1l8{Q zQumOusGhf#@k@x0Qs?YP`I0iZ*+GYC?_64Sb<*%r|2q09-q(l0W(PDW zrF42@x6T%RuU_dbbd+!#4m^#GbMx`)g~0TxkDF!Mez7wy`l#Ju1fIxPGaJFah+`|m z&K>XP=P^ouCP(9w6}v6UUTY52#%q!jipiJlY6WoTW)vi4^oh z?VH&t2spbosSBb#)Ms1%u95nqw+<}Orw(^hNItVRjCn1J@~UX|>Z%qz0C<895D(bav=ud@_6&tCeT1*?biD^S$Rqa`1iX z3|D=Obe7Hpo*3Ay5_^2qdNEMjSp9nuoN1s0eGr-=(%`&{zxs=Zt{*wJOedt zFGe)>@m7R);IEtT1!dAyNd;$FN7+`-wl!(DSkhk8Y#mFRX!w)O$B%X5bzJN4-$NwB zkc-hiF>m|Ep~JBi^pklk^bgN)9P`8BxuApnLth>L{p;NsvSyEBWxi#xzvDinVQHe_{$Z&U4<*C!7;F11sh)qR z#}37S`i#ZS*^yU{sXeHc@;oM-qQ93rmr|4F!-E)03!G629`PSRfF)Ht)jN+B$@jnizN9!h7%XyScE>J>wt`eyBXhxee zMntqKFqy@1296|4U2V+n1FjbH#pUGlfjEuZH*m6vYKQ&&v zZ4c!>%!s7R)}coYIL_E*2{(**maRXRMr4brX^X*K$v_`UYW9X2$L7+=98HUEO;2Q` zju<0uP#pF0NeO^8jSUdOeu}}YFkhc7WWu#M6eI;3T zaxpKD{dTqP(ZBJEw8qBiocL1;J#|R%Kcihs*luF=(qI2h?r@`Kxv-(Ilq)B;{2yJU zU01wZxU`4uSj|b0-o&2Oy_j%9=JcYC!+ME$utqvJu4WQA2;JB+fm9@dT5P~OZx>!b7wQ! zr(Y1eJu!RvTIZ_z*~lc^Mlhm8H&?WdYJr796r?s4$u(AG$@$DX)~fM66Xh!0gr2Tb zbiwAriNkQIMke*(50UjV+5N#smgHd#mtyBdzrL`HXt53Et!gg8k><7*Gp^!ZyXw)q zURfdM;5fCUSH-GG<9dJJGoNdvL?3f|ZYQhXwS~l+u|j~~ZQCV4Z_-2@Hh9)3Y$Nw5 z;(1rs%Q=~IA3mOJz!Ltu)d&8{N`^qxY~77AE&LHL8XKp4Vbe0>G7;`W%$V%XDD&CG zVfa{*2s~IHGi)eIGp#x{@-9kS3`VG6Zez@$!i-+?iWW4@{$mip>9!XS}HpHbsj zH_HmR9bd>I>>W^KxhLBH_eA)Kn7);-=?>6Vz{|*_ z;7p4zq+)I(1x?uR9ZNKF$6vgt7NvWu=L5UURyH()m%izT=cKrF3I^K{FPl?!%1K+5 z#9h2t)OM@(d#xx}f-WL6tQ92sf+ULt=gruCxE4SK$oNchuzvEy=)hiq(}A^& zN9h=vD61!4%+^8i1li(C>`zI<@c9I=kIK{LSncKt51`3^K6FRFjvNGp(1D( z4(<7m1?Ok@!N1JvzY@n5Xfw7OuWd2M3~UK%zv~;9(2!3~3d)QSJi}{`U@psQ-0m_L zl1(tfkg4_R(->s^rJCwZafr$K%ETkt)GFCje4SR7XleT>aO90eJ7@-hk+L4P;uBrm z;dIa*oe2!27ltzxh-OS(VdW)wpUHPUTJ1z0H7jsC^1NBTN>$Fw_3qS+mb}pBnbbz$O^tn$NXx5g<Gq;X0veL?zMr@6hvDDYTBh5()4noU0YD+4Kq zYV8l_X_5lWpNxH27VP`07xqP+Sdmpfv``E~UaycE>2KQS(T&~38gDA6u;+Y;B(2{R zjVnAp;!&FKzBU)r2Q};mfq}+4qvdOrm`DrHcQWh>T&cM5LIpC%o{YIa)kB8^f|%y% z%WMywf8+a)Wf$%}T&)xtUmh_c{1Knr)!1b-Kvuf58b>_cL93!L-P~Vdlqm7-Wy;7e zRzfyr;t%|(=heyYE{!P7E*?s~%n{?7-mt2j#l^bq5s|5WU`?M9Dji-bi?2xzic(*H z@;;f(;W8eZQSyEq&yC!ck>IMYl4wFPj&UJXC@IZ=eL449-358efPj6&2lI>|oN?2m zh_pv4+TH1;K*0C~XC2e(VY_D(Mdok#x6X}=!b$pr`k6Q*O{~n1`rgGr!OB=52DyWH zTou2t`)Q}sD+3-0C@64LB#_om*6WtbK5hHkM=bu0_2hhfNH{6=e!5hDnVW$i=Y3z+ z5cbyfs^Dewy~g>+&$w?rE&QUYpYzJmtNiB~SWNr8Ec)OpG^A$i`#*Yx23P$bzhPQc zSMmUzE}tN~565wAJ}QnAT|%K#(VFVH47y>RK!RGVX{dEn#R=5_UD&RPFxLb3TKhWz zQ6CgpAG1L(*Smo{WA_X--HocV9mQm)a3@lU|5EbIv+DEm(mVBVZTbh0LXvJ5{;4Ll z=EPr6NMmHMb2w-Ac9;*y;iMW{ITh@YII`@p3)xa&VCY?-)swrRzUb0mOBBWTys;Rp zaPo3bRIzb%MMuJBs0Xd-On^o77m=Fisye5P0F&J%RM}w>-okx$s$vs3Q{GbHovo8~ zGks&Ec{;tnpqrI?q+1dWT@D1f>J)*dyo6>2- zWD^yO5G5BWIyzWAHy7!A0;5%dTI5v=M18&u9kywwoUR;K6~O#Y#e?qzPT$ou5O3u^g1@WXTP5DuT4*Erwgavpfo7zM#X{+jFzQYRmX*I?D zU9>HSvW`3=y<ND#|0-(7>a0AUiRcxVH-vW>JlG=@>iu28B;J? zQziBD{&&$AM03vE>8xR#q|hic>##m%<<@KE9K%dNR>AJ$?V;bdO8^=BIot9eDc#6q zV6nCwNTgT{%r~f+VRto64{7#G>^t>eB%EqQ~ z#jbHDp09tgdT}A{)=?09xOZ!3x)@}Pk}W3g$a@)bq3&V&orim7!(#eLzICM1sVx1R zG#{1d(z7_4Q0vhx3GFAxT3)?j=w2}?MwN_tqJQP6cN+*3zkL^zKisoS@o5t8X&`wF z3Z=pDqL#&AS#|(*52J<>-}1qdWE7ljuwC|)@}&0|nRaQWiJc}?)$sB02g4Ax1V*l1 zh1g4S>KRtq%6f_4>__b?A&%W06aJ@7@#hSU<-aXT(z;ILg9!YZC>9@Zd*H>{d?p=X z`wIsVqa$vi*7q-#hC5G%oSEXJU@^ik;;))_XO4bKpaJSm%A8VPq$F0uHNM7KYq7v?p+6z_O(**@$y`?r2=>x+1ocw!XzYYs!8 zL5M$&6BZtrxiP<^q)iyVBO7DN9e7~LSYQyDK;Kw7y_~QbX)J9;s;-Du39)sHXb1jfqDyY}T`=hUJ zt|e}SWUdcBv&Z@q;VAU+X~h%0hy>w4nINq(Upl#PgY~h7_|MAc;(e0SBqW}dhNd3L z-QK+gUtPc%@>)(0F68opR^`*WC8=CZ-$2_BX68E4>MvWjH2%^>t_}ZH~uSY zm6vj$&}VN}XjQ`5FinycRElKp$t8U0TF{%a6`a?Z;mKv^P|w_rlvqGsXnN?d^z<=O zW=$=G*5H$YGqtjN&GtC+(q&|w%}8hCcs$MnK8#fzH_6ezToa7eyAlRQg;{~=#or;rwAD2fwF8{9(b& zT-o$@4L$kE1EyTjwQ|gn!AGv%r6W8}Qcr|TP*O+t?HS15mrx+qfUN^1UBWPB{iNvl z_Z|aHvb=f2RaW@w*Xd?%8u!9-wbbh+t+>X;@!na_M$K$7e#-(Ofq0o(1zLxeXWf4@ zVrfTp0c5R=vxO^zo7Rv;->IowDSw==+V=NLz9F3b8vQwm4ot~QdMbGqC1q_QX^%@k zILb#o8)X#jl7dpE#ZCURcmPiQH}5;=r$w2O$Z;^0 zkg zh!c|48N@8na(fJjH*K3=7#GD)-@7u87~$T(Z^Dty!&N&vyomCUR$9R@q?Z`kT8y$N zEP48(aY(YwQrxag>pS9X*Qk7LPUif=nV1}9Tp&`WcI1?^OYRrlzwg@Xssc7}jxv}C zMDutJPXxj#yJ&6^?(p)ZbgVzukNAn1ULkk|%|4iqRqzEy4)^}Fzl+mFN_Vd>*;+DJ za1}k4saM0FUM}~27CTowqxCup^f2K-MW>osxwPE7yb33e{u%JF3lsme`+-1%uJ{Za zNXo9SA_qF^qO{(*R5aG8Th?*HK&!V8Ih9m%M7XhjVsZI1b=qAnYGKx0Ly2gRJZk5j zLpRxVli8b)6h;8&B@Y*70t1pS31jhlCxcm*132{4nSy)6?uTjq#7Rmu?Q}^#$B9CR zJ1{uJ%({AG-mCLK@;*xl4_%^KLbS&0veMg5kk%FvQj|W42Ir03UO0-W=IGC0yj8Am ztRLL2ToN+g8ed_x+`%*p$zYR3X6VOLc_B;mCOB(esG<9*ESBI4;=^mt%+iwan)l9h z)Oq(;hJ4`>i*@*FLArLt54|qIF+oJS6djFT`-h&t;*moV@>;}Gv%2%YiVuRSgzf$m zK13;3lTBQjS-Tz3Y`ESUM7$mHn{8GPsg)yj7^it1KjQtUI?+Yuba_GgD&@UQwxEKH znI2LnkBT4br&9l1zL>%ShS>3Vf><6;ZoOdlDOAOJn|~{E?NDqp$|ohA9>LW52->o$ zcZqE@22VTWv+Zos|FAh`bFa-@_(iJ~a#@QlD7}Si#1KaKmEGN0y3?O@@~zN`cTOqk zY-?YP_JK$pKhCcIsbk%ju=~3Jf8A`qLrKEAj`S$u@yZ;ku)%C=&8Gm27yoi6K{2< z`^Fyum0S-25nXY(aJC#l6T>U`+t93%U^aRw-ZWq^Z)t2}9^vaq9m1OYZ|9}>CN)uL zvM$R}2StwOp%wm_?4Lb8+tXKTL+oQUJ_&ub{E)1L*F9Y(DBAXX}Gop z%g=u!-29Qr5qFXkD$VBbR|(>f&a>+%cxDNH z=#bYNkdUZ?2JbRP#$2{cdTI=G1t*i5-jFf>kBc;OCnXk4^mdoys4!^?uze$ zzDj(Sy=-QLcDF6))je0g_Tkhb3+fsp1=O~SSUaKNKl>lc-Ao~Gjnz|A&(v1?TUvidPEAtRpCp_ zF3WkAKZTc{CsWMsSA`g7feVL1O4QgX@GDZr+TRTbVbP!$No<2^=p+&~b>>Mf?A})4 zo}a}ck%whvSYwUvi@MLEYQE+fK4hZM4Q0v`gNbD0_aAv;qZA53HWHK%W)s^YR3hPK z2R)W<70P?o$NtyvD>8-RxyE6zZ^@caB|0T(M7_74{q<8M~a@45ul%n@oe7s5^+uho5_Sh_gKLvKVGp; z)G*dzx32i3CP3(i9>c)b!i77Y?oKV^iSwDkW)5%21)q?7!hq)Bd@ka_{=4|Pp94z| zvXi;BOiur5dBI);zKbHwhW|~$+FokYL6mNOdSz~iyMZPyq`=f|EBx<=^|5*D8x}_; z=9Dw^@xm1^r=&+^-Q%3+Pg*X~e@t*h zFhcx^R)WT~jB`<>XBHF-82%aA3(6wD`|mrCl7mS>Z$-p2>V^||IMfD0UvF<2D!$U`^?r3f7C&xMD#IG1wr*k-{1hkePGjUvAwFzn?${K!9H5^0rd!JW zV`8qL0?CdJd@_lMffB-XQSv#5kITW6>xtqf@<0F@ymJ>bZ;oxMuJ^ltJkG7Tof2Vy zdSEHQ(bU-S?4`no8*+wbJcn%m+L|B9`E>3f;hdoXPN{^wwOQeWj0!=E4zD&jWbvQ> zHH`S5r$c;6+M1iCSdq!j@_QAJQkjS_sUec7iL8rvK_`dmez_iTP7w}E9$HoSCuTX< zF)H4c82^teTSgiBO{{ktROkN+X;%vxJ&6+#gBpKgGYyLbB_9b@5=Y3|?cp=poZiJ^ zWkXJ};Yok5Z`G;-KFPQP{)QXq=wj?U_#iVi;{^g(FtCS0CISOk$mw6W`X@U0N4{xQ84HEos8Q0`j~u8m zlW-irZ-%HP{`dM4w9}&wJhtjU*o@iTt4^`Us)RcQ(FhZ#=#2ZPJ1><~d!Z^6;;w_7 zYSORA^YwH@{|pBx!|7-hUSE+21vy0^BTo1aFNNX4?e#+6EMQeOyy*NYzNSJH-}?#s z72)0Ad<4msGM;tH3;&u0aKhdmUNcj)H-x?oi8$r zsn5|q{(r{`swqy{)r}b&bRy;v_OGxf^0|3A{vSza8Bo>MZeb3hQqn3d-HoJ#(w&lm zO1DTiDAL^>(jXxzNP~0=2qN9xjUe22fA{YRg}v9BbG~CdW6YQ3LY%*M|9}&27ROP$ z7{R88Ohcr=LuKUW$ogrbVMsoH*4zhg|Bqd~+uc}` zn=AVMM!TvZclPd{@gQ7GAG@t52QJFC$3BgXL)ejE_$u~nE!Hl5>`@C_wLlCV(s)Gr z5)#T@1YsRmT7)+=GrPnF<%D`YrQ6q4QMH~xg}$_fxuU^Y1#sD^s^iRXC21y z6k8<$2FZ}(OY>c?8ivrYnI9&}*M;xjL+VhrK>+VR9?nnFH~(lm26s@vl`ylluKc6y z&=iZ%b3nic6XNWm44GmbEPMPeJb@ntX=f_2L5pd)2TPuj=^eYfpA@4X9+XS{$JwrI z5GOP2JK45y$df}$Ax5A^tz}{xx1`BF7@zRI=^32R0G6aNnBSI@m^;yCQ{q=AIT|&D zPwE-Gf~x(3*m2j4^6hJ9aPS9oLX;rmjyTX7JY19f5tJF|VMYHz|B74xY zVp=)!P>npC=JE5H)J(XQk|l^1h^RA;LD1k~z_>eBkl+NeTSwtWA(ATtzbjDU|DhV8 zo#F~BsE-k`$3Zpt^bdl^sdwQ_W9ppvtQUo#(e%%>evPBurc{}Wi)UiZEN_XDX zGfpVTbVu4~VFOm|rs&=whQTuq9-}U7>j(W>2R|(GTW?~oydFY=$iwhp(K%QvQ4kcy z9ulgG_kgv{=w;65ubV4}iARS#rkt9Bvp=X{N(uCFV^q(?wWwWD78S2>sj4KwyNIob zl47Jq{)(7MTQp1^qTHx5KmLojqlxs~%(zWQ7UyKAl8mtHgQ^;!d z37(yt_0tzLivf{lW5KeXS7h{1HHbm#Z`Xc!O7G9lNkwv0>DeKJw?s1r|h$$8!1kh=QL z!)f&mZFhUIK2WbrN@Go$60@G+8pU$N#7OW20(uK7hVt(~p)tbufGb2hFeHi8A06nE z|5KT#L68j?vU^%v<7M>g#Cc>Ugw*4Nb$ya7Y4Pes~ zvT!ju8guZ*zzGq0;hSV(Q!%55-WqxaK9JFbAl!) zBs#weun^C(L1EV939X%+Bc57P(A0zI*tba*pF_5pd+@HeYe11y@A&b7MOH{A!yQMq z{TCh1I~VoP>E_ZA7eB6S+ikEL>*^ENb)T^xEsGN+Kl@$z*8Nu%TYnxJkkA*4hmYWI z%Zr;l$&)r#W}#G209UH6QS0s7Z9-lC(9OZE{{ran@W*r+ylI*K6GoF$d$<@?z&tXL zP@fWp3nx>Q;9p~tM9F%y{RrcBJDr8(ALedFTPyC&e|#^`SYt&ZXn{BTSBgi^Obr~# zr-VmGy=r~Su*}RgYOG2kFij4Fk*5okHn@dMbR%6+8+R!ZM+0 zpH^Nrj3|$hlVIvUnAUnPewRJUZ0!jn&*!u=^A&5&5GwZT&A%T&sW^5^HSB9C2y%ZJ zl}p&Kgpn~*C>jlL|h9I_VQj~iu+ua@T7RvE4b2vc$_C+dhH-!nuuB%4lJ zruQF^&RWTgJ&Q-}yS+;~{psl)X+>-G^GqKj0$J+^TzYfN z@2gVja_+7W7z8)!k~x4Um$QrKVRVc}>fq@Gw^$70N&KYnE!nHmF7Me8Sqc`o_`Ptv z;Ljy2UtqSa-7Ll`8>7dh4F*-&mk~-vyeDK>FaM)3q>I;i-*A6$}*^!?)*&rER43i=GInDT@N8hlOjG0)5LD(3p_A-i$(ntWP| z|26sX@wl*NF;#-5SjW)>ml!X)@i3P4{R0pgIC+ z2{c3HGp@~P!JLi-8NW@2jtal5djwBvQkr9`Vv^gUVeYtYBxtPMPw}VP?++ycN2P%CE>T4O_7Y-ko!MmTQ<6 zEkKzBio^>FodcPAYdqMG5S|>@m&dV{iswc%{CQ;G_+l; zD31kF^V%gO=smVZ2p9fa0?adrsWNpSy1Pt{hn3Pt{+=u8kDsdF=XwvjYlsm5+5J~0 zDbz-$b6I^spu04YUry|(~jNOrgVW<`ALt6@`Dq zT(6ZfwKVZ|!{IH(C@TOp7QdMVV=T?EFDvdWX;`O(fE6|#FhjxK1mewoA}j7l)~Zd| zzjs-WxnLGgr}@W11n$;d(YOkvw1!*Bums1zN+}K!?D5L%pMcM>Jhn+dr($kSb7o8u zVPs7^M5}a{(X34#763zEK!XULr4*~(>yi(8`=)Sa##JJay;^!sBuNvJhzCkbktr!A zh^PVZAM@*z9QMAm%XjDRIf!9f9pdQh839_sQipHTRFeN@QD`;fPMV6^pWsnh4Z|&g zK+rmd4mSS~FH$n#J$VREIFdSVQJa*gxS1hGX02@RyeB43C!UcOVh;Cd<{Gvw8+3sC zp>0F8bu=P4@E;e$;Sj;H&5O=~Vjeqw7tPM{_?gq)6YAuTId(Pi>*v3>uicuuAiZ$b zk;JJ_-yD(^z_P{~k}og3J;W=b5y4m>?CqH?2_AGWKLT~<6BG!Dprd-)@`71A!O-6H zIqkBVoLiy&N$Ddh(Kri5N6?!N7d4Z2vwEJwbvcsQKUad%C|5k_nT_DBbNI$;ID@nD2H}i4}Oy7spO(6hRaw`3J8CWJ4))GPAhwWuoxjj z(b=d-NsIoUMntrU9qXujYw%H0r*CJK15ibtk^LTb=VnU|CfpJ3&&Se1e&k3Oqj!7{qb(Zrh( zvKs27l3)mD6EOJfr%cS^+CAQ@&x%Lh(LzEB6OP|~5i(oRi>7=jWx)P^{e>66U_SLi z!!3F`Z>^G)l&0FbN=2#!=U!DeW9~ z!yf$oCPmoK;D?6YYFcD&SC!~dD8dl<;Qo=^6k5MCutaB1nJo6LGD&j?A*kRFH`_E; zx5A@uSCdX1wvsGAUoq;pUsjDc1<&hSz}zRA=twAu_oIk;>Rq%8FB6E3eQ;82E*;jJ z&u6^|Bd6i}=NE=cK}*`AJoX8O+N7i2jdl|oHU#mu@^28`N}m&ZZ@N8s2*YIQisj}D z6>sEtUr^>(UN`To$Sm(G7JrL^C24wHmKB?+gpXNL1d5TcMrSy{LuK!t)N^K7k<+C- z^dEya(!Pf4dT4elh6x?HBmF&+;Fw%vchK(mTVBBckMPvwxX6o4^|+)yFkzHE*TpW% z?+o75wrDTf3K|bF|2n_1Voo>QvCM$tYb@jf2j1gZmV#nxbkpZUsM>7W2+z1u3j*2q zeK2vD;E;6z#)0}ND8a6D==tnNcvu(fEl-xT4VQ{1o8{89tq3h8c$V!UY4?vc^HHEU z*I$PB6c|YKQNR_pMSSDQ_C2Xls#0YMGY2&3`Zyk9_%;y$=c&@<$WUpXy>#kOR@yt% z0wvYES(#_qdv9O{oA&Rww!9`G2(KL!r1HRqI7UoT*UJI}o_fbjQ<}35qfS~0)Dne; z3KQ!{SEuYBd)F8%Y4+Bo6@>%UL_of?OS+B5Sz@-Gxyc0rNSOq1J>XCw0y2pO&I0;m zURHA*C#T%*t$ePm5EE)8f@VP~(49VFA=K zG!d9qigx=6tOeTTmsBDD1$!iKC$R%_(v#yjNBLo!QoK^D`nrd^o*GdlLzkwKOX5C+j&WGLdo6A z4(q`|BJ6-)UML^$=pZS)I#2!gbeE>EGp>0mm{%@{0Txn(M_K!u81UVt74~l9(+}&9 z|6ZRalR@!pucgUThl2(Z^~=<9G1g=3#7BT>qJu|EEuGmrlkfc>94FxT!p`a_!1sF{ zm{G$ycxq*=MiTE$&Zwf*dG2ec0&ba-LqHN7Jpd84AqGhos-y`{=n9Ds>kmHi1I!Ts zpArK4-0J%z3W7C*!a=SCnU=(q)>r7S?ik#2wENoXIk8sM^P>>L2ikv1wohm0vV~} z@B1R1=UP-d&$EO%@lp>yU6y!0lWjww=t`NQjXZ~9PO{S!|wqwm0`6jWTYjj(ZRSnp2voWfkj5tf?N^H<2!6U zWM{ZhH8FUwC*?o?I&~TRi`0LPV()PIzLxm`2RqDu;$~OTeeB?+SxmiV&kIybsh1bF zhhi`T1Fnwn=afTOdO;0wkKmXhQaoLvka6W^R(o;H-ST-dD3)QaNOi=UW>wg-Bl2g# zn+`dQ^^S_-(bSEd2zAgK-F&Lr)!|!VhY@jMI| zfkrhGC-RXQ;Sm2{+W=L?Yep1o|46nQg~T50Hy90f>+%1!vLA7_%N~JW{391s zkn0g)(0)?Js-n+?f7r)r;!5pu|IS)mE@$kWiBlQ7w_mfL^dTmz+2NnHJis~~(SBZs~jm!NxD@K2GdBkaftV2-j z_mqwC&VZXgzmro46g~YXdW;v$Ws~~-vNv-?Xo^?q{~Md}?arExzzY=ipm@3pY|Y~o zfF2zh>*H4Q{K@+}(N^P>r*J|-OUR?-WRkk^Bc8J^AG9SE5vAyW+ZevBFvY4=(Awq>8~9P?Np1#V~WW1pmjfwm2@4Nt@FUTwNU7$B$LlQY;r5^ zo1l;s-ag12vWcDuEbMDb*Yr-NpFa63G<5e_1nu?n?8jS}WZ_`H`sfxP0_XH3eP$Ux zG&ol=5oukZ(XdXylOr{>2GEs{?pMe`J2bZFAX2<5Mc6&sTQ|R*JffCz(y40iTRg(+ z?hhkB7&T19u9f^eabZ=conb5y{P9m5ri1o559=Z|PYl+^tjlMb;F@h$lL5~m_;W-K z$g-tB-g$)t15K*qe`VG702tGk24-G4`bT%{O|FzqKfJkFqWV3p13YHF#4m0vgshJU zZv9SxiE(fJ9;Scr=3wUU;_JUhh;Z|JNQ%d-Xfsz5QVPuy9{gLjX|5ez+x*MHsE{4F zXHHMs;x*2#K`5`F7Y`%kzI6henA+%{-G!4Mm}}9igsVuRKB_EAXLvJOA%qfmkonxH ztYMUtwsT^KU`4Ob-+bgo6`a$#X4aW4 z*b=#ArtIRY`&~2zum9hBZi(8QPa$kjx8az$l*u-H+@%}7)k%Jdt+UbOn^s5tfS@H zv_IydCFWTcVR8UWF7`J$?r9^*2o{HHmh3Wx!yi(7q-w^hgN-IO#4`SS`GXI+k83ubSW`8scH!VLS%NrxBs5L;r^oC5?T-Lkn#rz?mF#pE(U}%>q^%JHlOY{UX zoM;Yfm3I%oQd`@rx(pmSS$VVA;#1j?T5D;2Hs)8sfx-1FO1%cx=js=)kB74~p?6aD z`1dz_x60HZwCxvja<5{VoA1oUe&FZy5rlIkHXkwU@?gvCAJ_P*Y+m%SU>k}WZhf62 zP1Wwz-il4964kLenvKVTgJkqol&cstQn0g~6|Mn3*p0|Wx$rSrpK#Z;eLCGd7Ym-4 z#G$T#9bmS8uTX73tZfN&6o}``3vyna|0Q3X7LPIfLKInGDGm^^s%%4H=9pb9j^zi- zsjLhK!aBhh)sgkK$`n|h|KUjB0bhB}+n;82Qe;NDVl0fCMuJAKB2nf}5j%1R&L-F6 zoBG~v?uqf)l5$O2kJk7wvumTbDGW|2jsf5GU zsiXFD{bl>AR(KF#xiAQbKhiD@N?MqZNYW--d~5h6L=ZfhDf>Y6cw8Ooy8YiNx-!Ds zl`qS|mR)k~YkL+fBt{CSqqi&OdX{Stc{Q8z3YNJ4_5QCas*I=UQ7T}@MrNkXEGsyj zd{3zJHas{UlJWp*@U49tuIiXw;?X zf?aRMk?ek#!TF49E(%mypk}3?NqT#fwxw?Kz(lS-{HJ|=(Lss&H3PS!#=VGubH9P2 zg2REqXfZ28REI)?kcd14cZ_d>TgRoi`HE@sS8UIct|rPjbb%PU#I?I4MgOp~X9uPk z?Bf&s(^mbjo6nXTQ^+h6h1KU;2gm3C!NSp^$*+25a>oz;oatZ`WQpSU4LiC^5< zJFyI`|90(s{OF0n7kH1n_}MupcGcQTMmG~c!7mV&xlCgSeNIdt<>pq@kI0N}b{#nI z-SShiBhulbB06h;MSZ(ZwW=f+^ogDI>_Qo0b2<2|aBK-UGPb#K5wE`57m8BHCx(aX z*UpW|wKv=-3wH*9J9y;tMsFp&M$kyhB=4yKr)^H($okC=%bP4SD}L-c)|)~cNxTN} zSkU}HX$Q9uF;cR#qBqOy;-5E{Nx(o++Yb@s1iMQJQGuEedmo35rpuhJ)?MdY03*b5 ztz$x5-@R*v_}RO2uJ)ECyEoO;Lho~H5Unx5KR}u(%PaaYnFc+ekx^ktfi*=ckaUq` zNreE(yZxkPqOXcm^lhFwnmPpMDZ zj!FjE7gzvhdHtLIk7BM=^^HtO&|$9%Vwb;Ly__!sQacwJ(MR+Z4hV z9Jv40ks(C{c#4)5k#2aV1o4+&J$%mD&To~I2~8A;86yohiW4~^z6&JRvfRdG#XVds zEQDu_&$SKf$I63SjCe`BZ0_W7NLD3QKl#m>G{O=Z2I~HVLXK65}>>JafS_eA*p2CDr{|rlC-iPWLtMrAZOb1M+ zpsif)$p!lRp2k}b)1s-l%Lpv1$y{#8$>5NM*z9C2sOWtsd@t?~Fdp+D>2!a7A-Pj@ zhUT!~_0li47!)`0@{?ude;(6XI{PMH1OZ_an8ITQ|FCNNVQ_$Wh`tWOFT< z6?;HIfFn=+u$9b-jVh|!)l1|Hr$v9N7Y; z*m$(OIEZBMO_Jr8H$D@;0)Fpvb!kW zM)1HOQG|iB`h9N5p(@n`awDTZbO>x2|MbKSqt&5N2k#n$h?f3Fq#S;q9r1tE-hl9} zdd+{gH<0mlZR}JV@m}KdkwMk{$b#xqfx3UULi?O09pMlXD)p-KaW z@Rnv8QW7{t8zK}N0PFzZQBiO^_jD*zYZ5RuorLqFe>yI6{VYU3FxuWE|^fSv<*KnT=t2FBhr4ev09#LCQ< z;@#StWP}bPdr8wrPIWh6~4IgYLJl z9S916@yYx72ILR|!FZte=l&EPKoJwvA60S7;dZMGBJ>Ev+eja(bm9NCijT`Y(qCZo zW!e~aUW+@q!-uv-Zhi)u1_DUjsCLEl_y9ocwAOxFLI zhZpXfH)y>53K3%hbv78&U2XCPD@I*;nbIRxhxQ+RAMMML;k;c;W+m2H&-nc_KFD_w z_8-E&X#AhGZCQ*+&(mImlZOF$Nb*pDrZ4x;|G879#(b}PwGf`_G&jvMR)N_rBc??K zko3Ih#2S2hLK>+t`Df=+7aF+TR6q(7jQm%(Z6xrq{ZuL8_}N{sZ0x@AcBq{1ub+u0 zN8~wx`4pbY10^kofEZ+y;!APm#r1#xE+Q(YMx?ImI{&nb;ZZVnX>f1r2)4ETD?*IK zACTa@7a`R>S|Q{QswY%;(Qr#=kEtEPe9_JJ*{TQ7xJrS95luAf-6j*z^RLFl+^|C_ycyWb%7T3+!W`_A-Poht-0%miow0a z|4EMhkipWsayk7o&rhm6roS-_!u$~wPNgY?N$=ekjr&8AdcD_0+R`!y-;)^~!~fH( z-gfSZiH{mqVu&_hh@oU!T~I%=N(TwIB#woNDC?ot`N#%!M5pO4eSji_oh~yUC%D>H z4S)hQIUZ!#vn5g-kK4jOyE2}Kbu4hzEZV)vXku$UN}3w1e6xI$i+xB;mGKe!6)K7= z__#pyMCAP)9PSv9(sU+$p%}e^=?oYP-MPhmQ5{3b24Spx75eIY#~-SmpdAJx6uw_j zd0GK6;C8sf_B7Oy^`FWClA+&H&)G{%o+WL&b}`D4X8Id6Bjr4+O+>JCt{)-b!#DQr z9%EOA6rt?Z7o4QZn--6fL92fK1PtCvQvA-KJw4{(uk7rI&k_m)0HJsbb9~WTRk=%- zCM5|u490vSR1L6n5G7M=q<33(9wo9s1VJ6u!RHcEiTx*6*tY@6H%XHjnf$lm) z@rGIz2Zk3!5<$ti6n*`Ay@8o*OXs|K?V&OijjW>x)ZM^bYFC>6<8a*L(Hwt5xz}Pw z(uBBNzOoedxg;(@ms&dupPNrH+}EPJa(mv3w{IQfcH5yI{82A^=Hh(V`WWzISg~Zc z&qe>;fw(1{>=BVrOXke#dhD|$?(kxO<{EN97a!vo~`TU_`5fU zqf{V1B^1O=+yNC3KK0H9bVTJesnsm0mady~V3C)`hL9}3<6R`0o3pF|07%Aaa8vNS zOh+>7m=e#>um8bdI$!d$!jG(|ND69*77+D3(@@XzXlFS5zIP0z>{3?act6|)3C$y< zN(VaYe0)*(7$$es@kLNAgrCPROIx}L{nG^1&7KF2iU31h)}}r{=YL>tf73{hXHx9xLUJnbQ{wO1PhCWk31e zH?qVf5`M0ZVleniOfH{qx{#)$rw1*Ly$0ve(1(!nCuNc5#`=ytc$&ZP;0RnPOrY9* z{|TM}O~%)=j$A9EFdJzv9y~k(A<1pO^vS6TX48BW1w9{>Cb-w67db*@dRSI6ajgp4+Q~RNvS@{{AOfY?{ zvBv@fNRB?+F<^Xvr_3`R#^&HYSE+lAB*L#aW_>)olw6hWqX!UIMAcqG-_dn}Ln@@p zlcw6Jvt(jiIcyz|5V}@rEWXA2Ox@?%xfnm?rWQHz5b@&t;E$e*0e@|9e}p|0KJxS2 z1*j7SrR#q9$`?neY;9lu*($ITzblFNCA`yj5YX?N+I8NGZEm2n!#RF!$j=v(70zs# zUd*1}TXzXPVOh4jEhHBJInj388jA}${bZu#t*bQz#1iiIH^fZVXmYdRawQZPUTr11 zC>REN_L+&8Ipp)E)wr6VeUr9;mnwzY;Z2(5le;L4>I_`Gf0L6h<7hroVVDWgUgj}z z3JAXif9nfZeujg}LsgWzj||A!-74kz|0|}0j&tc+x%}^z*aNGdphWqmJ zo^={sN?634c=g1p{q;inPb&4QO#{(KvR+P-heXwed*5S^5m2$7k@geULHaP+$Q7K` zQIUO0w4_BS50Gl8qTSZ}JIQiW%OETvhV0j`w_;_3RPH~Bq0yavoazQXD!>^{w*F+@ zcuIvolY_orw5pE8s0U|-6#ludkJ8a=>rKOL&ogmFBr?Nz*rl5e3IJr=KylPCb&2ab zLV2dEkxzUk@;?Dkw6+t3E|xVL$J64bZfFL8rn&vHVW=QU4fn$$G0gSTwt&CmLlz?I zb4N`#h~*PY=*lT~H!pjRKM_^HXpB+Z%r#XqHW^viVoE5?*XT&y+_F|2cji>89?rzCGfmQxwHLCD`^} z>ufxM!>M(ipY_-S8= z64!bNXDhP(rTKTUQcChp2HgD^>(|9#WKyJV~8m zKAWe{)A%7in3&==6)W+ea@Z##61pDCYp=d_wN7m42#SjQF{F(~|6;GeNxKtYRUec% zluV`Z-Yf|(OD$9Pg7wXeIB=$#A^2)3p;Vo}DiJCkJU)NFowXVU!&ujQapcS{Ze?9Q zF$CGR<-AUEkR2dyZ?R&16cAY^168pQ~2T+oC~kDFWSNPcv)z4( z!1aW|o11hB8A&4b3bX*|NrXjwX|XO8HDUY?NSxIFk;xaNIDu&wJ?hKuIm?jn9=XB* zj)NuVm4J#4KZUS**N)448AVKmSNz9PgR4H_bf{|sY%Sx>#`3-PA6{>*s{EbgGRAgNSna}S75w+~$z|zy8j+rX6O<4cn3@h~}ZSNWW zr)Jito39ILFdYu}2^i^YP*!4B>bb`$=Y=O0{V&0EZdd435hqCg%2yw3uwwzd0<66G z`{vTjLzvm9GjKASo%lXJT>gynvZ3l3SjoL4A|WifzQyCX{&B-&u*Tss@k$gT{X!Lj%egxpxXprCPXFQ1I^1B_ z%0uH_L39=1OoK}2_V$*de0*>XJLmL7JNt~#63x>Mcl!SQGCo&GkDhfbKuHqtn#J)W z%Qus6LMUQP3v8yf_T3J`B#!^pngJR$jY*n5-Gm7X!m}R)yA_k4rOUcHv^I3_3BNKP zeq;Se#tO1)9ch~Ty@ZlWN*8Jb^1d^Vnc&X*^t2lrpFXK;UOm4aZU2>7E#8hA+&TE?X43; z9=b45Q!f@wvD2<>xhAbnc+Zep7fU#}q zBm%=IV(XCo6k3!agNNObNr_4ei=Jmp-4fZ$^A_7sLc#`Ot@9)9;Ef)QyX>D`&1j(f zDM?rP;$N}Yu(x+XlC>DR9gV>yIs}iVa|o!l@GCiG!|>s=Py2!eds~Ij>QCqY_5u!m zYE=lu!@COmR!zhLDpYaWe-m7CbyE=DR#EbReS_Zi?=NmP_%;Kl5uqwfJeL96qhB%# ze79&&SF~(aa0c=!kRFDgjfh~ISaJEiUiWKY%%z&0W=}D%Ac3BxH%HkC36n=o3Q78; z#WqCz4Uz(@%=|n{)yr~M=Xb4~Jl6_Homy@b9g1bgBj0)+T$mR~%#T1khhLuvGPY;` zuAiV3*{+zMuy9g0k^~T|a>Od~b5a-O>O*se-JP~RTiVhq1S5aaQL9&AvhXpB}P+6Wq`O1$1az4tgp5-2b^3<1qb=+#hHe5Ndsw-xB?HC^GjqbxhirTbiXJBHgg z`C|-KCqoC+k`(zvg_L(M9!>M}sEdxxH`OPzEBk3GN`|7eso zFsUbw84*_lmq;?nGAN-sP(wh<`-5|bI(}+u6AL(&Db%qC<^`8(9jN589@Ymprfyx! z7u#bEP-KI_O_Z|<*QE?C($l|s$(^4O9QxR@KJ~JPZH(Ufl>m53gDRtQfE9D$JL-&ntJ;HdYs?9)4Hfl zb%LPxiOoOeY5r8X4ts-kcCZ9t2y}HWQy#)eSEqkDNtk>2d;0;X)=D0Rp0vvuNx4X< z1lJ3%`DD?eaJPp>ly6d(3z41=aL_mRtu_hW+B;?BW%F1mdXI07J}~A5b<(l83&x}B zu6CL=K+Kf2&f&=x8Pk}I3^FpP`jbNFxW9!Y^C9043J$yFjY5iszx^&K3P~Zw!}qo8 zj`c}7BH?eJf)~N+EBjcG->HX|(VTC@CvzM41|VtX&!I z)gzt{T(iWw@%+>l&CPyRIKu2v5%qYEq@L*)FQcMyBl{ZbP2B{-t25Fv@_?urg>jy` z1LKG=p*{F0@tPmAa-M7`1lWF}h#~TTxYy6B2cYO9R-ihKC4c`pg*@ovW5^c*{S>ka z>%jOU`oC<~L0*jbx*+X>?u;W@PuCsC%?73Y*DD?5qWU&R12Z4&r^KTT>EN1Rz8|o` zUi<)|c>4QS(k!z1csC9u0uejU^$yWf6n=NA7J&%#4=8rfpBhs8Zrs)M-E+=Whc8@G zT6^r%p|WA`J(G7;L*Ot14&@LOp)({D8tY}GKRJN@kzZWz49zQBaJ%3NKr@hZHY_Eg zG125jtx&*Pj7aPhI`v!a@S0 zsQ&aq%_@8^_~`k8UpijK>YT_~w0q7$sWP;#v>y>T2Qqe*agdDCaGs|R3jn~iu2$8f z`%E5(jMe0gA46~VBysK^BDjd7pa+yyDEWdPP!X0boq=g6Z#u9xYK3SkXhP7qW0LT6 zQu*ZKH3dI%J)Ww}B}|+L%dsBUo;AGyELD@EGukm!{ZT$%Dmq|LvPlO}piKUeX^$)0Dm|ww!4PgS#RrO*1O!>J`*++a@CRLehyTFh@ zI1+vXsxVqL%bu|ZizM$Wg{b0j49>VEP|D$1s+<_4E4Y=wr3{|fwjVL9FgN(Jxa{44 zy)Q_i8=3m)Dae2zaB@02MGO(oliIP2WDo-H2{&`X?0>mw8N0rI1(B>hjcCd1eV`X% zfCkyoFa3qP6a$Mio36d<%lITjEcf-+QJ3xmdRKn;vrj=5obTPfK6fy-|DL>lzk3?q z*-$XBo>pQ(P9;=!=5qH%%Bv>KR9Q+6Int|2sa7?+_Wn>|M9;Z`+eWW0kpy(?^nwX^ zb9jUd$=#E5+l&=Lhs+;ii(G!53;aw-dtzzEHa?Z=fTVCI)_`;h57jWHZ$4bxnN@rU zrZ3c?fyapcgg!#E9G~vNHx)XX(+sdkmdW_ol<9Bypf@c>5P7 zo|46?iC)7(+r82osDWURv!#wheT7)ym2#pV?vl$LqtcyBeaYO&6 z?eR+^sCJ3w@wC**`b*TnWTYkU+m`S576Rc}aV61sODiqUxZs`xft$-Mp?#Z#O`X4Y z_CE(>v0Sy3)<@dCMDj%Ujyb;pdi;CZ4?RE#yNypg27R)%QP%XVOrW>KAFMh|YXdVK zh3^0#t;1;tGGz)*w+**1mJAj!h(?Aucv8oE)fC|11vglf2vORiFpRc&Z8fTxf+-n0 zO9fSI0Yf7@w=XC|{J$(gp7JN8{)q9FSD*EhffQI-PssXEA+o@#y^A-@*giPxCjnm6 z1fnt%u}tq8qy!gx3$F?Keix~!5(%?!=SUzFApU(#sxMz4z-z9ka8HSw6W^X8=_YLO z37t>|A!VmJo(R^=BDM|YD5BsQA?of)CC?gc{a459?c5YhbtsIzCwFr2zhB;tMY{l& zNj1JLmPag=Qay)Dgr{s*Z*c2zX?0eqc3Faqx$1`xkCHOW_71Q0GA*allV^8a{DOs# zcD;2uoMHntWq0&4EifT|Inp8qSJ;I>0U|#!;N&2RLv-S=itdnzLWd0h$DfzyHU_V& z=H!oS&0P5P$>1or@kJ$$<&pK0wl(k3IzjreTOgq8h}}MY!x4Y&Z{mw+YJ2zAicu6< z-?d5T{LPF{B}1O+J?0?dZ$Gqmp(z88s~QBFk&n?5OAEg$xA%$(=;j{qO$h+Ov+VO) zZ{=DkxGc}7_<(X`G4irnKZ@dUf0f}1>O5v3?}LN>1^U##ts^j&5)0tUQO&A;q3k!D z;CcTP97gLmPyl^gHBNVXIYUR!lwEq6%R>L{>jAKeVEZoUKI40aYjW~otcLS;yNU#+ z?8m)EkynEvG}_I5Q1E`cy$q>yjT|$gz$4=e1_(@e7eZ{2_lgKSdDpC<*&*WpQeqfH z@V3{6nFSvTNU0l2MaWqh1{E%R#c_Kj=Z2_fyFHvDhOI)4Ls%C-wxU>gw7T)1A7S*S z!4*?O4gt(K&Y#sdyzJ|PE;B0kM4N~rg~Gumy8YeFeEqMJmTgF(s(H5NyRTC5l*a?F5ByNYWi6DkRNuKDHI=_wFs1icHwejk`xk~eqwnU?JifN) z;b)xLGKMZmOHjTANm3}bvy43*_ z3m>*r_UAakDlwv8fA%;n%u5(G!_zgKv;` zo*PtUKDya9I*ypoih$t+{#CG^9oE_aYeW{n9oB1?|HAK)sN=2RlB0oy%fksji$4VP zd3YgEGdy^%GZ3mmvg)9aK_hFu2Hm3>sZW4WR$vKgSulGXI`l#cQ8 z8TVzxNVU5%%8727^2NaQCw++Y#+M;xa>K;cp-GCC)tC)V*bu=-*|6+@76-VM0|>l? zkVjCj68!d`GVUGty8zV)e~}XG(ycrGQXI-qhw0`}?>ilzizOGAlG@IFvG)eyQrIv~ z)Uu;u;U41RmwI9-`bMC1Oe-;hb)ZB3+*;&}D7whG!vNpTi`XZ zx}2{iCeO9IT~#EJGhX8nm|?T3=%R8nw=_^S3SI%#$S&G@u4_8D?Pm9*`M;L$87r|* z(r=z%ENKsXb_w9Z*UA&%{XWBV0KE*}?)H((tDKt_DAve2zH!9%-$W3SD_rLS@UQTz z+iP2@7dY~hALVdDs3`LMK~VyW2q9}45&4baujrjdaSXO!yf2mj*He`o+KpiM8g8Zw zX~Qt4YYw?ZQeF;$suMBvd}&SWy^4ie1i;yJUm77h|aE3>G>i}H= zQZbx#qdeM$z0~H6?2jmovU#b!zXoi_-0c@Uplk$m$VE9{-+ObPlf#h*^15#SwuGP@ z$NWjf&H2M?m3$uFjp>IIf;w=dL@ed=uPmx`$y60CtHNc}sX#$#5v=+F#O1DmT*tKc z(D2xi|0lCyUg#rK#~2w;8t+RgAQ6YjK*riC63HdxgXoO;fr3|$;RsNuE{0=I+Rx)w zlR#*dxik)cdnRnyitRV{c3vQDbnw1^4)TH(MVO!X%vGw%i1RNoZ_mn3wKjK(@5hnE zFK9+m2oX?fj!pDy{`g%PwXkHITqdH&rym4vJ5g@~AS{nK%!BMTtGe}5uJw#NyCW6) zE8HBK(}Z@6^S9> zPIQ5LlMJ)~`gjn*o4`o=263Sj2}ql4OLZca09P90xFS&>@GXJG@$)=3RSO_;|kT5v_`TxyzWWzz}~ z<-53mXQRa+bXk6Ow#=Afdq#7LzlAm zxF>EV-{l>wM^lpEGNep{{J`j*Ln!OqRKSFuL!gd+n2FeOXV(5vvPX@ez>&zta4$_a zYD!#mwDDsKjG}Sck~{fssyI&oS4;KtgIoup$!Me>H2t5=EUJ(fdUf5-u_H7aZ9i~W z1UA`KMX+=O$;i|lYFucC}PwNaD-wyBbndH7peNDqmdSM9OYfP~N6}+x75o*(=4Y<*=wc8In>g^gbyAB^#Y*H(2*W=CdQJ!pz9ehDf z2z|5~*Q1tvLwNn%bi*79>w^p4zqjcn7m4Vbwhf|)gU{t=S1SG1&O3O1wh)}U#ek#c zIT^!_dv(GJhY(J^b@z&Zo+O9$Tve7}%!BtnT9fLL_M&mH%57li`l@2y(OMR(YQ4QM z4hGSN$YUycaTp&3*O=M?iu!?1Y-yT!>ta5n+qOjW-4M&GeSv;9elB6UL+)K6jt{L@!vl%Oy*WTSri-&~ze32n=SgKTBmnH!hbXjR)=S zT+WxuJN^lIRf#A>WQ(cG8(UuD3a?@S5r0OaaV^t!rr~XG7zy`Zq*RLjJNltw2-mv7 z4MZ1L81jgV!ZLGa!;RYF=E(CW35`L>$N00ne1n7rSKsUfav3R`ESSR$Y>=XcYaU?8 z`+lR!!ukFsWGOCM*x8O?qFI|1N}&|_nACUoD}>7+5&&fc`4R)`yMKi0Q|w%Aisa`< z(Zqt`^gz_G6}AGJCZxzAL}TwY9=?P?6oNK-Hr3wzAfjxpRstuOYJt6$`FR>j zVh78^T|eq_pP?adhLH+Pzgh(b#eN?)GaX*D>kKo4KSx>8as{`HEtu{Zv7;-JV;zj=RybZg5O4mcs>KNpsK9 zlY6}~|CJaD!@IODwuEjTi%ba=JOXq)s8pJGjvf}P2$!8r&kiwk&P`HST@;2~xIo{c z@OIRQmsCXa*Jp1LE7$T}^w(5Z>TyYNkKpWyx!Oj6lvj;tWEN|q^U}hzij#2K$5MA> zxpUt0b@|mI^sykJ#wH(SPFTS!kI!&z?Gy>#kJ}HQ9mx-G8|AC%5w{0jp61`Ve*RDdIaW$)_Hw7oO z?yM{?v@E=ojMm9p9u8yJs0K9lHBbh;h=LBr!PnuP_W6`7-=h>)1s^hh=NA3IR? z8-8fBDlf(0LNhY32cRM|dQ=ShSOERro_+fJmB3AEfjuNL!PJ3486G*{k2~W6nL4qp zXE<%PUp0dSv7s#p+d2r}FfVxI5R?YL_&o|)L*Z9H&NKkr{r@~8Ec@przwI#7gNL5H z`*k^6BLHNPg6FBsz7GY(VgP#WUm^tV%eJnfbd~glhuKt-XT{pa&&BzEzq;$cDIvJu z$yWyN1uy=m({}-IN!*8?TIC|R5iC`1%A_fEu{Wzt#8XC%Wt2!(O*M~D{2|$gIJ$P< z=FKYF0Ut3aK?kV_zu-3c|JwViuqeOiT}lvXP#T5?>8@b_K|xvsk?sa*7->)>q(Qor zZbV8NK}wpDPU#-H_7ac^!1~!fD=F;yp znZzPd`;ktXC=$}oEAMHK<^=)EeGJ*hxxc^(t1ZP@tlnlXL%>Y~s1cxObJ}ZjCUFA&f6f&y zfCe{h#*6p>3L9{wR7~epmeM2%LQx32lYrBWXt2zm_03B<1+0bIYY$j9 zd2m!$nO|^?119UMDB(NDFp!y`f`tx0y`Z5lo1yq@90w3#&NUikuJk-zSkoDuCeXV# zbB$R8_k6dz{N%RD&}^j`BQ_|AS49lSWP{G$i?Jyh&=fJa6xH!^DPa{&e120x;u5_g4I0rF{`us7DQ3&YM1BQmH5lVx{3U=)!vWdTME;Cl~iTQ#l4=&$? zofxKu75soIB3#|pWT`Yj2Tn}hXi(>e#Y5cIHm&m#=|t1NL0pc7|8~5UMTR$Twu1SA zYEDQtl)mBdXp3`0Jh7)C-)g+TN1f*tsZQLQ7isZXLd<{=2s+T?Cifj4;@VFo&w|43T?T~45zI{bGAx3~mt=CIJAeJbLe2ux z2nTW*9A($A@MNHhK+1XFQhvAJf6s>OrRYUx4a3t)xY04Z1R_AK^}^kN3=1d_6w{R6 zX7N!LPBjU#8m5{${c09ZTUhJ2tBBfP^RJT~-SDOkUUiy^+#DS@tBRo#2RzPE1W`Rv ziKL}!_FlC2UM}GENc+n#Ky+{fE_e^YUXIo0o{xYTgB~GDDv`8ckY-kItgeD1+4eV0 zHqi_iPH=?7aNi`4-_vzk$`BbF)vOGdlgjT=fY7qcJQxx{U=%sO{3lHeeAaEaa^p@5 z*W*mZmR~7eC5Qb|`NFh?N1YLshp2J$>J7Eq*kCwjNu=GLRCM~Z6lA>}H?kMC@nq;` zE+?>}s$JnX2+#l_^>ZraQVy2P%XL9d0WK=#)rXTUE`sgeC?G|pCAJ*2F#8Dl?SLR6 zUJI5ai>yQ(r*c?1vq)h5UfYTwtZG>M+$VbHr%lkm2#Eg3=V2c+D)0`c+I)jd6V4Z zLgzQ{9^Yj-4$plFh~OS2_xC7%>O&=&cSFD!7RZ>nNwv#q;&aR?_3(a!qEL@xI={6{ zx%XMby-XbBP@+i;*D`g!7%=qq8m;mDRGtS?PFJwnXQ-asi%?g^e-q-v-qYoM{4_uP z^u6=9K5%+;2oS^9e;SeAzfL8dbR`>8pi?yLSWt*G%y^Od6WZ=!k1c|m9C zs4Y7Js;z>gcdBuwk15=Qm`bn!MiAN5q3GNW9=;0famBJ=yTCr!80unJu;Aa)rju!vcc4lEpD%&c0&;;#sZWB zct*1BI?@NG{oG<){h?e>1X{r_nj#N97cQwZfge_te)aoz^?mo?c7M3){M>h+Pe2<4 za7oL;E~GWE2m}D?BoBfcxi>q=xj?r7Xd@6u#7e(dN%PN`N{Q*{0aj+<;9#TRzOuT~ zvjCct+DHqa?PEx{P$dm|&Bq^t)S{0^6?q8!G9Ep>%T&Dbiy=(e23nem(}1WH^ER;o zsO~I*<1Fyqmx)m%Z0EhRe$zkFYp;-;`0yuKh{SJ9^I7Du=Rk@R0Qa+ z^(flNz_wot!bZJ9Jto}4iKF+yim5QlScY)(xHKk-x!^#}L(MjrXucNl1bhnuU6%H1 z+)8|6jEjI546;Ql(^smVxg?BKPqD9xEvP|_4b+0I{DoZ7I6Fa89Pp>OAQ-a0=h6U% zohrdAl2)J1@(=F8D>}ntp|)MX`U`;Qi-UNeRU6D_z_|yIJ&;N00Tv)FTwSEV(eTK4 z`Mnh08zQqp2$PXJbdsa~i!4 zMr0ILSWdzL5q%UO6PUoinC=vTOoPnh^YzvaAhR7O_e~|kGt65b)>b%`WUc)#aOs+p zaWB=LNgkp9FPKd3tQMR3_w~^xVAKPOF(lJkz3->>;oG+?%IF_lEF+3k*z)y(<^%Xf zZdv&pq&2YOa$2o&1D2f&BTnc#{g)lNY|@Ik&p(jo{gIK=1bh+%Hz4qcarv#{WtCFA z5`?(~t0@wUJb5PEaHac#50^T!&s*$vh#>l4#?BSUtBD4>xao=pJ!D7$WYxRY=BwGb zod$g9ZR>>=eg=X`83P*?13MOjOI;_i*__A!fUGrQp__nCk65Lbm^p?n_Mve=uK#*%zy6bCcs)@~U{3i%TG;BjK!j5G{C>=u4JlD}V zXr}I2lAD!TH4HW9iCEXhIlT_h4ze1C*5=l>?#3q`Pzubzu)83w$pvjR9gdaJ*Gb{w zzND_pHkm`_vi$ohW1pd(htJxWh+JKsTo|>&v*5LqkLOT)g}+PJ?6qiV;5FfU4JySG zUKr4!wz&$5&D-IR$;?qsSHsf00Z92yu>Sj`8J~z27aVfrub%+Z@$q}LWQ62&t}-+} zPR=FAV{4!%OKQCC?DU<7=`Gv4???6#znOFVV0OuA?mPJADk!X65z@_qZsfkXeMO4C z@H<*CTX2d;HOi~J#LVxcPuTR4s`M{x!~(j@rm56b`-QQ~2-8Hiu+zCu>u;X&ihVVa zw?9YNUgAuMt%qQG8;qTb&q0m`i&(Zl(U&I}V&w|mQ5>0LLAlDPMc>kVPlq@cr1+bn z7;o_QHWl&@4Sk~ zO+v(@(%XH_kF7s{f=I5Cc+}kpS49hl4oE;|D_l;#KKHkWHD@WjMA^^Ah#hS9h)P^{ zYRucxz1y&l6d9i`eInr!_2;{wj*SjDWzskNL zBj`#657ODWQhxAKmqH~v&&Jq>FOei39woAu{C<|(=hW&i?N7@0!#hb~B>4sGkli=u ztC8U7a+>{2S4`*n!B@rYT2StY=~z-1k0Ri;srHG%D?9sPi0wnw9!r}Z%cbp7uOSlnpq#V0tOCa z>c-P%Z6BXo*R>aTGnY?<&)Qko;L-%!I1JVeJn7LT(tF~5`Te*}hUU3A*U*{+hrHGC zz9N+hy3*STuf7YSq(o?wcm5zG3%YXXlJvpVW&gDxR}uHo?J3$-Gj0phq2wE4lqTuo zikjZBkHiDtI_9)8;c64_&+H?WlnmG@AR1B^42!8mdI|J*n}6_EBh*eV*&%zHlSqqv zF4bsXd(XD445>vaqxpY_ui?`yCpx0j|N1%C1d!gk#DCxPG;2lq*Ejb|&FTMxpOx%* z@Q*_DspC;Xnw51Q73cRfgL_MG`^N_nSotGtT0F(KUJPTOVn2gU$$*!x!g9s{3({UlRFCGB(}(3obCtPn1MQ7iAx5nu#zC;dB+c~c z!`MbtLXsY*2ZRG=>UF!MzpqU+vdn``{Fg@B)D43&z6z8vT_Jvk$l(P*XHm73r1Lp zHoTrs2dWw9F22L?>;bALE0fuaFLQi)tMp*igArZv5Ev?x%d|T|tJ`{j@5PPo|Kp|9 zw_{;-DgSZ&`X8hJx(l{B*P@JU0=B9zeyJva)p}F;DR@iZM+{ZTRz`a$Vhq))Ac&nWcJ)X+%0o%xmRI61O|o zl8$8}y;J|f9_V2yI?Lh~fP z&C*!xSH4He9u1fwzBO&>>?NNL%OXjoB*zv}Eoz*geyYHY&CDf38aT z#Av2t7CkG4TwP&UM^pQ?zBMU`_kGU*`t4Pt`&lQfp&6X53sCk*E-Ou)#qAOrL!(`% z@@cC)UQ<4i?8PASe(UKlgrMnX2kCk2NjA@>nt7H`LEX#_54{@1+@5*SiGi-HUgS6) zo-!=|i+aYb@aIfLLH(`DH?*$?q9D`1j@yBe*l5h%?V5qKfsM9}d-NmaC7T}=TaS|^ z4ivw`UUzi+xm(5VdZ=bD426P4pMvp5ZM&1be)n!(`Xx;IK%YoX79CDKOUdvEo9K)O!*hHJe7De&AcqMiN-iB-sM?>($Ta`R=5&uujUAY;OSRvQ}^a!inIvY z!Z#C$7e0qKklQxPy>*h%VLI{4pccnbYVle7m5Z?qW-XjzzVXgH?h3ABQ4NakI)`i) zfAO!ZZH+#}bs9u7+ml9mMMvO{fLB zgnfDn>saxkEVEML4e7863#78}3Ff~1#ZSr@Fz1rO&;o$i#!iw6a#2M=50oC!# zu#RB(SZj5#tbxbPeX9K@Qgyb|Ccv)KeCHsnvH$I-{AZ6pk|pn)>F?FJ_^5Ln9yp{7 zo%YSzuG!#H+iY`Wrm7o%hnQP?-iK&IBXt^Dt)W?mIFs(P88}gYEwZGzaxzGI=6CDYb2o>C`sq$$sTAMaekh_&M1L*`f2aY_wIs7hdW_`5zEEe)k z=ps$2QD0}XxH4rEr@iC{Pi9l$@6EymXY*l7T_2BEOCmEk*ACu+yB>*M!}$WQWp%Sx zrfS8X9C1BcHst7A$11jfPvP+%S3ir%FSb=p2+`Nw`?27vhJo_69943T*O;nt5g zhuZzom928{q4+yYWwI-#kx<0Cb-Fc1<>0VLAs)4@Z;0-KMJw{hL@)Tk%?NwUmg$3N zSsE$+e1%}=%NkrRlX_m$vc-S$-Tr$_fhNX>BdVX&&i=T`k;Y0aWIY8hp9oC6Ga*7}(1cvmsxmsGs*W4`HTpXUyV@ESTYT;yA^>!9Nv42c?>>J# zPZe_zegrn9sclPgOu1Ap*u^6m38(^E*|&ic-9Q332d8;=sj4OV*J9LKMRdRFu|+w9 zu_h@|2GJ;?vAWxNG^=9Y+pQ(Z0uEck5s-=cU(EYzh10gyzg@MI#T%u(EdJyuh#-Gi zgQ_)mN6o=v1+-MDHt8}4Mq>uzy1i_Av3o;AX|YkqRgkF|Rpi+Ntc`ruMA1Sgzb51z-% z;)rEl`fw(qpgVa8sm>lxMke)|hdtgrr`Aei8@l6BHEUapZ8WjZQXuQ`3;Wo@f!#6`h=Ed3C>j{(c(`f;cAG^1)~X)6a2R)mTYa4B zfF4irJc^iJ0xIPuN~VJ4K0<=|C2=Ui#@xA-NG0l2*1f=A)M;|tViMT^;xd>v^@#qe z8TZXd&g-6J76$BtcI#rBA=btx4njvDJ?`Ess`BWW+6v&{paK683=#e%OWH9$yp}Wf zD2gKfH|5>G9eOHeg6_~MPJEp|k>~%k!cT{@`KoR3X}V&!+zRZl%PG{|&=t$Klw#^+ z^*P%4q7=8PD+njM1-j4Gy&R=*adk6Q%8;t?bC9}S!IC;!l**8=AfjMtqAxIoB6Mgs zCoc1c)K!$&EYJpdPA54D#{No;etjx9xoZiy1%H}75(9aZ5Jz-(e=5HB?uqYn2HS)U zpLoSCth~XhOt=oMSqhCDjRAjo*P)7C1uMbkW&2^WAua4R!zC;*+cRSgs-IgMPKz#+ zu3|e->U}BvaI1*QHX;g+{GDPsXuS7fP>!+>M>A5SK?JH)AucKzRb9_-tW`s)>b&v6z%; z&4vnk0C?<;;Kw@w*;K{_@R0n>n3@hZG)Q-suUwcoKlLZMX(8pY4FX@G8^?_jXh)(I zf^zyV7XHaM*_o=%_rf=oy>z?>J|`Dpvzy^bn#rm=*G>h0>OY|taG;Zp7Wp+`ia}TY zxBzh*(hKXl;x5M!RuZ(ES0{%LYu&xf!uKYZ3JSLLb+_^uKQMwsLCDMrawr`a@2Dzp zWJP@P_og{N>JWiMoNBset+nM#x{1DopLsXqp0s=vQI<8y7kHUF}Yyy_cCT}uk>16 zl~K|xdL3x?O0nOvr$`&0slGt!DPJ9K%`%-rK1CZ)@`l?Bke9494fbTmav$cit?&0s_wh?L8upX18_0pJEHo&u+l-`>ByP4_9SES8Y)x z-=@ab_nIM{$)Faoec|U)JUEl4GX7|b)@Rhb`(>Y}6*`isSxW;4X2W%pd#nmu$25!I zo6ME0o`TJKi@=cj$eXH(l-f`C2@dxke{^vRP&-EjhU(o@Fu*^NX2&gez&eGpamcc6~v+&>NI%BQ!%}~nhNcTEefW0OK9$L`(I8V zTx7V!*s*2i=;gxXs7uK5c-3*PSN0?`>lxFTQ2wYIHGR(3UjMp&zd;EkNS0jiQ7G+B z3gPK}joOc^V2es>t$M0PYm;v7^A}= z03x?TR6W{^ziUz{-WrsuAgld~bQ$h*YR$+Shi@pCkL7otvsbVvM)4oD_6oK+_6eD( zz74*w3ANN%;5J=Bs} zSblRTS{!Z90^=g&JOf#x*B5?Cj*HkwxkB0;5$7Y8AL~R?t3!kv4U*(x6f7xck%0m< z=k8Up>k~6LrKEpzTR{b9Cyz+{w~n7W*ceX;Nsx&22?aD>FV^+~5}RQ~wp2i#UlaAE#FOWT*At|7PvoqBbyw+nq4n zd02&A?Ur)h@&sU@$UHoF_$;?-Vqiaf+b*4*K!?Z6K9PlDhw=gI3P>zxk%eBjb~V|y zMptiI{j7(>SZ;2_)Tc$#&=AkJ6DS9{r&MhlCTaHH6&_+#d=a zV@Q=*Krk`Y566%{SkXN-k+?U3M)GsVmcb8NtKGQh9p#&9C)Zn>D+d<*977CXby`c7= z5}J4O*zbMwWZ~wO6MclUI_9lODJ8e0!TE}zNrz^JdK(Av2>08|QCa|0JkBsqoh0w1 z+>Py&hd#Nz*<&yo|BUOS5%t6oCc8&~%*jE>t`?$eOYIv7I z(p07y$Bx>g-L_=c^Q6k}gauXH$=nC5#nU$k#%HcqG&8a?imD7>voa%ue`5n2bHeVy z?Zw)o*2Y$8-$jWZUNREi#3&Exf4?Q{5)XkTo$YbH9*C%nNQO8F_f8R6Qes>mOvz$0 zK0yInLJm{n1XoA00 zxr%7{r;K{w_7VlW7Nb~OlJw;y5iP!xpe7m@i@XxAlQbd#)<{YDx6$zy;psb!A8p>8 za&SkQ;=;atIRLdndfBO1-S9eqQ8@YxYT41je&^zmn;JS0Y8nY(oz|a~?Na)B%W^q% z@^?Ie$hJFW@J4`_TnN2Iw{QQQ@zl=U=SfwZ zN&@1Udf!C&vCVGk4Y92Wu1#JmIqmFL%NE)cn)&vHzOi%S$lk!yTTgyHzQRXM2@bPE+6@yb&9txlnf_z-sRE%cNZ!O*(|#T zB~Q+cAX%o5H?DgxWC3*bQ|tLJY=GZ`I_S^?2$UT)?y_U~o_%vg&-`R#=cp2iKmLj< zg0%|Eo>8lSRI6dK0DA2*ZY3sS3Lpz1sq8o!jX{hr23a4dVrm#T8CBJARs9y&ZtA8S ztS)X0Q_l9d50P-PdYvHzP4Chje=LghL;99LjEzVxfEz5O7V`wifiuULbegy-*+HJ; z;p(6Wnz%Z2KX3oQU9H4GN0k{@NRG2TT}e*7YGL_~VngfY%_E0?x)}q(3ARN-NMXch84>mlhb* z%Y40CUNj?}3KG^qk_b@v!(PLbT@TVBk(I$aX2$qid*1U6hR9+uaxQ{KxBN4-Ymolqle{Al}DWjvx zYCw$sU~FQj360MTlW@waEcQX!#YRR+lw~vI9;c)9h4yNzU-A(}5vgDiQCzCiwymh% zsZWpsL>=G#(kwoI-KijDdCMf00A38H$v;1+lA}FQ=aB!y*!TSZg#f)!;>i5<{R4+j zY~#G{H36-)!*9Fy<@#Sc^h5Pj*lng}uV!#|JOs>3Lv20Mx%X{G4N8{lB6{G4r;Hy;ac^U`QJ|Wngt0tMp zy!&Sf5kO`uD%`BSg+Vm}N23pWFGwOkV^edSB@KGvy48Ra8$si@x=p(1~IgSPk-7 zV)e+Z8`~k{-SnM#D}S|73JjA{m391}%3#Q51lq@6lj%`34&K5cz9BPZ5_OcG4&(O& zD=&W?Mt#(3%Y;HG6I#H8+7@ToWCb<+Ow$xkq zMUc~Z?hkFYr!x`e5OuS|L3sE8c5ysVjs`j|K47`2ROqgz9u>13Ow>QN}b+Y{9$}BA&ZWRQ|educXiv{7g&(nd8B^zuM@&Z$K!F+=%C^iZL zd4OVQ%pWCq{mN=1Ekd@Y%{wpK8mHD6la420KgfczJT~Zi65iYOU7sF{SZF;hi6O$@3O-7SV@hH9yr-519mv#GgU` zJRw}L`ES?+_;n&!9iLkV@kI#TOdj0Y58RYa)ixWgddH^wcvBK8&u1kb^rG?n_fFTX zh53*hG%oqvnNl||q`=J(%1HR%e@_sh>&yF_BQ(WVxZlTQ`swdSMkZ8@={|@&JIFW->}l#(tU?qN6neK8+HSHg7A9^sjt+F1 zHt#G@_<8xn#Ce6p`S|JhM8)}q#rb)^xh$W84>R9?*xba;Lfq{Biu;f9^K$Wua`E$N yf@=f>#d*azczMNnd5ukp$^MTE-Z`4vSbF~7FCdaCE&&&yD7;X8UM^$&;eP-Wo#Vg& diff --git a/web/manifest.json b/web/manifest.json index fce1bbe82..6fb81a6d5 100644 --- a/web/manifest.json +++ b/web/manifest.json @@ -12,12 +12,14 @@ { "src": "icons/Icon-192.png", "sizes": "192x192", - "type": "image/png" + "type": "image/png", + "purpose": "maskable", }, { "src": "icons/Icon-512.png", "sizes": "512x512", - "type": "image/png" + "type": "image/png", + "purpose": "maskable", } ] } From be5442bbd6a8123c0131cf1ef9fb571542a01dab Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Apr 2021 00:40:06 -0400 Subject: [PATCH 140/251] Added Subject.virtualLink --- lib/src/data/schedule/subject.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/src/data/schedule/subject.dart b/lib/src/data/schedule/subject.dart index d5f014520..11474904d 100644 --- a/lib/src/data/schedule/subject.dart +++ b/lib/src/data/schedule/subject.dart @@ -28,10 +28,14 @@ class Subject { /// The teacher who teaches this subject. final String teacher; + /// A link to a virtual class, like Zoom. + final String? virtualLink; + /// A const constructor for a [Subject]. const Subject ({ required this.name, - required this.teacher + required this.teacher, + this.virtualLink, }); /// Returns a [Subject] instance from a JSON object. @@ -39,7 +43,8 @@ class Subject { /// The JSON map must have a `teacher` and `name` field. Subject.fromJson(Map json) : name = json ["name"], - teacher = json ["teacher"]; + teacher = json ["teacher"], + virtualLink = json ["virtualLink"]; @override String toString() => "$name ($teacher)"; From 9070f1ca949bd3cd91f64aafecd72567134d60f6 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Apr 2021 01:08:29 -0400 Subject: [PATCH 141/251] Added Zoom links to Firestore --- firebase/firestore/lib/src/data/schedule.dart | 4 ++ firebase/firestore/lib/src/helpers/dir.dart | 4 +- .../firestore/lib/src/sections/logic.dart | 2 + .../firestore/lib/src/sections/reader.dart | 8 +++ firebase/firestore/node/sections.dart | 6 ++ firebase/firestore/node/zoom_links.dart | 57 ------------------- 6 files changed, 23 insertions(+), 58 deletions(-) delete mode 100644 firebase/firestore/node/zoom_links.dart diff --git a/firebase/firestore/lib/src/data/schedule.dart b/firebase/firestore/lib/src/data/schedule.dart index 84e58236c..99d064b76 100644 --- a/firebase/firestore/lib/src/data/schedule.dart +++ b/firebase/firestore/lib/src/data/schedule.dart @@ -43,11 +43,14 @@ class Section extends Serializable { /// The full name of the teacher for this section. final String teacher; + final String zoomLink; + /// Creates a section. const Section({ @required this.name, @required this.id, @required this.teacher, + this.zoomLink, }) : assert( name != null && id != null && teacher != null, @@ -62,6 +65,7 @@ class Section extends Serializable { "name": name, "teacher": teacher, "id": id, + "virtualLink": zoomLink, }; } diff --git a/firebase/firestore/lib/src/helpers/dir.dart b/firebase/firestore/lib/src/helpers/dir.dart index b224c41dc..2e4c5e2c7 100644 --- a/firebase/firestore/lib/src/helpers/dir.dart +++ b/firebase/firestore/lib/src/helpers/dir.dart @@ -44,13 +44,15 @@ class DataFiles { /// Contains the names, emails, and IDs of every student. static final String students = "${dataDir.path}\\students.csv"; + static final String zoomLinks = "${dataDir.path}\\zoom_links.csv"; + /// The list of admins. /// /// Each row should be the name of the admin, followed by a list of scopes. static final String admins = "${dataDir.path}\\admins.csv"; static final String constants = "${projectDir.path}\\constants.yaml"; - + /// Returns the path for the calendar at a given month. /// /// The month should follow 1-based indexing. diff --git a/firebase/firestore/lib/src/sections/logic.dart b/firebase/firestore/lib/src/sections/logic.dart index 4d1966b24..5599267f7 100644 --- a/firebase/firestore/lib/src/sections/logic.dart +++ b/firebase/firestore/lib/src/sections/logic.dart @@ -29,12 +29,14 @@ class SectionLogic { @required Map courseNames, @required Map sectionTeachers, @required Map facultyNames, + @required Map zoomLinks, }) => [ for (final MapEntry entry in sectionTeachers.entries) Section( id: entry.key, name: courseNames [getCourseId(entry.key)], teacher: facultyNames [entry.value].name, + zoomLink: zoomLinks [entry.key], ) ]; } diff --git a/firebase/firestore/lib/src/sections/reader.dart b/firebase/firestore/lib/src/sections/reader.dart index 305da90bd..12f5cb9eb 100644 --- a/firebase/firestore/lib/src/sections/reader.dart +++ b/firebase/firestore/lib/src/sections/reader.dart @@ -32,3 +32,11 @@ class SectionReader { row ["SECTION_ID"]: row ["FACULTY_ID"], }; } + +class ZoomLinkReader { + static Future> getZoomLinks() async => { + await for (final Map row in csvReader(DataFiles.zoomLinks)) + if (row ["LINK"].isNotEmpty) + row ["ID"]: row ["LINK"], + }; +} \ No newline at end of file diff --git a/firebase/firestore/node/sections.dart b/firebase/firestore/node/sections.dart index 38476d37d..7c46ba13e 100644 --- a/firebase/firestore/node/sections.dart +++ b/firebase/firestore/node/sections.dart @@ -21,11 +21,17 @@ Future main() async { "faculty names", FacultyReader.getFaculty, ); + final Map zoomLinks = await Logger.logValue( + "zoom links", ZoomLinkReader.getZoomLinks, + ); + Logger.info("Found ${zoomLinks.keys.length} zoom links"); + final List

sections = await Logger.logValue( "sections list", () => SectionLogic.getSections( courseNames: courseNames, sectionTeachers: sectionTeachers, facultyNames: facultyNames, + zoomLinks: zoomLinks, ) ); diff --git a/firebase/firestore/node/zoom_links.dart b/firebase/firestore/node/zoom_links.dart deleted file mode 100644 index 2c259c216..000000000 --- a/firebase/firestore/node/zoom_links.dart +++ /dev/null @@ -1,57 +0,0 @@ -// @dart=2.9 - -import "package:firestore/data.dart"; -import "package:firestore/helpers.dart"; -import "package:firestore/services.dart"; -import "package:firestore/students.dart"; - -extension RegexMatcher on RegExp { - bool fullyMatches(String str) { - final String match = stringMatch(str); - return match == str; - } -} - -bool isZoomReminder(Map reminder) => - reminder ["time"] ["type"] == "subject" && - reminder ["time"] ["repeats"] == true && - RegExp(r"\d{3}-\d{3}-\d{4}").fullyMatches(reminder ["message"] as String); - -Future printZoomReminders() async { - for (final User user in (await StudentReader.getStudents()).values) { - final document = Firestore.remindersCollection.document(user.email); - final Map data = (await document.get()).data.toMap(); - final List> reminders = [ - for (final dynamic reminder in data ["reminders"] ?? []) - Map.from(reminder) - ]; - if ( - reminders == null || - reminders.isEmpty || - !reminders.any(isZoomReminder) - ) { - continue; - } - - Logger.debug(user.email, reminders); - - - // await Firestore.deleteRemindersFromUser( - // user.email, - // (Map reminder) => - // reminder ["time"] ["type"] == "subject" && - // reminder ["time"] ["repeats"] == true && - // RegExp(r"\d{3}-\d{3}-\d{4}").fullyMatches(reminder ["message"] as String), - // ); - } -} - -Future main(List args) async { - Args.initLogger("Reading zoom reminders"); - if (Args.upload) { - await Logger.logProgress("zoom reminders search", printZoomReminders); - } else { - Logger.info("Did not read reminders. Use the --upload flag."); - } - await app.delete(); -} From bb1c141575f8d8f3eded18fed0ea394006d8cad4 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Apr 2021 01:12:38 -0400 Subject: [PATCH 142/251] Added zoom link to Period.getInfo --- lib/src/data/schedule/period.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/data/schedule/period.dart b/lib/src/data/schedule/period.dart index cc6a62f44..f28e8dc7a 100644 --- a/lib/src/data/schedule/period.dart +++ b/lib/src/data/schedule/period.dart @@ -184,5 +184,6 @@ class Period { if (int.tryParse(name) != null) "Period: $name", if (data != null) "Room: ${data!.room}", if (subject != null) "Teacher: ${subject.teacher}", + if (subject?.virtualLink != null) "Zoom link: ${subject!.virtualLink}", ]; } From e9280d25f03e3a3a457ab580b49a7a693cd2c290 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Apr 2021 01:19:46 -0400 Subject: [PATCH 143/251] Made zoom links selectable --- lib/src/widgets/atomic/info_card.dart | 2 +- lib/src/widgets/generic/class_list.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/widgets/atomic/info_card.dart b/lib/src/widgets/atomic/info_card.dart index cbe660222..a02872bdf 100644 --- a/lib/src/widgets/atomic/info_card.dart +++ b/lib/src/widgets/atomic/info_card.dart @@ -44,7 +44,7 @@ class InfoCard extends StatelessWidget { ...[ for (final String text in children!) ...[ const SizedBox(height: 2.5), - Text(text, textScaleFactor: 1.25), + SelectableText(text, textScaleFactor: 1.25), const SizedBox(height: 2.5), ] ] diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index 08f197c5d..54ee78616 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -58,7 +58,7 @@ class ClassPanel extends StatelessWidget { for (final String label in children) Padding ( padding: const EdgeInsets.symmetric(vertical: 5), - child: Text (label) + child: SelectableText(label) ), if (activity != null) ActivityTile(activity!), // already checked for null From 0991f0d979e65a16668ae9be25573d719291ca96 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Apr 2021 01:35:01 -0400 Subject: [PATCH 144/251] Made Zoom links clickable --- lib/src/widgets/atomic/info_card.dart | 7 ++++++- lib/src/widgets/generic/class_list.dart | 7 ++++++- pubspec.lock | 7 +++++++ pubspec.yaml | 1 + 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/src/widgets/atomic/info_card.dart b/lib/src/widgets/atomic/info_card.dart index a02872bdf..f648f3b22 100644 --- a/lib/src/widgets/atomic/info_card.dart +++ b/lib/src/widgets/atomic/info_card.dart @@ -1,4 +1,5 @@ import "package:flutter/material.dart"; +import "package:link_text/link_text.dart"; /// A tile to represent some info. /// @@ -44,7 +45,11 @@ class InfoCard extends StatelessWidget { ...[ for (final String text in children!) ...[ const SizedBox(height: 2.5), - SelectableText(text, textScaleFactor: 1.25), + LinkText( + text, + shouldTrimParams: true, + linkStyle: const TextStyle(color: Color(0xff0000EE)) + ), const SizedBox(height: 2.5), ] ] diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index 54ee78616..82a98c2d2 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -1,4 +1,5 @@ import "package:flutter/material.dart"; +import "package:link_text/link_text.dart"; import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; @@ -58,7 +59,11 @@ class ClassPanel extends StatelessWidget { for (final String label in children) Padding ( padding: const EdgeInsets.symmetric(vertical: 5), - child: SelectableText(label) + child: LinkText( + label, + shouldTrimParams: true, + linkStyle: const TextStyle(color: Color(0xff0000EE)) + ) ), if (activity != null) ActivityTile(activity!), // already checked for null diff --git a/pubspec.lock b/pubspec.lock index 7049f6b8d..421af320f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -296,6 +296,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.3" + link_text: + dependency: "direct main" + description: + name: link_text + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" matcher: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index 456e4dbf5..540fa0994 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,6 +33,7 @@ dependencies: flutter_native_timezone: ^1.0.10 url_launcher: ^6.0.3 adaptive_breakpoints: ^0.0.4 + link_text: ^0.2.0 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From 4ec8a794fd454407b44bf329ecf738ccda1e1c7b Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Apr 2021 01:43:36 -0400 Subject: [PATCH 145/251] Removed all instances of Special and replaced with Schedule --- lib/app.dart | 4 ++-- lib/pages.dart | 8 ++++---- .../models/view/builders/schedule_builder.dart | 10 +++++----- lib/src/models/view/schedule.dart | 16 ++++++++-------- .../admin/{specials.dart => schedules.dart} | 10 +++++----- ...pecial_builder.dart => schedule_builder.dart} | 14 +++++++------- lib/src/pages/drawer.dart | 2 +- lib/src/pages/schedule.dart | 4 ++-- 8 files changed, 34 insertions(+), 34 deletions(-) rename lib/src/pages/admin/{specials.dart => schedules.dart} (83%) rename lib/src/pages/builders/{special_builder.dart => schedule_builder.dart} (92%) diff --git a/lib/app.dart b/lib/app.dart index d79f993dd..40cb9da36 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -36,9 +36,9 @@ class RamLife extends StatelessWidget { isAllowed: () => hasAdminScope(AdminScope.calendar), child: const AdminCalendarPage(), ), - Routes.specials: (_) => RouteInitializer( + Routes.schedules: (_) => RouteInitializer( isAllowed: () => hasAdminScope(AdminScope.calendar), - child: const AdminSpecialsPage(), + child: const AdminSchedulesPage(), ), Routes.sports: (_) => const RouteInitializer( child: SportsPage(), diff --git a/lib/pages.dart b/lib/pages.dart index 357b9cd8c..f5fbacde5 100644 --- a/lib/pages.dart +++ b/lib/pages.dart @@ -1,11 +1,11 @@ library pages; export "src/pages/admin/calendar.dart"; -export "src/pages/admin/specials.dart"; +export "src/pages/admin/schedules.dart"; export "src/pages/builders/day_builder.dart"; export "src/pages/builders/reminder_builder.dart"; -export "src/pages/builders/special_builder.dart"; +export "src/pages/builders/schedule_builder.dart"; export "src/pages/builders/sports_builder.dart"; export "src/pages/drawer.dart"; export "src/pages/feedback.dart"; @@ -38,8 +38,8 @@ class Routes { /// The route name for the calendar page. static const String calendar = "calendar"; - /// The route name for the specials manager page. - static const String specials = "specials"; + /// The route name for the schedules manager page. + static const String schedules = "schedules"; /// The route name for the sports games page. static const String sports = "sports"; diff --git a/lib/src/models/view/builders/schedule_builder.dart b/lib/src/models/view/builders/schedule_builder.dart index bdab857f2..cc4ace982 100644 --- a/lib/src/models/view/builders/schedule_builder.dart +++ b/lib/src/models/view/builders/schedule_builder.dart @@ -5,7 +5,7 @@ import "package:ramaz/data.dart"; /// A view model to create a [Schedule]. // ignore: prefer_mixin class ScheduleBuilderModel with ChangeNotifier { - /// The special that this special is based on. + /// The schedule that this schedule is based on. Schedule? preset; ScheduleBuilderModel([this.preset]) { @@ -19,7 +19,7 @@ class ScheduleBuilderModel with ChangeNotifier { String? _name; int _numPeriods = 0; - /// The name of this special. + /// The name of this schedule. /// /// See [Schedule.name]. String? get name => _name; @@ -57,7 +57,7 @@ class ScheduleBuilderModel with ChangeNotifier { notifyListeners(); } - /// Whether this special is ready to be built. + /// Whether this schedule is ready to be built. bool get ready => numPeriods > 0 && periods.isNotEmpty && name != null && name!.isNotEmpty @@ -75,9 +75,9 @@ class ScheduleBuilderModel with ChangeNotifier { notifyListeners(); } - /// Sets properties of this special based on an existing special. + /// Sets properties of this schedule based on an existing schedule. /// - /// The special can then be fine-tuned afterwards. + /// The schedule can then be fine-tuned afterwards. void usePreset(Schedule? schedule) { if (schedule == null) { return; diff --git a/lib/src/models/view/schedule.dart b/lib/src/models/view/schedule.dart index e475553ee..fc08b4220 100644 --- a/lib/src/models/view/schedule.dart +++ b/lib/src/models/view/schedule.dart @@ -7,7 +7,7 @@ import "package:ramaz/models.dart"; // ignore: prefer_mixin class ScheduleViewModel with ChangeNotifier { /// The default [Schedule] for the UI. - static Schedule get defaultSpecial => Schedule.schedules.first; + static Schedule get defatulSchedule => Schedule.schedules.first; /// The default [Day] for the UI. late Day defaultDay; @@ -30,11 +30,11 @@ class ScheduleViewModel with ChangeNotifier { /// /// Also initializes the default day shown to the user. /// If today is a school day, then use that. Otherwise, use the - /// defaults (see [defaultSpecial]). + /// defaults (see [defatulSchedule]). ScheduleViewModel () : dataModel = Models.instance.schedule { defaultDay = Day( name: Models.instance.user.data.schedule.keys.first, - schedule: defaultSpecial + schedule: defatulSchedule ); day = dataModel.today ?? defaultDay; } @@ -61,16 +61,16 @@ class ScheduleViewModel with ChangeNotifier { /// Gets the date whose schedule the user is looking at DateTime get date => _selectedDay; - /// Updates the UI to a new day given a new dayName or special. + /// Updates the UI to a new day given a new dayName or schedule. /// - /// If the dayName is non-null, the special defaults to [defaultSpecial]. + /// If the dayName is non-null, the schedule defaults to [defatulSchedule]. void update({ String? newName, - Schedule? newSpecial, + Schedule? newSchedule, void Function()? onInvalidSchedule, }) { final String name = newName ?? day.name; - final Schedule schedule = newSpecial ?? day.schedule; + final Schedule schedule = newSchedule ?? day.schedule; day = Day(name: name, schedule: schedule); notifyListeners(); try { @@ -78,7 +78,7 @@ class ScheduleViewModel with ChangeNotifier { // TODO: Move the logic from ClassList here. Models.instance.schedule.user.getPeriods(day); } on RangeError { // ignore: avoid_catching_errors - day = Day(name: day.name, schedule: defaultSpecial); + day = Day(name: day.name, schedule: defatulSchedule); if (onInvalidSchedule != null) { onInvalidSchedule(); } diff --git a/lib/src/pages/admin/specials.dart b/lib/src/pages/admin/schedules.dart similarity index 83% rename from lib/src/pages/admin/specials.dart rename to lib/src/pages/admin/schedules.dart index 7142237de..0b2244e5c 100644 --- a/lib/src/pages/admin/specials.dart +++ b/lib/src/pages/admin/schedules.dart @@ -5,10 +5,10 @@ import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; -/// A page to show the admin's custom specials. -class AdminSpecialsPage extends StatelessWidget { +/// A page to show the admin's custom schedules. +class AdminSchedulesPage extends StatelessWidget { - const AdminSpecialsPage(); + const AdminSchedulesPage(); // If the user is on this page, they are an admin. // So, model.admin != null @@ -20,7 +20,7 @@ class AdminSpecialsPage extends StatelessWidget { drawer: const NavigationDrawer(), floatingActionButton: FloatingActionButton( onPressed: () async { - final Schedule? schedule = await ScheduleBuilder.buildSpecial(context); + final Schedule? schedule = await ScheduleBuilder.buildSchedule(context); if (schedule == null) { return; } @@ -45,7 +45,7 @@ class AdminSpecialsPage extends StatelessWidget { title: Text(schedule.name), onTap: () async { final Schedule? newSchedule = - await ScheduleBuilder.buildSpecial(context, schedule); + await ScheduleBuilder.buildSchedule(context, schedule); if (newSchedule != null) { await model.createSchedule(newSchedule); } diff --git a/lib/src/pages/builders/special_builder.dart b/lib/src/pages/builders/schedule_builder.dart similarity index 92% rename from lib/src/pages/builders/special_builder.dart rename to lib/src/pages/builders/schedule_builder.dart index 2552536dd..1afddab0e 100644 --- a/lib/src/pages/builders/special_builder.dart +++ b/lib/src/pages/builders/schedule_builder.dart @@ -10,7 +10,7 @@ import "package:ramaz/widgets.dart"; /// an existing schedule by passing it as a parameter to [ScheduleBuilder()]. class ScheduleBuilder extends StatefulWidget { /// Returns the [Schedule] created by this widget. - static Future buildSpecial( + static Future buildSchedule( BuildContext context, [Schedule? preset] ) => showDialog( @@ -25,13 +25,13 @@ class ScheduleBuilder extends StatefulWidget { const ScheduleBuilder([this.preset]); @override - SpecialBuilderState createState() => SpecialBuilderState(); + ScheduleBuilderState createState() => ScheduleBuilderState(); } /// A state for a [ScheduleBuilder]. /// /// A state is needed to keep the [TextEditingController] from rebuilding. -class SpecialBuilderState extends State { +class ScheduleBuilderState extends State { /// A controller to hold the name of the [Schedule]. /// /// This will be preset with the name of [ScheduleBuilder.preset]. @@ -61,7 +61,7 @@ class SpecialBuilderState extends State { icon: const Icon(Icons.sync), tooltip: "Use preset", onPressed: () async { - final Schedule? special = await showModalBottomSheet( + final Schedule? schedule = await showModalBottomSheet( context: context, builder: (BuildContext context) => ListView( children: [ @@ -80,9 +80,9 @@ class SpecialBuilderState extends State { ] ) ); - if (special != null) { - controller.text = special.name; - model.usePreset(special); + if (schedule != null) { + controller.text = schedule.name; + model.usePreset(schedule); } } ), diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index 33a0fd5e7..a7ee06f21 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -75,7 +75,7 @@ class NavigationDrawer extends StatelessWidget { ListTile( title: Text("Custom schedules"), leading: Icon(Icons.schedule), - onTap: pushRoute(context, Routes.specials), + onTap: pushRoute(context, Routes.schedules), ), ], if (isSportsAdmin) diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index dba200aae..ecfdca5fc 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -77,8 +77,8 @@ class ResponsiveSchedule extends NavigationItem { title: const Text ("Schedule"), trailing: DropdownButton ( value: model.day.schedule, - onChanged: (Schedule? special) => model.update( - newSpecial: special, + onChanged: (Schedule? schedule) => model.update( + newSchedule: schedule, onInvalidSchedule: () => handleInvalidSchedule(context), ), items: [ From 830452c093225068e7faf372d3e2c32ce97a6666 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 15 Apr 2021 01:59:43 -0400 Subject: [PATCH 146/251] Fixed web.manifest.json --- web/manifest.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/web/manifest.json b/web/manifest.json index 6fb81a6d5..0013270ec 100644 --- a/web/manifest.json +++ b/web/manifest.json @@ -13,13 +13,19 @@ "src": "icons/Icon-192.png", "sizes": "192x192", "type": "image/png", - "purpose": "maskable", + "purpose": "any" + }, + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" }, { "src": "icons/Icon-512.png", "sizes": "512x512", "type": "image/png", - "purpose": "maskable", + "purpose": "maskable" } ] } From 68acc5ea71cc9dabb17062b2eb981beeed3fddc6 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 16 Apr 2021 04:16:26 -0400 Subject: [PATCH 147/251] Auto-generate documentation --- .github/workflows/documentation.yml | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 .github/workflows/documentation.yml diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 000000000..2c0f9adeb --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,47 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Dart + +on: + push: + branches: [ documentation ] + +jobs: + documentation: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: dart-lang/setup-dart@v1 + + - name: Install Flutter + uses: britannio/action-install-flutter@v1.0 + + - name: Install dartdoc + run: flutter pub global activate dartdoc + + - name: Install dependencies + run: flutter packages get + + - name: Debug + run: | + flutter pub global run dartdoc --version + flutter --version + + - name: Generate documentation + run: flutter pub global run dartdoc --ignore 'unresolved-doc-reference,not-implemented,no-documentable-libraries,ambiguous-reexport' --exclude 'dart:async,dart:collection,dart:convert,dart:core,dart:developer,dart:io,dart:isolate,dart:math,dart:typed_data,dart:ui,dart:html,dart:js,dart:ffi,dart:js_util' --quiet --json --output docs --no-auto-include-dependencies --no-validate-links --no-verbose-warnings --no-allow-non-local-warnings + + - name: Commit files + run: | + git config --local user.name "github-actions[bot]" + git stage --force docs + git commit -a -m "Generated documentation" + + - name: Push commit + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: documentation + From 3827d11cceba678d148db1a86bb3ea77739271e1 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 16 Apr 2021 04:17:05 -0400 Subject: [PATCH 148/251] Update documentation.yml --- .github/workflows/documentation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 2c0f9adeb..001ea847c 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -7,7 +7,7 @@ name: Dart on: push: - branches: [ documentation ] + branches: [ master ] jobs: documentation: From 30b1244c82d7a66f01f0eb99df1a3ddc1d67b3be Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 16 Apr 2021 08:20:54 +0000 Subject: [PATCH 149/251] Generated documentation --- docs/__404error.html | 109 ++ docs/app/RamLife-class.html | 417 +++++++ docs/app/RamLife/RamLife.html | 149 +++ docs/app/RamLife/build.html | 270 +++++ docs/app/RamLife/hasAdminScope.html | 154 +++ docs/app/RamLife/routes.html | 181 +++ docs/app/app-library.html | 145 +++ docs/categories.json | 1 + docs/constants/DayComparison.html | 167 +++ docs/constants/DayComparison/isSameDay.html | 134 +++ docs/constants/RamazColors-class.html | 346 ++++++ docs/constants/RamazColors/RamazColors.html | 136 +++ docs/constants/RamazColors/blue-constant.html | 146 +++ .../RamazColors/blueDark-constant.html | 146 +++ .../RamazColors/blueLight-constant.html | 146 +++ docs/constants/RamazColors/gold-constant.html | 146 +++ .../RamazColors/goldDark-constant.html | 146 +++ .../RamazColors/goldLight-constant.html | 146 +++ docs/constants/RamazColors/hashCode.html | 175 +++ docs/constants/RamazColors/noSuchMethod.html | 183 +++ .../RamazColors/operator_equals.html | 174 +++ docs/constants/RamazColors/runtimeType.html | 150 +++ docs/constants/RamazColors/toString.html | 156 +++ docs/constants/TimeConverter.html | 167 +++ docs/constants/TimeConverter/asTime.html | 135 +++ docs/constants/TimeOfDayConverter.html | 169 +++ .../TimeOfDayConverter/asTimeOfDay.html | 135 +++ docs/constants/Times-class.html | 343 ++++++ docs/constants/Times/Times.html | 136 +++ docs/constants/Times/hashCode.html | 175 +++ docs/constants/Times/noSuchMethod.html | 183 +++ docs/constants/Times/operator_equals.html | 174 +++ docs/constants/Times/runtimeType.html | 150 +++ docs/constants/Times/schoolEnd-constant.html | 146 +++ .../constants/Times/schoolStart-constant.html | 146 +++ docs/constants/Times/toString.html | 156 +++ .../Times/winterFridayDayEnd-constant.html | 146 +++ .../Times/winterFridayDayStart-constant.html | 146 +++ .../Times/winterFridayMonthEnd-constant.html | 146 +++ .../winterFridayMonthStart-constant.html | 146 +++ docs/constants/Urls-class.html | 343 ++++++ docs/constants/Urls/Urls.html | 136 +++ docs/constants/Urls/email-constant.html | 146 +++ docs/constants/Urls/googleDrive-constant.html | 146 +++ docs/constants/Urls/hashCode.html | 175 +++ docs/constants/Urls/noSuchMethod.html | 183 +++ docs/constants/Urls/operator_equals.html | 174 +++ docs/constants/Urls/ramaz-constant.html | 146 +++ docs/constants/Urls/runtimeType.html | 150 +++ docs/constants/Urls/schoology-constant.html | 146 +++ .../Urls/seniorSystems-constant.html | 146 +++ .../Urls/sportsLivestream-constant.html | 146 +++ docs/constants/Urls/toString.html | 156 +++ docs/constants/constants-library.html | 200 ++++ docs/data/Activity-class.html | 361 ++++++ docs/data/Activity/Activity.fromJson.html | 151 +++ docs/data/Activity/Activity.grade.html | 146 +++ docs/data/Activity/Activity.html | 148 +++ docs/data/Activity/getActivities.html | 157 +++ docs/data/Activity/hashCode.html | 175 +++ docs/data/Activity/message.html | 148 +++ docs/data/Activity/noSuchMethod.html | 183 +++ docs/data/Activity/operator_equals.html | 174 +++ docs/data/Activity/runtimeType.html | 150 +++ docs/data/Activity/toJson.html | 148 +++ docs/data/Activity/toString.html | 170 +++ docs/data/Activity/type.html | 146 +++ docs/data/ActivityType-class.html | 357 ++++++ docs/data/ActivityType/hashCode.html | 171 +++ docs/data/ActivityType/noSuchMethod.html | 179 +++ docs/data/ActivityType/operator_equals.html | 170 +++ docs/data/ActivityType/runtimeType.html | 146 +++ docs/data/ActivityType/toString.html | 149 +++ docs/data/AdminScope-class.html | 338 ++++++ docs/data/AdminScope/hashCode.html | 170 +++ docs/data/AdminScope/noSuchMethod.html | 178 +++ docs/data/AdminScope/operator_equals.html | 169 +++ docs/data/AdminScope/runtimeType.html | 145 +++ docs/data/AdminScope/toString.html | 148 +++ docs/data/Advisory-class.html | 318 ++++++ docs/data/Advisory/Advisory.fromJson.html | 143 +++ docs/data/Advisory/Advisory.html | 144 +++ docs/data/Advisory/hashCode.html | 171 +++ docs/data/Advisory/id.html | 142 +++ docs/data/Advisory/noSuchMethod.html | 179 +++ docs/data/Advisory/operator_equals.html | 170 +++ docs/data/Advisory/room.html | 142 +++ docs/data/Advisory/runtimeType.html | 146 +++ docs/data/Advisory/toString.html | 152 +++ docs/data/Club-class.html | 400 +++++++ docs/data/Club/Club.html | 164 +++ docs/data/Club/attendance.html | 147 +++ docs/data/Club/captains.html | 147 +++ docs/data/Club/description.html | 147 +++ docs/data/Club/facultyAdvisor.html | 147 +++ docs/data/Club/formUrl.html | 147 +++ docs/data/Club/hashCode.html | 179 +++ docs/data/Club/image.html | 147 +++ docs/data/Club/members.html | 147 +++ docs/data/Club/messages.html | 147 +++ docs/data/Club/name.html | 147 +++ docs/data/Club/noSuchMethod.html | 187 +++ docs/data/Club/operator_equals.html | 178 +++ docs/data/Club/phoneNumberRequested.html | 147 +++ docs/data/Club/runtimeType.html | 154 +++ docs/data/Club/shortDescription.html | 147 +++ docs/data/Club/toString.html | 160 +++ docs/data/Day-class.html | 406 +++++++ docs/data/Day/Day.fromJson.html | 162 +++ docs/data/Day/Day.html | 151 +++ docs/data/Day/displayName.html | 154 +++ docs/data/Day/getCalendar.html | 160 +++ docs/data/Day/getCurrentPeriod.html | 168 +++ docs/data/Day/getDate.html | 154 +++ docs/data/Day/hashCode.html | 180 +++ docs/data/Day/n.html | 158 +++ docs/data/Day/name.html | 150 +++ docs/data/Day/noSuchMethod.html | 186 +++ docs/data/Day/operator_equals.html | 186 +++ docs/data/Day/runtimeType.html | 153 +++ docs/data/Day/schedule.html | 150 +++ docs/data/Day/toJson.html | 154 +++ docs/data/Day/toString.html | 166 +++ docs/data/Feedback-class.html | 346 ++++++ docs/data/Feedback/Feedback.html | 157 +++ docs/data/Feedback/anonymous.html | 145 +++ docs/data/Feedback/email.html | 145 +++ docs/data/Feedback/hashCode.html | 174 +++ docs/data/Feedback/message.html | 145 +++ docs/data/Feedback/name.html | 145 +++ docs/data/Feedback/noSuchMethod.html | 182 +++ docs/data/Feedback/operator_equals.html | 173 +++ docs/data/Feedback/runtimeType.html | 149 +++ docs/data/Feedback/timestamp.html | 145 +++ docs/data/Feedback/toJson.html | 153 +++ docs/data/Feedback/toString.html | 155 +++ docs/data/Grade-class.html | 357 ++++++ docs/data/Grade/hashCode.html | 171 +++ docs/data/Grade/noSuchMethod.html | 179 +++ docs/data/Grade/operator_equals.html | 170 +++ docs/data/Grade/runtimeType.html | 146 +++ docs/data/Grade/toString.html | 149 +++ docs/data/GradeActivity-class.html | 340 ++++++ .../GradeActivity/GradeActivity.fromJson.html | 148 +++ docs/data/GradeActivity/GradeActivity.html | 150 +++ docs/data/GradeActivity/freshmen.html | 144 +++ docs/data/GradeActivity/hashCode.html | 173 +++ docs/data/GradeActivity/juniors.html | 144 +++ docs/data/GradeActivity/noSuchMethod.html | 181 +++ docs/data/GradeActivity/operator_equals.html | 172 +++ docs/data/GradeActivity/runtimeType.html | 148 +++ docs/data/GradeActivity/seniors.html | 144 +++ docs/data/GradeActivity/sophomores.html | 144 +++ docs/data/GradeActivity/toString.html | 165 +++ docs/data/Message-class.html | 304 +++++ docs/data/Message/Message.html | 143 +++ docs/data/Message/body.html | 139 +++ docs/data/Message/hashCode.html | 171 +++ docs/data/Message/noSuchMethod.html | 179 +++ docs/data/Message/operator_equals.html | 170 +++ docs/data/Message/runtimeType.html | 146 +++ docs/data/Message/sender.html | 139 +++ docs/data/Message/timestamp.html | 139 +++ docs/data/Message/toString.html | 152 +++ docs/data/Period-class.html | 430 +++++++ docs/data/Period/Period.fromJson.html | 155 +++ docs/data/Period/Period.html | 157 +++ docs/data/Period/Period.raw.html | 157 +++ docs/data/Period/activity.html | 151 +++ docs/data/Period/copyWith.html | 164 +++ docs/data/Period/data.html | 152 +++ docs/data/Period/getInfo.html | 168 +++ docs/data/Period/getName.html | 166 +++ docs/data/Period/hashCode.html | 182 +++ docs/data/Period/id.html | 157 +++ docs/data/Period/isFree.html | 156 +++ docs/data/Period/name.html | 154 +++ docs/data/Period/noSuchMethod.html | 188 +++ docs/data/Period/operator_equals.html | 189 +++ docs/data/Period/runtimeType.html | 155 +++ docs/data/Period/time.html | 151 +++ docs/data/Period/toJson.html | 157 +++ docs/data/Period/toString.html | 159 +++ docs/data/PeriodData-class.html | 339 ++++++ docs/data/PeriodData/PeriodData.fromJson.html | 146 +++ docs/data/PeriodData/PeriodData.html | 147 +++ docs/data/PeriodData/getList.html | 154 +++ docs/data/PeriodData/hashCode.html | 175 +++ docs/data/PeriodData/id.html | 145 +++ docs/data/PeriodData/noSuchMethod.html | 181 +++ docs/data/PeriodData/operator_equals.html | 181 +++ docs/data/PeriodData/room.html | 144 +++ docs/data/PeriodData/runtimeType.html | 148 +++ docs/data/PeriodData/toString.html | 161 +++ docs/data/PeriodReminderTime-class.html | 382 +++++++ .../PeriodReminderTime.fromJson.html | 151 +++ .../PeriodReminderTime.html | 152 +++ docs/data/PeriodReminderTime/dayName.html | 147 +++ docs/data/PeriodReminderTime/doesApply.html | 162 +++ docs/data/PeriodReminderTime/hash.html | 150 +++ docs/data/PeriodReminderTime/period.html | 147 +++ docs/data/PeriodReminderTime/toJson.html | 160 +++ docs/data/PeriodReminderTime/toString.html | 157 +++ docs/data/Range-class.html | 379 ++++++ docs/data/Range/Range.fromJson.html | 150 +++ docs/data/Range/Range.html | 146 +++ docs/data/Range/Range.nums.html | 155 +++ docs/data/Range/contains.html | 150 +++ docs/data/Range/end.html | 147 +++ docs/data/Range/hashCode.html | 177 +++ docs/data/Range/noSuchMethod.html | 184 +++ docs/data/Range/operator_equals.html | 182 +++ docs/data/Range/operator_greater.html | 154 +++ docs/data/Range/operator_less.html | 154 +++ docs/data/Range/runtimeType.html | 151 +++ docs/data/Range/start.html | 147 +++ docs/data/Range/toJson.html | 152 +++ docs/data/Range/toString.html | 163 +++ docs/data/Reminder-class.html | 376 ++++++ docs/data/Reminder/Reminder.fromJson.html | 149 +++ docs/data/Reminder/Reminder.html | 149 +++ docs/data/Reminder/fromList.html | 154 +++ docs/data/Reminder/getReminders.html | 167 +++ docs/data/Reminder/hash.html | 149 +++ docs/data/Reminder/hashCode.html | 176 +++ docs/data/Reminder/message.html | 147 +++ docs/data/Reminder/noSuchMethod.html | 184 +++ docs/data/Reminder/operator_equals.html | 175 +++ docs/data/Reminder/runtimeType.html | 151 +++ docs/data/Reminder/time.html | 147 +++ docs/data/Reminder/toJson.html | 153 +++ docs/data/Reminder/toString.html | 163 +++ docs/data/ReminderTime-class.html | 370 ++++++ .../ReminderTime/ReminderTime.fromJson.html | 164 +++ .../ReminderTime/ReminderTime.fromType.html | 167 +++ docs/data/ReminderTime/ReminderTime.html | 148 +++ docs/data/ReminderTime/doesApply.html | 156 +++ docs/data/ReminderTime/hash.html | 148 +++ docs/data/ReminderTime/hashCode.html | 175 +++ docs/data/ReminderTime/noSuchMethod.html | 183 +++ docs/data/ReminderTime/operator_equals.html | 174 +++ docs/data/ReminderTime/repeats.html | 146 +++ docs/data/ReminderTime/runtimeType.html | 150 +++ docs/data/ReminderTime/toJson.html | 148 +++ docs/data/ReminderTime/toString.html | 155 +++ docs/data/ReminderTime/type.html | 147 +++ docs/data/ReminderTimeType-class.html | 323 ++++++ docs/data/ReminderTimeType/hashCode.html | 169 +++ docs/data/ReminderTimeType/noSuchMethod.html | 177 +++ .../ReminderTimeType/operator_equals.html | 168 +++ docs/data/ReminderTimeType/runtimeType.html | 144 +++ docs/data/ReminderTimeType/toString.html | 147 +++ docs/data/Schedule-class.html | 539 +++++++++ docs/data/Schedule/Schedule.fromJson.html | 166 +++ docs/data/Schedule/Schedule.html | 160 +++ docs/data/Schedule/amAssembly-constant.html | 175 +++ docs/data/Schedule/covid-constant.html | 172 +++ docs/data/Schedule/early-constant.html | 175 +++ docs/data/Schedule/fastDay-constant.html | 171 +++ docs/data/Schedule/friday-constant.html | 170 +++ .../Schedule/fridayRoshChodesh-constant.html | 170 +++ docs/data/Schedule/getWinterFriday.html | 184 +++ docs/data/Schedule/hashCode.html | 189 +++ docs/data/Schedule/name.html | 158 +++ docs/data/Schedule/noSuchMethod.html | 195 ++++ docs/data/Schedule/operator_equals.html | 194 ++++ docs/data/Schedule/periods.html | 158 +++ docs/data/Schedule/pmAssembly-constant.html | 174 +++ docs/data/Schedule/roshChodesh-constant.html | 175 +++ docs/data/Schedule/runtimeType.html | 162 +++ docs/data/Schedule/schedules.html | 167 +++ docs/data/Schedule/toJson.html | 166 +++ docs/data/Schedule/toString.html | 175 +++ docs/data/Schedule/winterFriday-constant.html | 170 +++ .../winterFridayRoshChodesh-constant.html | 170 +++ docs/data/Scores-class.html | 381 +++++++ docs/data/Scores/Scores.fromJson.html | 157 +++ docs/data/Scores/Scores.html | 151 +++ docs/data/Scores/didDraw.html | 152 +++ docs/data/Scores/didWin.html | 152 +++ docs/data/Scores/getScore.html | 151 +++ docs/data/Scores/hashCode.html | 176 +++ docs/data/Scores/isHome.html | 148 +++ docs/data/Scores/noSuchMethod.html | 184 +++ docs/data/Scores/operator_equals.html | 175 +++ docs/data/Scores/otherScore.html | 147 +++ docs/data/Scores/ramazScore.html | 147 +++ docs/data/Scores/runtimeType.html | 151 +++ docs/data/Scores/toJson.html | 155 +++ docs/data/Scores/toString.html | 164 +++ docs/data/Sport-class.html | 385 +++++++ docs/data/Sport/hashCode.html | 173 +++ docs/data/Sport/noSuchMethod.html | 181 +++ docs/data/Sport/operator_equals.html | 172 +++ docs/data/Sport/runtimeType.html | 148 +++ docs/data/Sport/toString.html | 151 +++ docs/data/SportsGame-class.html | 500 ++++++++ docs/data/SportsGame/SportsGame.fromJson.html | 174 +++ docs/data/SportsGame/SportsGame.html | 169 +++ docs/data/SportsGame/awayTeam.html | 162 +++ docs/data/SportsGame/capitalize.html | 163 +++ docs/data/SportsGame/date.html | 158 +++ docs/data/SportsGame/dateTime.html | 169 +++ docs/data/SportsGame/description.html | 162 +++ docs/data/SportsGame/fromList.html | 166 +++ docs/data/SportsGame/getJsonList.html | 163 +++ docs/data/SportsGame/hashCode.html | 188 +++ docs/data/SportsGame/homeTeam.html | 162 +++ docs/data/SportsGame/isHome.html | 158 +++ docs/data/SportsGame/noSuchMethod.html | 194 ++++ docs/data/SportsGame/operator_equals.html | 198 ++++ docs/data/SportsGame/opponent.html | 157 +++ docs/data/SportsGame/replaceScores.html | 169 +++ docs/data/SportsGame/runtimeType.html | 161 +++ docs/data/SportsGame/scores.html | 159 +++ docs/data/SportsGame/sport.html | 157 +++ docs/data/SportsGame/team.html | 158 +++ docs/data/SportsGame/times.html | 158 +++ docs/data/SportsGame/toJson.html | 169 +++ docs/data/SportsGame/toString.html | 167 +++ docs/data/Subject-class.html | 352 ++++++ docs/data/Subject/Subject.fromJson.html | 147 +++ docs/data/Subject/Subject.html | 149 +++ docs/data/Subject/getSubjects.html | 158 +++ docs/data/Subject/hashCode.html | 176 +++ docs/data/Subject/name.html | 145 +++ docs/data/Subject/noSuchMethod.html | 182 +++ docs/data/Subject/operator_equals.html | 182 +++ docs/data/Subject/runtimeType.html | 149 +++ docs/data/Subject/teacher.html | 145 +++ docs/data/Subject/toString.html | 162 +++ docs/data/Subject/virtualLink.html | 145 +++ docs/data/SubjectReminderTime-class.html | 371 ++++++ .../SubjectReminderTime.fromJson.html | 147 +++ .../SubjectReminderTime.html | 148 +++ docs/data/SubjectReminderTime/doesApply.html | 162 +++ docs/data/SubjectReminderTime/hash.html | 149 +++ docs/data/SubjectReminderTime/name.html | 146 +++ docs/data/SubjectReminderTime/toJson.html | 158 +++ docs/data/SubjectReminderTime/toString.html | 155 +++ docs/data/Time-class.html | 399 +++++++ docs/data/Time/Time.fromDateTime.html | 148 +++ docs/data/Time/Time.fromJson.html | 149 +++ docs/data/Time/Time.html | 147 +++ docs/data/Time/hashCode.html | 179 +++ docs/data/Time/hour.html | 148 +++ docs/data/Time/minutes.html | 148 +++ docs/data/Time/noSuchMethod.html | 185 +++ docs/data/Time/operator_equals.html | 185 +++ docs/data/Time/operator_greater.html | 152 +++ docs/data/Time/operator_greater_equal.html | 151 +++ docs/data/Time/operator_less.html | 152 +++ docs/data/Time/operator_less_equal.html | 151 +++ docs/data/Time/runtimeType.html | 152 +++ docs/data/Time/toJson.html | 153 +++ docs/data/Time/toString.html | 166 +++ docs/data/User-class.html | 412 +++++++ docs/data/User/User.fromJson.html | 161 +++ docs/data/User/User.html | 160 +++ docs/data/User/advisory.html | 150 +++ docs/data/User/contactInfo.html | 150 +++ docs/data/User/dayNames.html | 151 +++ docs/data/User/getPeriods.html | 161 +++ docs/data/User/grade.html | 151 +++ docs/data/User/hashCode.html | 179 +++ docs/data/User/noSuchMethod.html | 187 +++ docs/data/User/operator_equals.html | 178 +++ docs/data/User/registeredClubs.html | 151 +++ docs/data/User/runtimeType.html | 154 +++ docs/data/User/safeJson.html | 162 +++ docs/data/User/schedule.html | 154 +++ docs/data/User/sectionIDs.html | 161 +++ docs/data/User/toString.html | 160 +++ docs/data/activityTypeToString.html | 172 +++ docs/data/adminScopeToString.html | 171 +++ docs/data/data-library.html | 525 +++++++++ docs/data/intToGrade.html | 168 +++ docs/data/parseActivityType.html | 173 +++ docs/data/parseAdminScope.html | 172 +++ docs/data/reminderTimeToString-constant.html | 166 +++ docs/data/sportToString.html | 168 +++ docs/data/stringToReminderTime-constant.html | 166 +++ docs/data/stringToSport-constant.html | 171 +++ .../generated_plugin_registrant-library.html | 150 +++ .../registerPlugins.html | 134 +++ docs/index.html | 271 +++++ docs/index.json | 1 + docs/main/main-library.html | 150 +++ docs/main/main.html | 124 ++ docs/models/AdminScheduleModel-class.html | 399 +++++++ .../AdminScheduleModel.html | 139 +++ .../AdminScheduleModel/createSchedule.html | 152 +++ .../AdminScheduleModel/deleteSchedule.html | 154 +++ .../AdminScheduleModel/jsonSchedules.html | 154 +++ .../AdminScheduleModel/saveSchedules.html | 152 +++ docs/models/AdminScheduleModel/schedules.html | 146 +++ docs/models/CalendarDay-class.html | 272 +++++ docs/models/CalendarDay/CalendarDay.html | 137 +++ docs/models/CalendarDay/date.html | 138 +++ docs/models/CalendarDay/hashCode.html | 170 +++ docs/models/CalendarDay/noSuchMethod.html | 178 +++ docs/models/CalendarDay/operator_equals.html | 169 +++ docs/models/CalendarDay/runtimeType.html | 145 +++ docs/models/CalendarDay/schoolDay.html | 138 +++ docs/models/CalendarDay/toString.html | 151 +++ docs/models/CalendarEditor-class.html | 470 ++++++++ .../models/CalendarEditor/CalendarEditor.html | 145 +++ docs/models/CalendarEditor/calendar.html | 156 +++ docs/models/CalendarEditor/currentMonth.html | 155 +++ docs/models/CalendarEditor/currentYear.html | 155 +++ docs/models/CalendarEditor/daysInMonth.html | 155 +++ docs/models/CalendarEditor/dispose.html | 172 +++ docs/models/CalendarEditor/layoutMonth.html | 186 +++ docs/models/CalendarEditor/loadMonth.html | 168 +++ docs/models/CalendarEditor/now.html | 155 +++ docs/models/CalendarEditor/subscriptions.html | 155 +++ docs/models/CalendarEditor/updateDay.html | 174 +++ docs/models/CalendarEditor/years.html | 163 +++ docs/models/DayBuilderModel-class.html | 408 +++++++ .../DayBuilderModel/DayBuilderModel.html | 152 +++ docs/models/DayBuilderModel/date.html | 147 +++ docs/models/DayBuilderModel/day.html | 158 +++ docs/models/DayBuilderModel/hasSchool.html | 178 +++ docs/models/DayBuilderModel/name.html | 178 +++ docs/models/DayBuilderModel/ready.html | 155 +++ docs/models/DayBuilderModel/schedule.html | 181 +++ docs/models/FeedbackModel-class.html | 386 +++++++ docs/models/FeedbackModel/FeedbackModel.html | 138 +++ docs/models/FeedbackModel/anonymous.html | 176 +++ docs/models/FeedbackModel/message.html | 176 +++ docs/models/FeedbackModel/ready.html | 154 +++ docs/models/FeedbackModel/send.html | 163 +++ docs/models/HomeModel-class.html | 358 ++++++ docs/models/HomeModel/HomeModel.html | 145 +++ docs/models/HomeModel/dispose.html | 161 +++ docs/models/HomeModel/refresh.html | 160 +++ docs/models/Models-class.html | 423 +++++++ docs/models/Models/Models.html | 142 +++ docs/models/Models/dispose.html | 177 +++ docs/models/Models/init.html | 175 +++ docs/models/Models/instance.html | 152 +++ docs/models/Models/isReady.html | 152 +++ docs/models/Models/reminders.html | 157 +++ docs/models/Models/schedule.html | 157 +++ docs/models/Models/sports.html | 157 +++ docs/models/Models/user.html | 157 +++ docs/models/Reminders-class.html | 510 +++++++++ docs/models/Reminders/Reminders.html | 148 +++ docs/models/Reminders/addReminder.html | 168 +++ docs/models/Reminders/cleanReminders.html | 171 +++ docs/models/Reminders/currentReminders.html | 159 +++ docs/models/Reminders/deleteReminder.html | 167 +++ docs/models/Reminders/getReminders.html | 174 +++ docs/models/Reminders/hasNextReminder.html | 163 +++ docs/models/Reminders/hasReminder.html | 163 +++ docs/models/Reminders/init.html | 172 +++ docs/models/Reminders/markShown.html | 169 +++ docs/models/Reminders/nextReminders.html | 159 +++ docs/models/Reminders/readReminders.html | 159 +++ docs/models/Reminders/reminders.html | 158 +++ docs/models/Reminders/replaceReminder.html | 171 +++ docs/models/Reminders/verifyReminders.html | 175 +++ docs/models/RemindersBuilderModel-class.html | 554 +++++++++ .../RemindersBuilderModel.html | 189 +++ docs/models/RemindersBuilderModel/build.html | 172 +++ .../RemindersBuilderModel/changeCourse.html | 168 +++ .../RemindersBuilderModel/changeDay.html | 169 +++ .../RemindersBuilderModel/changePeriod.html | 168 +++ docs/models/RemindersBuilderModel/course.html | 162 +++ .../models/RemindersBuilderModel/courses.html | 161 +++ .../models/RemindersBuilderModel/dayName.html | 161 +++ .../models/RemindersBuilderModel/message.html | 161 +++ .../onMessageChanged.html | 168 +++ docs/models/RemindersBuilderModel/period.html | 162 +++ .../models/RemindersBuilderModel/periods.html | 176 +++ docs/models/RemindersBuilderModel/ready.html | 184 +++ .../RemindersBuilderModel/shouldRepeat.html | 163 +++ docs/models/RemindersBuilderModel/time.html | 161 +++ .../RemindersBuilderModel/toggleRepeat.html | 168 +++ .../toggleRepeatType.html | 167 +++ docs/models/RemindersBuilderModel/type.html | 161 +++ docs/models/ScheduleBuilderModel-class.html | 436 +++++++ .../ScheduleBuilderModel.html | 149 +++ docs/models/ScheduleBuilderModel/name.html | 181 +++ .../ScheduleBuilderModel/numPeriods.html | 201 ++++ docs/models/ScheduleBuilderModel/periods.html | 153 +++ docs/models/ScheduleBuilderModel/preset.html | 152 +++ docs/models/ScheduleBuilderModel/ready.html | 160 +++ .../ScheduleBuilderModel/replaceTime.html | 162 +++ .../models/ScheduleBuilderModel/schedule.html | 157 +++ .../ScheduleBuilderModel/usePreset.html | 165 +++ docs/models/ScheduleModel-class.html | 633 ++++++++++ docs/models/ScheduleModel/ScheduleModel.html | 159 +++ docs/models/ScheduleModel/calendar.html | 169 +++ docs/models/ScheduleModel/dispose.html | 185 +++ docs/models/ScheduleModel/hasSchool.html | 174 +++ docs/models/ScheduleModel/init.html | 184 +++ docs/models/ScheduleModel/initCalendar.html | 179 +++ .../models/ScheduleModel/isValidReminder.html | 188 +++ docs/models/ScheduleModel/nextPeriod.html | 169 +++ docs/models/ScheduleModel/nextSubject.html | 174 +++ docs/models/ScheduleModel/now.html | 170 +++ docs/models/ScheduleModel/onNewPeriod.html | 211 ++++ docs/models/ScheduleModel/period.html | 169 +++ docs/models/ScheduleModel/periodIndex.html | 169 +++ docs/models/ScheduleModel/periods.html | 169 +++ docs/models/ScheduleModel/reminders.html | 169 +++ .../ScheduleModel/remindersListener.html | 172 +++ .../ScheduleModel/scheduleReminders.html | 205 ++++ docs/models/ScheduleModel/setToday.html | 189 +++ docs/models/ScheduleModel/subject.html | 174 +++ docs/models/ScheduleModel/subjects.html | 169 +++ docs/models/ScheduleModel/timer.html | 171 +++ .../ScheduleModel/timerInterval-constant.html | 169 +++ docs/models/ScheduleModel/today.html | 169 +++ .../models/ScheduleModel/updateReminders.html | 196 ++++ docs/models/ScheduleModel/user.html | 169 +++ docs/models/ScheduleViewModel-class.html | 417 +++++++ .../ScheduleViewModel/ScheduleViewModel.html | 157 +++ docs/models/ScheduleViewModel/dataModel.html | 152 +++ docs/models/ScheduleViewModel/date.html | 194 ++++ docs/models/ScheduleViewModel/day.html | 151 +++ .../ScheduleViewModel/defatulSchedule.html | 156 +++ docs/models/ScheduleViewModel/defaultDay.html | 151 +++ docs/models/ScheduleViewModel/update.html | 177 +++ docs/models/SortOption-class.html | 303 +++++ docs/models/SortOption/hashCode.html | 169 +++ docs/models/SortOption/noSuchMethod.html | 177 +++ docs/models/SortOption/operator_equals.html | 168 +++ docs/models/SortOption/runtimeType.html | 144 +++ docs/models/SortOption/toString.html | 147 +++ docs/models/Sports-class.html | 457 ++++++++ docs/models/Sports/Sports.html | 144 +++ docs/models/Sports/addGame.html | 163 +++ docs/models/Sports/delete.html | 160 +++ docs/models/Sports/games.html | 154 +++ docs/models/Sports/getTodayGames.html | 161 +++ docs/models/Sports/init.html | 167 +++ docs/models/Sports/now.html | 154 +++ docs/models/Sports/replace.html | 166 +++ docs/models/Sports/saveGames.html | 158 +++ docs/models/Sports/timer.html | 154 +++ docs/models/Sports/todayGames.html | 154 +++ docs/models/SportsBuilderModel-class.html | 468 ++++++++ .../SportsBuilderModel.html | 163 +++ docs/models/SportsBuilderModel/away.html | 184 +++ docs/models/SportsBuilderModel/date.html | 184 +++ docs/models/SportsBuilderModel/end.html | 184 +++ docs/models/SportsBuilderModel/game.html | 168 +++ docs/models/SportsBuilderModel/loading.html | 183 +++ docs/models/SportsBuilderModel/opponent.html | 184 +++ docs/models/SportsBuilderModel/ready.html | 165 +++ docs/models/SportsBuilderModel/scores.html | 185 +++ docs/models/SportsBuilderModel/sport.html | 184 +++ docs/models/SportsBuilderModel/start.html | 184 +++ docs/models/SportsBuilderModel/team.html | 184 +++ docs/models/SportsModel-class.html | 519 +++++++++ docs/models/SportsModel/SportsModel.html | 165 +++ docs/models/SportsModel/adminFunc.html | 167 +++ docs/models/SportsModel/data.html | 158 +++ docs/models/SportsModel/dispose.html | 173 +++ docs/models/SportsModel/divideGames.html | 169 +++ docs/models/SportsModel/isAdmin.html | 159 +++ docs/models/SportsModel/loading.html | 186 +++ docs/models/SportsModel/recentBySport.html | 159 +++ docs/models/SportsModel/recents.html | 158 +++ docs/models/SportsModel/setup.html | 164 +++ docs/models/SportsModel/sortByDate.html | 164 +++ docs/models/SportsModel/sortBySport.html | 177 +++ docs/models/SportsModel/sortGames.html | 170 +++ docs/models/SportsModel/sortOption.html | 187 +++ docs/models/SportsModel/upcoming.html | 158 +++ docs/models/SportsModel/upcomingBySport.html | 159 +++ docs/models/UserModel-class.html | 389 +++++++ docs/models/UserModel/UserModel.html | 139 +++ docs/models/UserModel/adminScopes.html | 149 +++ docs/models/UserModel/data.html | 149 +++ docs/models/UserModel/init.html | 168 +++ docs/models/UserModel/isAdmin.html | 156 +++ docs/models/UserModel/subjects.html | 151 +++ docs/models/models-library.html | 321 ++++++ docs/pages/AdminCalendarPage-class.html | 406 +++++++ .../AdminCalendarPage/AdminCalendarPage.html | 142 +++ docs/pages/AdminCalendarPage/createState.html | 168 +++ docs/pages/AdminCalendarState-class.html | 558 +++++++++ .../AdminCalendarState.html | 150 +++ docs/pages/AdminCalendarState/build.html | 326 ++++++ .../AdminCalendarState/currentMonth.html | 186 +++ docs/pages/AdminCalendarState/dispose.html | 198 ++++ docs/pages/AdminCalendarState/initState.html | 196 ++++ docs/pages/AdminCalendarState/listener.html | 159 +++ docs/pages/AdminCalendarState/loopMonth.html | 168 +++ docs/pages/AdminCalendarState/model.html | 157 +++ .../AdminCalendarState/months-constant.html | 165 +++ .../AdminCalendarState/weekdays-constant.html | 163 +++ docs/pages/AdminSchedulesPage-class.html | 406 +++++++ .../AdminSchedulesPage.html | 142 +++ docs/pages/AdminSchedulesPage/build.html | 231 ++++ docs/pages/DayBuilder-class.html | 446 ++++++++ docs/pages/DayBuilder/DayBuilder.html | 157 +++ docs/pages/DayBuilder/build.html | 272 +++++ docs/pages/DayBuilder/date.html | 148 +++ docs/pages/DayBuilder/day.html | 151 +++ docs/pages/DayBuilder/upload.html | 148 +++ docs/pages/FeedbackPage-class.html | 406 +++++++ docs/pages/FeedbackPage/FeedbackPage.html | 142 +++ docs/pages/FeedbackPage/build.html | 232 ++++ docs/pages/FormRow-class.html | 462 ++++++++ docs/pages/FormRow/FormRow.editable.html | 176 +++ docs/pages/FormRow/FormRow.html | 154 +++ docs/pages/FormRow/build.html | 213 ++++ docs/pages/FormRow/moreSpace.html | 157 +++ docs/pages/FormRow/picker.html | 153 +++ docs/pages/FormRow/sized.html | 153 +++ docs/pages/FormRow/title.html | 153 +++ docs/pages/GenericSportsView-class.html | 469 ++++++++ .../GenericSportsView/GenericSportsView.html | 164 +++ docs/pages/GenericSportsView/build.html | 209 ++++ docs/pages/GenericSportsView/builder.html | 153 +++ docs/pages/GenericSportsView/loading.html | 153 +++ docs/pages/GenericSportsView/onRefresh.html | 153 +++ docs/pages/GenericSportsView/recents.html | 155 +++ docs/pages/GenericSportsView/upcoming.html | 155 +++ docs/pages/HomePage-class.html | 415 +++++++ docs/pages/HomePage/HomePage.html | 144 +++ docs/pages/HomePage/createState.html | 169 +++ docs/pages/HomePage/pageIndex.html | 146 +++ docs/pages/HomePageState-class.html | 491 ++++++++ docs/pages/HomePageState/HomePageState.html | 145 +++ docs/pages/HomePageState/build.html | 257 +++++ docs/pages/HomePageState/index.html | 152 +++ docs/pages/HomePageState/initState.html | 189 +++ docs/pages/HomePageState/navItems.html | 156 +++ docs/pages/Login-class.html | 425 +++++++ docs/pages/Login/Login.html | 147 +++ docs/pages/Login/createState.html | 169 +++ docs/pages/Login/destination.html | 149 +++ docs/pages/LoginState-class.html | 525 +++++++++ docs/pages/LoginState/LoginState.html | 147 +++ docs/pages/LoginState/build.html | 283 +++++ docs/pages/LoginState/initState.html | 194 ++++ docs/pages/LoginState/isLoading.html | 157 +++ docs/pages/LoginState/onError.html | 199 ++++ docs/pages/LoginState/safely.html | 188 +++ docs/pages/LoginState/signIn.html | 172 +++ docs/pages/NavigationDrawer-class.html | 464 ++++++++ .../NavigationDrawer/NavigationDrawer.html | 147 +++ docs/pages/NavigationDrawer/build.html | 314 +++++ docs/pages/NavigationDrawer/getRouteName.html | 154 +++ .../NavigationDrawer/isScheduleAdmin.html | 156 +++ .../pages/NavigationDrawer/isSportsAdmin.html | 156 +++ docs/pages/NavigationDrawer/pushRoute.html | 158 +++ docs/pages/OldCalendarWidget-class.html | 411 +++++++ .../OldCalendarWidget/OldCalendarWidget.html | 145 +++ docs/pages/OldCalendarWidget/build.html | 221 ++++ docs/pages/ReminderBuilder-class.html | 454 ++++++++ .../ReminderBuilder/ReminderBuilder.html | 150 +++ docs/pages/ReminderBuilder/buildReminder.html | 161 +++ docs/pages/ReminderBuilder/createState.html | 172 +++ docs/pages/ReminderBuilder/reminder.html | 154 +++ docs/pages/ReminderBuilder/trimString.html | 159 +++ docs/pages/ReminderBuilderState-class.html | 484 ++++++++ .../ReminderBuilderState.html | 144 +++ docs/pages/ReminderBuilderState/build.html | 364 ++++++ .../ReminderBuilderState/controller.html | 154 +++ .../pages/ReminderBuilderState/initState.html | 188 +++ docs/pages/ResponsiveReminders-class.html | 511 +++++++++ .../ResponsiveReminders.html | 152 +++ docs/pages/ResponsiveReminders/appBar.html | 160 +++ docs/pages/ResponsiveReminders/build.html | 217 ++++ .../floatingActionButton.html | 166 +++ docs/pages/ResponsiveReminders/model.html | 154 +++ docs/pages/ResponsiveSchedule-class.html | 539 +++++++++ .../ResponsiveSchedule.html | 154 +++ docs/pages/ResponsiveSchedule/appBar.html | 162 +++ docs/pages/ResponsiveSchedule/build.html | 250 ++++ .../floatingActionButton.html | 167 +++ .../handleInvalidSchedule.html | 165 +++ docs/pages/ResponsiveSchedule/model.html | 156 +++ docs/pages/ResponsiveSchedule/viewDay.html | 181 +++ docs/pages/RouteInitializer-class.html | 474 ++++++++ .../RouteInitializer/RouteInitializer.html | 161 +++ docs/pages/RouteInitializer/child.html | 154 +++ docs/pages/RouteInitializer/createState.html | 174 +++ docs/pages/RouteInitializer/isAllowed.html | 154 +++ docs/pages/RouteInitializer/isSignedIn.html | 157 +++ docs/pages/RouteInitializer/onError.html | 154 +++ docs/pages/RouteInitializer/onFailure.html | 154 +++ docs/pages/RouteInitializerState-class.html | 496 ++++++++ .../RouteInitializerState.html | 145 +++ docs/pages/RouteInitializerState/build.html | 259 +++++ docs/pages/RouteInitializerState/init.html | 176 +++ .../RouteInitializerState/initFuture.html | 155 +++ .../RouteInitializerState/initState.html | 189 +++ docs/pages/Routes-class.html | 398 +++++++ docs/pages/Routes/Routes.html | 138 +++ docs/pages/Routes/calendar-constant.html | 148 +++ docs/pages/Routes/feedback-constant.html | 148 +++ docs/pages/Routes/hashCode.html | 177 +++ docs/pages/Routes/home-constant.html | 148 +++ docs/pages/Routes/login-constant.html | 148 +++ docs/pages/Routes/noSuchMethod.html | 185 +++ docs/pages/Routes/operator_equals.html | 176 +++ docs/pages/Routes/reminders-constant.html | 148 +++ docs/pages/Routes/runtimeType.html | 152 +++ docs/pages/Routes/schedule-constant.html | 148 +++ docs/pages/Routes/schedules-constant.html | 148 +++ docs/pages/Routes/sports-constant.html | 148 +++ docs/pages/Routes/toString.html | 158 +++ docs/pages/ScheduleBuilder-class.html | 440 +++++++ .../ScheduleBuilder/ScheduleBuilder.html | 149 +++ docs/pages/ScheduleBuilder/buildSchedule.html | 161 +++ docs/pages/ScheduleBuilder/createState.html | 171 +++ docs/pages/ScheduleBuilder/preset.html | 151 +++ docs/pages/ScheduleBuilderState-class.html | 495 ++++++++ .../ScheduleBuilderState.html | 145 +++ docs/pages/ScheduleBuilderState/build.html | 350 ++++++ .../ScheduleBuilderState/conflicting.html | 158 +++ .../ScheduleBuilderState/controller.html | 156 +++ .../pages/ScheduleBuilderState/initState.html | 189 +++ docs/pages/SportBuilderState-class.html | 495 ++++++++ .../SportBuilderState/SportBuilderState.html | 145 +++ docs/pages/SportBuilderState/build.html | 370 ++++++ docs/pages/SportBuilderState/initState.html | 190 +++ .../SportBuilderState/opponentController.html | 155 +++ .../SportBuilderState/teamController.html | 155 +++ docs/pages/SportsBuilder-class.html | 441 +++++++ docs/pages/SportsBuilder/SportsBuilder.html | 151 +++ docs/pages/SportsBuilder/createGame.html | 162 +++ docs/pages/SportsBuilder/createState.html | 171 +++ docs/pages/SportsBuilder/parent.html | 151 +++ docs/pages/SportsPage-class.html | 406 +++++++ docs/pages/SportsPage/SportsPage.html | 142 +++ docs/pages/SportsPage/build.html | 199 ++++ docs/pages/buildAppBar.html | 195 ++++ docs/pages/getLayout.html | 198 ++++ docs/pages/openMenu.html | 243 ++++ docs/pages/pages-library.html | 410 +++++++ docs/ramaz_services/Auth-class.html | 444 ++++++++ docs/ramaz_services/Auth/Auth.html | 146 +++ docs/ramaz_services/Auth/adminScopes.html | 168 +++ docs/ramaz_services/Auth/auth.html | 156 +++ .../Auth/calendarScope-constant.html | 157 +++ docs/ramaz_services/Auth/claims.html | 163 +++ docs/ramaz_services/Auth/email.html | 162 +++ docs/ramaz_services/Auth/google.html | 156 +++ docs/ramaz_services/Auth/hashCode.html | 185 +++ docs/ramaz_services/Auth/isAdmin.html | 165 +++ docs/ramaz_services/Auth/isCalendarAdmin.html | 162 +++ docs/ramaz_services/Auth/isSignedIn.html | 161 +++ docs/ramaz_services/Auth/isSportsAdmin.html | 162 +++ docs/ramaz_services/Auth/name.html | 161 +++ docs/ramaz_services/Auth/noSuchMethod.html | 193 ++++ docs/ramaz_services/Auth/operator_equals.html | 184 +++ docs/ramaz_services/Auth/runtimeType.html | 160 +++ docs/ramaz_services/Auth/signIn.html | 172 +++ docs/ramaz_services/Auth/signOut.html | 162 +++ .../Auth/sportsScope-constant.html | 157 +++ docs/ramaz_services/Auth/toString.html | 166 +++ docs/ramaz_services/Crashlytics-class.html | 374 ++++++ .../Crashlytics/Crashlytics.html | 139 +++ .../Crashlytics/didCrashLastTime.html | 152 +++ docs/ramaz_services/Crashlytics/hashCode.html | 178 +++ docs/ramaz_services/Crashlytics/init.html | 153 +++ docs/ramaz_services/Crashlytics/instance.html | 149 +++ docs/ramaz_services/Crashlytics/log.html | 154 +++ .../Crashlytics/noSuchMethod.html | 186 +++ .../Crashlytics/operator_equals.html | 177 +++ .../Crashlytics/recordError.html | 160 +++ .../Crashlytics/recordFlutterError.html | 152 +++ .../Crashlytics/runtimeType.html | 153 +++ docs/ramaz_services/Crashlytics/setEmail.html | 154 +++ docs/ramaz_services/Crashlytics/signIn.html | 152 +++ docs/ramaz_services/Crashlytics/toString.html | 159 +++ docs/ramaz_services/Crashlytics/toggle.html | 155 +++ .../NoAccountException-class.html | 241 ++++ .../NoAccountException.html | 129 +++ .../NoAccountException/hashCode.html | 168 +++ .../NoAccountException/noSuchMethod.html | 176 +++ .../NoAccountException/operator_equals.html | 167 +++ .../NoAccountException/runtimeType.html | 143 +++ .../NoAccountException/toString.html | 149 +++ docs/ramaz_services/Notification-class.html | 311 +++++ .../Notification/Notification.html | 146 +++ .../Notification/Notification.reminder.html | 146 +++ .../ramaz_services/Notification/hashCode.html | 173 +++ .../Notification/id-constant.html | 145 +++ docs/ramaz_services/Notification/message.html | 144 +++ .../Notification/noSuchMethod.html | 181 +++ .../Notification/operator_equals.html | 172 +++ .../Notification/runtimeType.html | 148 +++ docs/ramaz_services/Notification/title.html | 144 +++ .../ramaz_services/Notification/toString.html | 154 +++ docs/ramaz_services/Notifications-class.html | 349 ++++++ .../Notifications/Notifications.html | 137 +++ .../Notifications/cancelAll.html | 149 +++ .../Notifications/hashCode.html | 176 +++ docs/ramaz_services/Notifications/init.html | 151 +++ .../Notifications/instance.html | 147 +++ .../Notifications/noSuchMethod.html | 184 +++ .../Notifications/operator_equals.html | 175 +++ .../Notifications/pendingNotifications.html | 152 +++ .../Notifications/runtimeType.html | 151 +++ .../Notifications/scheduleNotification.html | 155 +++ .../Notifications/sendNotification.html | 150 +++ docs/ramaz_services/Notifications/signIn.html | 150 +++ .../Notifications/toString.html | 157 +++ docs/ramaz_services/Preferences-class.html | 334 ++++++ .../Preferences/Preferences.html | 136 +++ .../Preferences/brightness.html | 175 +++ .../ramaz_services/Preferences/firstTime.html | 155 +++ .../Preferences/firstTimeKey-constant.html | 146 +++ docs/ramaz_services/Preferences/hashCode.html | 175 +++ docs/ramaz_services/Preferences/init.html | 158 +++ .../Preferences/lightMode-constant.html | 146 +++ .../Preferences/noSuchMethod.html | 183 +++ .../Preferences/operator_equals.html | 174 +++ .../Preferences/runtimeType.html | 150 +++ docs/ramaz_services/Preferences/signIn.html | 155 +++ docs/ramaz_services/Preferences/toString.html | 156 +++ docs/ramaz_services/Services-class.html | 375 ++++++ docs/ramaz_services/Services/Services.html | 150 +++ docs/ramaz_services/Services/crashlytics.html | 150 +++ docs/ramaz_services/Services/database.html | 150 +++ docs/ramaz_services/Services/hashCode.html | 179 +++ docs/ramaz_services/Services/init.html | 165 +++ docs/ramaz_services/Services/instance.html | 150 +++ docs/ramaz_services/Services/isReady.html | 150 +++ .../ramaz_services/Services/noSuchMethod.html | 187 +++ .../Services/notifications.html | 151 +++ .../Services/operator_equals.html | 178 +++ docs/ramaz_services/Services/prefs.html | 151 +++ .../Services/pushNotifications.html | 151 +++ docs/ramaz_services/Services/runtimeType.html | 154 +++ docs/ramaz_services/Services/services.html | 151 +++ docs/ramaz_services/Services/signIn.html | 163 +++ docs/ramaz_services/Services/toString.html | 160 +++ .../ramaz_services-library.html | 223 ++++ docs/static-assets/favicon.png | Bin 0 -> 5037 bytes docs/static-assets/github.css | 99 ++ docs/static-assets/highlight.pack.js | 752 ++++++++++++ docs/static-assets/play_button.svg | 1 + docs/static-assets/readme.md | 21 + docs/static-assets/script.js | 496 ++++++++ docs/static-assets/styles.css | 1014 +++++++++++++++++ docs/widgets/ActivityTile-class.html | 453 ++++++++ docs/widgets/ActivityTile/ActivityTile.html | 149 +++ docs/widgets/ActivityTile/activity.html | 151 +++ docs/widgets/ActivityTile/build.html | 217 ++++ .../detailedActivities-constant.html | 154 +++ docs/widgets/BrightnessChanger-class.html | 443 +++++++ .../BrightnessChanger.dropdown.html | 149 +++ .../BrightnessChanger/BrightnessChanger.html | 149 +++ .../BrightnessChanger.iconButton.html | 149 +++ .../BrightnessChanger/createState.html | 171 +++ docs/widgets/BrightnessChanger/form.html | 151 +++ docs/widgets/BrightnessChangerForm-class.html | 321 ++++++ .../BrightnessChangerForm/hashCode.html | 169 +++ .../BrightnessChangerForm/noSuchMethod.html | 177 +++ .../operator_equals.html | 168 +++ .../BrightnessChangerForm/runtimeType.html | 144 +++ .../BrightnessChangerForm/toString.html | 147 +++ .../widgets/BrightnessChangerState-class.html | 516 +++++++++ .../BrightnessChangerState.html | 146 +++ .../widgets/BrightnessChangerState/build.html | 283 +++++ .../BrightnessChangerState/buttonToggle.html | 170 +++ docs/widgets/BrightnessChangerState/icon.html | 168 +++ .../BrightnessChangerState/setBrightness.html | 170 +++ docs/widgets/CalendarTile-class.html | 464 ++++++++ docs/widgets/CalendarTile/CalendarTile.html | 151 +++ docs/widgets/CalendarTile/blank-constant.html | 153 +++ docs/widgets/CalendarTile/build.html | 216 ++++ docs/widgets/CalendarTile/date.html | 149 +++ docs/widgets/CalendarTile/day.html | 152 +++ docs/widgets/ClassList-class.html | 466 ++++++++ docs/widgets/ClassList/ClassList.html | 156 +++ docs/widgets/ClassList/build.html | 216 ++++ docs/widgets/ClassList/day.html | 152 +++ docs/widgets/ClassList/getPanel.html | 175 +++ docs/widgets/ClassList/headerText.html | 152 +++ docs/widgets/ClassList/periods.html | 153 +++ docs/widgets/ClassPanel-class.html | 463 ++++++++ docs/widgets/ClassPanel/ClassPanel.html | 158 +++ docs/widgets/ClassPanel/activity.html | 152 +++ docs/widgets/ClassPanel/build.html | 234 ++++ docs/widgets/ClassPanel/children.html | 154 +++ docs/widgets/ClassPanel/reminders.html | 154 +++ docs/widgets/ClassPanel/title.html | 153 +++ docs/widgets/Footer-class.html | 441 +++++++ docs/widgets/Footer/Footer.html | 140 +++ docs/widgets/Footer/build.html | 243 ++++ docs/widgets/Footer/textScale-constant.html | 150 +++ docs/widgets/LayoutInfo-class.html | 395 +++++++ docs/widgets/LayoutInfo/LayoutInfo.html | 147 +++ docs/widgets/LayoutInfo/hasBottomNavBar.html | 153 +++ docs/widgets/LayoutInfo/hasNavRail.html | 153 +++ .../widgets/LayoutInfo/hasStandardDrawer.html | 153 +++ .../LayoutInfo/hasStandardSideSheet.html | 153 +++ docs/widgets/LayoutInfo/hashCode.html | 177 +++ docs/widgets/LayoutInfo/isDesktop.html | 154 +++ docs/widgets/LayoutInfo/isMobile.html | 153 +++ .../widgets/LayoutInfo/isTabletLandscape.html | 153 +++ docs/widgets/LayoutInfo/isTabletPortrait.html | 153 +++ docs/widgets/LayoutInfo/noSuchMethod.html | 185 +++ docs/widgets/LayoutInfo/operator_equals.html | 176 +++ docs/widgets/LayoutInfo/runtimeType.html | 152 +++ docs/widgets/LayoutInfo/toString.html | 158 +++ docs/widgets/LayoutInfo/windowType.html | 148 +++ docs/widgets/LinkIcon-class.html | 439 +++++++ docs/widgets/LinkIcon/LinkIcon.html | 149 +++ docs/widgets/LinkIcon/build.html | 194 ++++ docs/widgets/LinkIcon/path.html | 150 +++ docs/widgets/LinkIcon/url.html | 150 +++ docs/widgets/LoadingImage-class.html | 461 ++++++++ docs/widgets/LoadingImage/LoadingImage.html | 152 +++ docs/widgets/LoadingImage/aspectRatio.html | 152 +++ docs/widgets/LoadingImage/createState.html | 170 +++ docs/widgets/LoadingImage/image.html | 150 +++ docs/widgets/LoadingImageState-class.html | 543 +++++++++ .../LoadingImageState/LoadingImageState.html | 148 +++ .../LoadingImageState/aspectRatio.html | 158 +++ docs/widgets/LoadingImageState/build.html | 259 +++++ docs/widgets/LoadingImageState/dispose.html | 193 ++++ docs/widgets/LoadingImageState/initState.html | 193 ++++ docs/widgets/LoadingImageState/listener.html | 158 +++ docs/widgets/LoadingImageState/loading.html | 158 +++ docs/widgets/LoadingImageState/onLoad.html | 175 +++ docs/widgets/LoadingImageState/stream.html | 158 +++ docs/widgets/Logos-class.html | 376 ++++++ docs/widgets/Logos/Logos.html | 136 +++ docs/widgets/Logos/drive-constant.html | 149 +++ docs/widgets/Logos/google-constant.html | 151 +++ docs/widgets/Logos/hashCode.html | 175 +++ docs/widgets/Logos/noSuchMethod.html | 183 +++ docs/widgets/Logos/operator_equals.html | 174 +++ docs/widgets/Logos/outlook-constant.html | 149 +++ docs/widgets/Logos/ramazIcon-constant.html | 149 +++ docs/widgets/Logos/runtimeType.html | 150 +++ docs/widgets/Logos/schoology-constant.html | 149 +++ .../widgets/Logos/seniorSystems-constant.html | 149 +++ docs/widgets/Logos/toString.html | 156 +++ docs/widgets/ModelBuilder.html | 170 +++ docs/widgets/ModelListener-class.html | 464 ++++++++ docs/widgets/ModelListener/ModelListener.html | 159 +++ docs/widgets/ModelListener/builder.html | 152 +++ docs/widgets/ModelListener/child.html | 155 +++ docs/widgets/ModelListener/createState.html | 172 +++ docs/widgets/ModelListener/dispose.html | 154 +++ docs/widgets/ModelListener/model.html | 156 +++ docs/widgets/ModelListenerState-class.html | 505 ++++++++ .../ModelListenerState.html | 145 +++ docs/widgets/ModelListenerState/build.html | 251 ++++ docs/widgets/ModelListenerState/dispose.html | 198 ++++ .../widgets/ModelListenerState/initState.html | 189 +++ docs/widgets/ModelListenerState/listener.html | 157 +++ docs/widgets/ModelListenerState/model.html | 158 +++ docs/widgets/NavigationItem-class.html | 522 +++++++++ .../NavigationItem/NavigationItem.html | 155 +++ docs/widgets/NavigationItem/appBar.html | 158 +++ docs/widgets/NavigationItem/bottomNavBar.html | 162 +++ .../NavigationItem/floatingActionButton.html | 158 +++ .../floatingActionButtonLocation.html | 158 +++ docs/widgets/NavigationItem/icon.html | 156 +++ docs/widgets/NavigationItem/label.html | 157 +++ docs/widgets/NavigationItem/navRail.html | 162 +++ docs/widgets/NavigationItem/sideSheet.html | 158 +++ docs/widgets/NextClass-class.html | 463 ++++++++ docs/widgets/NextClass/NextClass.html | 158 +++ docs/widgets/NextClass/build.html | 208 ++++ docs/widgets/NextClass/next.html | 153 +++ docs/widgets/NextClass/period.html | 152 +++ docs/widgets/NextClass/reminders.html | 153 +++ docs/widgets/NextClass/subject.html | 152 +++ docs/widgets/PeriodTile-class.html | 500 ++++++++ docs/widgets/PeriodTile/PeriodTile.html | 162 +++ docs/widgets/PeriodTile/activity.html | 155 +++ docs/widgets/PeriodTile/build.html | 248 ++++ docs/widgets/PeriodTile/end.html | 155 +++ docs/widgets/PeriodTile/getRange.html | 163 +++ docs/widgets/PeriodTile/index.html | 155 +++ docs/widgets/PeriodTile/model.html | 155 +++ docs/widgets/PeriodTile/range.html | 155 +++ docs/widgets/PeriodTile/start.html | 155 +++ docs/widgets/RamazLogos-class.html | 342 ++++++ docs/widgets/RamazLogos/RamazLogos.html | 134 +++ docs/widgets/RamazLogos/hashCode.html | 173 +++ docs/widgets/RamazLogos/noSuchMethod.html | 181 +++ docs/widgets/RamazLogos/operator_equals.html | 172 +++ .../RamazLogos/ramRectangle-constant.html | 150 +++ .../RamazLogos/ramSquare-constant.html | 148 +++ .../RamazLogos/ramSquareWords-constant.html | 149 +++ docs/widgets/RamazLogos/runtimeType.html | 148 +++ docs/widgets/RamazLogos/teal-constant.html | 148 +++ docs/widgets/RamazLogos/toString.html | 154 +++ docs/widgets/ReminderTile-class.html | 440 +++++++ docs/widgets/ReminderTile/ReminderTile.html | 152 +++ docs/widgets/ReminderTile/build.html | 227 ++++ docs/widgets/ReminderTile/height.html | 150 +++ docs/widgets/ReminderTile/index.html | 150 +++ docs/widgets/ResponsiveBuilder-class.html | 439 +++++++ .../ResponsiveBuilder/ResponsiveBuilder.html | 152 +++ docs/widgets/ResponsiveBuilder/build.html | 192 ++++ docs/widgets/ResponsiveBuilder/builder.html | 150 +++ docs/widgets/ResponsiveBuilder/child.html | 152 +++ docs/widgets/ResponsiveScaffold-class.html | 560 +++++++++ .../ResponsiveScaffold.html | 174 +++ .../ResponsiveScaffold.navBar.html | 174 +++ docs/widgets/ResponsiveScaffold/appBar.html | 161 +++ .../ResponsiveScaffold/bodyBuilder.html | 160 +++ docs/widgets/ResponsiveScaffold/build.html | 245 ++++ docs/widgets/ResponsiveScaffold/drawer.html | 165 +++ .../floatingActionButton.html | 161 +++ .../floatingActionButtonLocation.html | 160 +++ .../widgets/ResponsiveScaffold/hasNavBar.html | 165 +++ docs/widgets/ResponsiveScaffold/navIndex.html | 160 +++ docs/widgets/ResponsiveScaffold/navItems.html | 165 +++ .../ResponsiveScaffold/onNavIndexChanged.html | 160 +++ .../ResponsiveScaffold/secondaryDrawer.html | 165 +++ .../widgets/ResponsiveScaffold/sideSheet.html | 163 +++ docs/widgets/ResponsiveWidgetBuilder.html | 171 +++ docs/widgets/ScoreUpdaterState-class.html | 552 +++++++++ .../ScoreUpdaterState/ScoreUpdaterState.html | 149 +++ docs/widgets/ScoreUpdaterState/build.html | 305 +++++ docs/widgets/ScoreUpdaterState/initState.html | 196 ++++ .../ScoreUpdaterState/otherController.html | 159 +++ .../widgets/ScoreUpdaterState/otherScore.html | 159 +++ .../ScoreUpdaterState/ramazController.html | 159 +++ .../widgets/ScoreUpdaterState/ramazScore.html | 159 +++ docs/widgets/ScoreUpdaterState/ready.html | 167 +++ docs/widgets/ScoreUpdaterState/scores.html | 168 +++ docs/widgets/SpecialTile-class.html | 427 +++++++ docs/widgets/SpecialTile/SpecialTile.html | 147 +++ docs/widgets/SpecialTile/build.html | 201 ++++ docs/widgets/SpecialTile/child.html | 149 +++ docs/widgets/SportsIcons-class.html | 376 ++++++ docs/widgets/SportsIcons/SportsIcons.html | 136 +++ .../SportsIcons/baseball-constant.html | 146 +++ .../SportsIcons/basketball-constant.html | 146 +++ docs/widgets/SportsIcons/hashCode.html | 175 +++ docs/widgets/SportsIcons/hockey-constant.html | 146 +++ docs/widgets/SportsIcons/noSuchMethod.html | 183 +++ docs/widgets/SportsIcons/operator_equals.html | 174 +++ docs/widgets/SportsIcons/runtimeType.html | 150 +++ docs/widgets/SportsIcons/soccer-constant.html | 146 +++ docs/widgets/SportsIcons/tennis-constant.html | 146 +++ docs/widgets/SportsIcons/toString.html | 156 +++ .../SportsIcons/volleyball-constant.html | 146 +++ docs/widgets/SportsScoreUpdater-class.html | 448 ++++++++ .../SportsScoreUpdater.html | 149 +++ .../SportsScoreUpdater/createState.html | 171 +++ docs/widgets/SportsScoreUpdater/game.html | 152 +++ .../SportsScoreUpdater/updateScores.html | 162 +++ docs/widgets/SportsStats-class.html | 452 ++++++++ docs/widgets/SportsStats/SportsStats.html | 155 +++ docs/widgets/SportsStats/build.html | 202 ++++ docs/widgets/SportsStats/dateTime.html | 154 +++ docs/widgets/SportsStats/score.html | 151 +++ docs/widgets/SportsStats/team.html | 151 +++ docs/widgets/SportsTile-class.html | 500 ++++++++ docs/widgets/SportsTile/SportsTile.html | 154 +++ docs/widgets/SportsTile/build.html | 235 ++++ docs/widgets/SportsTile/cardColor.html | 167 +++ docs/widgets/SportsTile/formatDate.html | 159 +++ docs/widgets/SportsTile/game.html | 155 +++ docs/widgets/SportsTile/icon.html | 174 +++ docs/widgets/SportsTile/onTap.html | 159 +++ docs/widgets/SportsTile/padLength.html | 161 +++ docs/widgets/ThemeBuilder.html | 168 +++ docs/widgets/ThemeChanger-class.html | 513 +++++++++ docs/widgets/ThemeChanger/ThemeChanger.html | 163 +++ docs/widgets/ThemeChanger/builder.html | 155 +++ docs/widgets/ThemeChanger/createState.html | 175 +++ docs/widgets/ThemeChanger/dark.html | 157 +++ .../ThemeChanger/defaultBrightness.html | 155 +++ docs/widgets/ThemeChanger/light.html | 157 +++ docs/widgets/ThemeChanger/of.html | 166 +++ docs/widgets/ThemeChanger/themes.html | 157 +++ docs/widgets/ThemeChangerState-class.html | 516 +++++++++ .../ThemeChangerState/ThemeChangerState.html | 146 +++ .../widgets/ThemeChangerState/brightness.html | 189 +++ docs/widgets/ThemeChangerState/build.html | 250 ++++ docs/widgets/ThemeChangerState/initState.html | 190 +++ docs/widgets/ThemeChangerState/theme.html | 186 +++ docs/widgets/ThemeChangerState/themeName.html | 190 +++ docs/widgets/caseConverter.html | 174 +++ docs/widgets/pickDate.html | 184 +++ docs/widgets/widgets-library.html | 523 +++++++++ 1087 files changed, 208713 insertions(+) create mode 100644 docs/__404error.html create mode 100644 docs/app/RamLife-class.html create mode 100644 docs/app/RamLife/RamLife.html create mode 100644 docs/app/RamLife/build.html create mode 100644 docs/app/RamLife/hasAdminScope.html create mode 100644 docs/app/RamLife/routes.html create mode 100644 docs/app/app-library.html create mode 100644 docs/categories.json create mode 100644 docs/constants/DayComparison.html create mode 100644 docs/constants/DayComparison/isSameDay.html create mode 100644 docs/constants/RamazColors-class.html create mode 100644 docs/constants/RamazColors/RamazColors.html create mode 100644 docs/constants/RamazColors/blue-constant.html create mode 100644 docs/constants/RamazColors/blueDark-constant.html create mode 100644 docs/constants/RamazColors/blueLight-constant.html create mode 100644 docs/constants/RamazColors/gold-constant.html create mode 100644 docs/constants/RamazColors/goldDark-constant.html create mode 100644 docs/constants/RamazColors/goldLight-constant.html create mode 100644 docs/constants/RamazColors/hashCode.html create mode 100644 docs/constants/RamazColors/noSuchMethod.html create mode 100644 docs/constants/RamazColors/operator_equals.html create mode 100644 docs/constants/RamazColors/runtimeType.html create mode 100644 docs/constants/RamazColors/toString.html create mode 100644 docs/constants/TimeConverter.html create mode 100644 docs/constants/TimeConverter/asTime.html create mode 100644 docs/constants/TimeOfDayConverter.html create mode 100644 docs/constants/TimeOfDayConverter/asTimeOfDay.html create mode 100644 docs/constants/Times-class.html create mode 100644 docs/constants/Times/Times.html create mode 100644 docs/constants/Times/hashCode.html create mode 100644 docs/constants/Times/noSuchMethod.html create mode 100644 docs/constants/Times/operator_equals.html create mode 100644 docs/constants/Times/runtimeType.html create mode 100644 docs/constants/Times/schoolEnd-constant.html create mode 100644 docs/constants/Times/schoolStart-constant.html create mode 100644 docs/constants/Times/toString.html create mode 100644 docs/constants/Times/winterFridayDayEnd-constant.html create mode 100644 docs/constants/Times/winterFridayDayStart-constant.html create mode 100644 docs/constants/Times/winterFridayMonthEnd-constant.html create mode 100644 docs/constants/Times/winterFridayMonthStart-constant.html create mode 100644 docs/constants/Urls-class.html create mode 100644 docs/constants/Urls/Urls.html create mode 100644 docs/constants/Urls/email-constant.html create mode 100644 docs/constants/Urls/googleDrive-constant.html create mode 100644 docs/constants/Urls/hashCode.html create mode 100644 docs/constants/Urls/noSuchMethod.html create mode 100644 docs/constants/Urls/operator_equals.html create mode 100644 docs/constants/Urls/ramaz-constant.html create mode 100644 docs/constants/Urls/runtimeType.html create mode 100644 docs/constants/Urls/schoology-constant.html create mode 100644 docs/constants/Urls/seniorSystems-constant.html create mode 100644 docs/constants/Urls/sportsLivestream-constant.html create mode 100644 docs/constants/Urls/toString.html create mode 100644 docs/constants/constants-library.html create mode 100644 docs/data/Activity-class.html create mode 100644 docs/data/Activity/Activity.fromJson.html create mode 100644 docs/data/Activity/Activity.grade.html create mode 100644 docs/data/Activity/Activity.html create mode 100644 docs/data/Activity/getActivities.html create mode 100644 docs/data/Activity/hashCode.html create mode 100644 docs/data/Activity/message.html create mode 100644 docs/data/Activity/noSuchMethod.html create mode 100644 docs/data/Activity/operator_equals.html create mode 100644 docs/data/Activity/runtimeType.html create mode 100644 docs/data/Activity/toJson.html create mode 100644 docs/data/Activity/toString.html create mode 100644 docs/data/Activity/type.html create mode 100644 docs/data/ActivityType-class.html create mode 100644 docs/data/ActivityType/hashCode.html create mode 100644 docs/data/ActivityType/noSuchMethod.html create mode 100644 docs/data/ActivityType/operator_equals.html create mode 100644 docs/data/ActivityType/runtimeType.html create mode 100644 docs/data/ActivityType/toString.html create mode 100644 docs/data/AdminScope-class.html create mode 100644 docs/data/AdminScope/hashCode.html create mode 100644 docs/data/AdminScope/noSuchMethod.html create mode 100644 docs/data/AdminScope/operator_equals.html create mode 100644 docs/data/AdminScope/runtimeType.html create mode 100644 docs/data/AdminScope/toString.html create mode 100644 docs/data/Advisory-class.html create mode 100644 docs/data/Advisory/Advisory.fromJson.html create mode 100644 docs/data/Advisory/Advisory.html create mode 100644 docs/data/Advisory/hashCode.html create mode 100644 docs/data/Advisory/id.html create mode 100644 docs/data/Advisory/noSuchMethod.html create mode 100644 docs/data/Advisory/operator_equals.html create mode 100644 docs/data/Advisory/room.html create mode 100644 docs/data/Advisory/runtimeType.html create mode 100644 docs/data/Advisory/toString.html create mode 100644 docs/data/Club-class.html create mode 100644 docs/data/Club/Club.html create mode 100644 docs/data/Club/attendance.html create mode 100644 docs/data/Club/captains.html create mode 100644 docs/data/Club/description.html create mode 100644 docs/data/Club/facultyAdvisor.html create mode 100644 docs/data/Club/formUrl.html create mode 100644 docs/data/Club/hashCode.html create mode 100644 docs/data/Club/image.html create mode 100644 docs/data/Club/members.html create mode 100644 docs/data/Club/messages.html create mode 100644 docs/data/Club/name.html create mode 100644 docs/data/Club/noSuchMethod.html create mode 100644 docs/data/Club/operator_equals.html create mode 100644 docs/data/Club/phoneNumberRequested.html create mode 100644 docs/data/Club/runtimeType.html create mode 100644 docs/data/Club/shortDescription.html create mode 100644 docs/data/Club/toString.html create mode 100644 docs/data/Day-class.html create mode 100644 docs/data/Day/Day.fromJson.html create mode 100644 docs/data/Day/Day.html create mode 100644 docs/data/Day/displayName.html create mode 100644 docs/data/Day/getCalendar.html create mode 100644 docs/data/Day/getCurrentPeriod.html create mode 100644 docs/data/Day/getDate.html create mode 100644 docs/data/Day/hashCode.html create mode 100644 docs/data/Day/n.html create mode 100644 docs/data/Day/name.html create mode 100644 docs/data/Day/noSuchMethod.html create mode 100644 docs/data/Day/operator_equals.html create mode 100644 docs/data/Day/runtimeType.html create mode 100644 docs/data/Day/schedule.html create mode 100644 docs/data/Day/toJson.html create mode 100644 docs/data/Day/toString.html create mode 100644 docs/data/Feedback-class.html create mode 100644 docs/data/Feedback/Feedback.html create mode 100644 docs/data/Feedback/anonymous.html create mode 100644 docs/data/Feedback/email.html create mode 100644 docs/data/Feedback/hashCode.html create mode 100644 docs/data/Feedback/message.html create mode 100644 docs/data/Feedback/name.html create mode 100644 docs/data/Feedback/noSuchMethod.html create mode 100644 docs/data/Feedback/operator_equals.html create mode 100644 docs/data/Feedback/runtimeType.html create mode 100644 docs/data/Feedback/timestamp.html create mode 100644 docs/data/Feedback/toJson.html create mode 100644 docs/data/Feedback/toString.html create mode 100644 docs/data/Grade-class.html create mode 100644 docs/data/Grade/hashCode.html create mode 100644 docs/data/Grade/noSuchMethod.html create mode 100644 docs/data/Grade/operator_equals.html create mode 100644 docs/data/Grade/runtimeType.html create mode 100644 docs/data/Grade/toString.html create mode 100644 docs/data/GradeActivity-class.html create mode 100644 docs/data/GradeActivity/GradeActivity.fromJson.html create mode 100644 docs/data/GradeActivity/GradeActivity.html create mode 100644 docs/data/GradeActivity/freshmen.html create mode 100644 docs/data/GradeActivity/hashCode.html create mode 100644 docs/data/GradeActivity/juniors.html create mode 100644 docs/data/GradeActivity/noSuchMethod.html create mode 100644 docs/data/GradeActivity/operator_equals.html create mode 100644 docs/data/GradeActivity/runtimeType.html create mode 100644 docs/data/GradeActivity/seniors.html create mode 100644 docs/data/GradeActivity/sophomores.html create mode 100644 docs/data/GradeActivity/toString.html create mode 100644 docs/data/Message-class.html create mode 100644 docs/data/Message/Message.html create mode 100644 docs/data/Message/body.html create mode 100644 docs/data/Message/hashCode.html create mode 100644 docs/data/Message/noSuchMethod.html create mode 100644 docs/data/Message/operator_equals.html create mode 100644 docs/data/Message/runtimeType.html create mode 100644 docs/data/Message/sender.html create mode 100644 docs/data/Message/timestamp.html create mode 100644 docs/data/Message/toString.html create mode 100644 docs/data/Period-class.html create mode 100644 docs/data/Period/Period.fromJson.html create mode 100644 docs/data/Period/Period.html create mode 100644 docs/data/Period/Period.raw.html create mode 100644 docs/data/Period/activity.html create mode 100644 docs/data/Period/copyWith.html create mode 100644 docs/data/Period/data.html create mode 100644 docs/data/Period/getInfo.html create mode 100644 docs/data/Period/getName.html create mode 100644 docs/data/Period/hashCode.html create mode 100644 docs/data/Period/id.html create mode 100644 docs/data/Period/isFree.html create mode 100644 docs/data/Period/name.html create mode 100644 docs/data/Period/noSuchMethod.html create mode 100644 docs/data/Period/operator_equals.html create mode 100644 docs/data/Period/runtimeType.html create mode 100644 docs/data/Period/time.html create mode 100644 docs/data/Period/toJson.html create mode 100644 docs/data/Period/toString.html create mode 100644 docs/data/PeriodData-class.html create mode 100644 docs/data/PeriodData/PeriodData.fromJson.html create mode 100644 docs/data/PeriodData/PeriodData.html create mode 100644 docs/data/PeriodData/getList.html create mode 100644 docs/data/PeriodData/hashCode.html create mode 100644 docs/data/PeriodData/id.html create mode 100644 docs/data/PeriodData/noSuchMethod.html create mode 100644 docs/data/PeriodData/operator_equals.html create mode 100644 docs/data/PeriodData/room.html create mode 100644 docs/data/PeriodData/runtimeType.html create mode 100644 docs/data/PeriodData/toString.html create mode 100644 docs/data/PeriodReminderTime-class.html create mode 100644 docs/data/PeriodReminderTime/PeriodReminderTime.fromJson.html create mode 100644 docs/data/PeriodReminderTime/PeriodReminderTime.html create mode 100644 docs/data/PeriodReminderTime/dayName.html create mode 100644 docs/data/PeriodReminderTime/doesApply.html create mode 100644 docs/data/PeriodReminderTime/hash.html create mode 100644 docs/data/PeriodReminderTime/period.html create mode 100644 docs/data/PeriodReminderTime/toJson.html create mode 100644 docs/data/PeriodReminderTime/toString.html create mode 100644 docs/data/Range-class.html create mode 100644 docs/data/Range/Range.fromJson.html create mode 100644 docs/data/Range/Range.html create mode 100644 docs/data/Range/Range.nums.html create mode 100644 docs/data/Range/contains.html create mode 100644 docs/data/Range/end.html create mode 100644 docs/data/Range/hashCode.html create mode 100644 docs/data/Range/noSuchMethod.html create mode 100644 docs/data/Range/operator_equals.html create mode 100644 docs/data/Range/operator_greater.html create mode 100644 docs/data/Range/operator_less.html create mode 100644 docs/data/Range/runtimeType.html create mode 100644 docs/data/Range/start.html create mode 100644 docs/data/Range/toJson.html create mode 100644 docs/data/Range/toString.html create mode 100644 docs/data/Reminder-class.html create mode 100644 docs/data/Reminder/Reminder.fromJson.html create mode 100644 docs/data/Reminder/Reminder.html create mode 100644 docs/data/Reminder/fromList.html create mode 100644 docs/data/Reminder/getReminders.html create mode 100644 docs/data/Reminder/hash.html create mode 100644 docs/data/Reminder/hashCode.html create mode 100644 docs/data/Reminder/message.html create mode 100644 docs/data/Reminder/noSuchMethod.html create mode 100644 docs/data/Reminder/operator_equals.html create mode 100644 docs/data/Reminder/runtimeType.html create mode 100644 docs/data/Reminder/time.html create mode 100644 docs/data/Reminder/toJson.html create mode 100644 docs/data/Reminder/toString.html create mode 100644 docs/data/ReminderTime-class.html create mode 100644 docs/data/ReminderTime/ReminderTime.fromJson.html create mode 100644 docs/data/ReminderTime/ReminderTime.fromType.html create mode 100644 docs/data/ReminderTime/ReminderTime.html create mode 100644 docs/data/ReminderTime/doesApply.html create mode 100644 docs/data/ReminderTime/hash.html create mode 100644 docs/data/ReminderTime/hashCode.html create mode 100644 docs/data/ReminderTime/noSuchMethod.html create mode 100644 docs/data/ReminderTime/operator_equals.html create mode 100644 docs/data/ReminderTime/repeats.html create mode 100644 docs/data/ReminderTime/runtimeType.html create mode 100644 docs/data/ReminderTime/toJson.html create mode 100644 docs/data/ReminderTime/toString.html create mode 100644 docs/data/ReminderTime/type.html create mode 100644 docs/data/ReminderTimeType-class.html create mode 100644 docs/data/ReminderTimeType/hashCode.html create mode 100644 docs/data/ReminderTimeType/noSuchMethod.html create mode 100644 docs/data/ReminderTimeType/operator_equals.html create mode 100644 docs/data/ReminderTimeType/runtimeType.html create mode 100644 docs/data/ReminderTimeType/toString.html create mode 100644 docs/data/Schedule-class.html create mode 100644 docs/data/Schedule/Schedule.fromJson.html create mode 100644 docs/data/Schedule/Schedule.html create mode 100644 docs/data/Schedule/amAssembly-constant.html create mode 100644 docs/data/Schedule/covid-constant.html create mode 100644 docs/data/Schedule/early-constant.html create mode 100644 docs/data/Schedule/fastDay-constant.html create mode 100644 docs/data/Schedule/friday-constant.html create mode 100644 docs/data/Schedule/fridayRoshChodesh-constant.html create mode 100644 docs/data/Schedule/getWinterFriday.html create mode 100644 docs/data/Schedule/hashCode.html create mode 100644 docs/data/Schedule/name.html create mode 100644 docs/data/Schedule/noSuchMethod.html create mode 100644 docs/data/Schedule/operator_equals.html create mode 100644 docs/data/Schedule/periods.html create mode 100644 docs/data/Schedule/pmAssembly-constant.html create mode 100644 docs/data/Schedule/roshChodesh-constant.html create mode 100644 docs/data/Schedule/runtimeType.html create mode 100644 docs/data/Schedule/schedules.html create mode 100644 docs/data/Schedule/toJson.html create mode 100644 docs/data/Schedule/toString.html create mode 100644 docs/data/Schedule/winterFriday-constant.html create mode 100644 docs/data/Schedule/winterFridayRoshChodesh-constant.html create mode 100644 docs/data/Scores-class.html create mode 100644 docs/data/Scores/Scores.fromJson.html create mode 100644 docs/data/Scores/Scores.html create mode 100644 docs/data/Scores/didDraw.html create mode 100644 docs/data/Scores/didWin.html create mode 100644 docs/data/Scores/getScore.html create mode 100644 docs/data/Scores/hashCode.html create mode 100644 docs/data/Scores/isHome.html create mode 100644 docs/data/Scores/noSuchMethod.html create mode 100644 docs/data/Scores/operator_equals.html create mode 100644 docs/data/Scores/otherScore.html create mode 100644 docs/data/Scores/ramazScore.html create mode 100644 docs/data/Scores/runtimeType.html create mode 100644 docs/data/Scores/toJson.html create mode 100644 docs/data/Scores/toString.html create mode 100644 docs/data/Sport-class.html create mode 100644 docs/data/Sport/hashCode.html create mode 100644 docs/data/Sport/noSuchMethod.html create mode 100644 docs/data/Sport/operator_equals.html create mode 100644 docs/data/Sport/runtimeType.html create mode 100644 docs/data/Sport/toString.html create mode 100644 docs/data/SportsGame-class.html create mode 100644 docs/data/SportsGame/SportsGame.fromJson.html create mode 100644 docs/data/SportsGame/SportsGame.html create mode 100644 docs/data/SportsGame/awayTeam.html create mode 100644 docs/data/SportsGame/capitalize.html create mode 100644 docs/data/SportsGame/date.html create mode 100644 docs/data/SportsGame/dateTime.html create mode 100644 docs/data/SportsGame/description.html create mode 100644 docs/data/SportsGame/fromList.html create mode 100644 docs/data/SportsGame/getJsonList.html create mode 100644 docs/data/SportsGame/hashCode.html create mode 100644 docs/data/SportsGame/homeTeam.html create mode 100644 docs/data/SportsGame/isHome.html create mode 100644 docs/data/SportsGame/noSuchMethod.html create mode 100644 docs/data/SportsGame/operator_equals.html create mode 100644 docs/data/SportsGame/opponent.html create mode 100644 docs/data/SportsGame/replaceScores.html create mode 100644 docs/data/SportsGame/runtimeType.html create mode 100644 docs/data/SportsGame/scores.html create mode 100644 docs/data/SportsGame/sport.html create mode 100644 docs/data/SportsGame/team.html create mode 100644 docs/data/SportsGame/times.html create mode 100644 docs/data/SportsGame/toJson.html create mode 100644 docs/data/SportsGame/toString.html create mode 100644 docs/data/Subject-class.html create mode 100644 docs/data/Subject/Subject.fromJson.html create mode 100644 docs/data/Subject/Subject.html create mode 100644 docs/data/Subject/getSubjects.html create mode 100644 docs/data/Subject/hashCode.html create mode 100644 docs/data/Subject/name.html create mode 100644 docs/data/Subject/noSuchMethod.html create mode 100644 docs/data/Subject/operator_equals.html create mode 100644 docs/data/Subject/runtimeType.html create mode 100644 docs/data/Subject/teacher.html create mode 100644 docs/data/Subject/toString.html create mode 100644 docs/data/Subject/virtualLink.html create mode 100644 docs/data/SubjectReminderTime-class.html create mode 100644 docs/data/SubjectReminderTime/SubjectReminderTime.fromJson.html create mode 100644 docs/data/SubjectReminderTime/SubjectReminderTime.html create mode 100644 docs/data/SubjectReminderTime/doesApply.html create mode 100644 docs/data/SubjectReminderTime/hash.html create mode 100644 docs/data/SubjectReminderTime/name.html create mode 100644 docs/data/SubjectReminderTime/toJson.html create mode 100644 docs/data/SubjectReminderTime/toString.html create mode 100644 docs/data/Time-class.html create mode 100644 docs/data/Time/Time.fromDateTime.html create mode 100644 docs/data/Time/Time.fromJson.html create mode 100644 docs/data/Time/Time.html create mode 100644 docs/data/Time/hashCode.html create mode 100644 docs/data/Time/hour.html create mode 100644 docs/data/Time/minutes.html create mode 100644 docs/data/Time/noSuchMethod.html create mode 100644 docs/data/Time/operator_equals.html create mode 100644 docs/data/Time/operator_greater.html create mode 100644 docs/data/Time/operator_greater_equal.html create mode 100644 docs/data/Time/operator_less.html create mode 100644 docs/data/Time/operator_less_equal.html create mode 100644 docs/data/Time/runtimeType.html create mode 100644 docs/data/Time/toJson.html create mode 100644 docs/data/Time/toString.html create mode 100644 docs/data/User-class.html create mode 100644 docs/data/User/User.fromJson.html create mode 100644 docs/data/User/User.html create mode 100644 docs/data/User/advisory.html create mode 100644 docs/data/User/contactInfo.html create mode 100644 docs/data/User/dayNames.html create mode 100644 docs/data/User/getPeriods.html create mode 100644 docs/data/User/grade.html create mode 100644 docs/data/User/hashCode.html create mode 100644 docs/data/User/noSuchMethod.html create mode 100644 docs/data/User/operator_equals.html create mode 100644 docs/data/User/registeredClubs.html create mode 100644 docs/data/User/runtimeType.html create mode 100644 docs/data/User/safeJson.html create mode 100644 docs/data/User/schedule.html create mode 100644 docs/data/User/sectionIDs.html create mode 100644 docs/data/User/toString.html create mode 100644 docs/data/activityTypeToString.html create mode 100644 docs/data/adminScopeToString.html create mode 100644 docs/data/data-library.html create mode 100644 docs/data/intToGrade.html create mode 100644 docs/data/parseActivityType.html create mode 100644 docs/data/parseAdminScope.html create mode 100644 docs/data/reminderTimeToString-constant.html create mode 100644 docs/data/sportToString.html create mode 100644 docs/data/stringToReminderTime-constant.html create mode 100644 docs/data/stringToSport-constant.html create mode 100644 docs/generated_plugin_registrant/generated_plugin_registrant-library.html create mode 100644 docs/generated_plugin_registrant/registerPlugins.html create mode 100644 docs/index.html create mode 100644 docs/index.json create mode 100644 docs/main/main-library.html create mode 100644 docs/main/main.html create mode 100644 docs/models/AdminScheduleModel-class.html create mode 100644 docs/models/AdminScheduleModel/AdminScheduleModel.html create mode 100644 docs/models/AdminScheduleModel/createSchedule.html create mode 100644 docs/models/AdminScheduleModel/deleteSchedule.html create mode 100644 docs/models/AdminScheduleModel/jsonSchedules.html create mode 100644 docs/models/AdminScheduleModel/saveSchedules.html create mode 100644 docs/models/AdminScheduleModel/schedules.html create mode 100644 docs/models/CalendarDay-class.html create mode 100644 docs/models/CalendarDay/CalendarDay.html create mode 100644 docs/models/CalendarDay/date.html create mode 100644 docs/models/CalendarDay/hashCode.html create mode 100644 docs/models/CalendarDay/noSuchMethod.html create mode 100644 docs/models/CalendarDay/operator_equals.html create mode 100644 docs/models/CalendarDay/runtimeType.html create mode 100644 docs/models/CalendarDay/schoolDay.html create mode 100644 docs/models/CalendarDay/toString.html create mode 100644 docs/models/CalendarEditor-class.html create mode 100644 docs/models/CalendarEditor/CalendarEditor.html create mode 100644 docs/models/CalendarEditor/calendar.html create mode 100644 docs/models/CalendarEditor/currentMonth.html create mode 100644 docs/models/CalendarEditor/currentYear.html create mode 100644 docs/models/CalendarEditor/daysInMonth.html create mode 100644 docs/models/CalendarEditor/dispose.html create mode 100644 docs/models/CalendarEditor/layoutMonth.html create mode 100644 docs/models/CalendarEditor/loadMonth.html create mode 100644 docs/models/CalendarEditor/now.html create mode 100644 docs/models/CalendarEditor/subscriptions.html create mode 100644 docs/models/CalendarEditor/updateDay.html create mode 100644 docs/models/CalendarEditor/years.html create mode 100644 docs/models/DayBuilderModel-class.html create mode 100644 docs/models/DayBuilderModel/DayBuilderModel.html create mode 100644 docs/models/DayBuilderModel/date.html create mode 100644 docs/models/DayBuilderModel/day.html create mode 100644 docs/models/DayBuilderModel/hasSchool.html create mode 100644 docs/models/DayBuilderModel/name.html create mode 100644 docs/models/DayBuilderModel/ready.html create mode 100644 docs/models/DayBuilderModel/schedule.html create mode 100644 docs/models/FeedbackModel-class.html create mode 100644 docs/models/FeedbackModel/FeedbackModel.html create mode 100644 docs/models/FeedbackModel/anonymous.html create mode 100644 docs/models/FeedbackModel/message.html create mode 100644 docs/models/FeedbackModel/ready.html create mode 100644 docs/models/FeedbackModel/send.html create mode 100644 docs/models/HomeModel-class.html create mode 100644 docs/models/HomeModel/HomeModel.html create mode 100644 docs/models/HomeModel/dispose.html create mode 100644 docs/models/HomeModel/refresh.html create mode 100644 docs/models/Models-class.html create mode 100644 docs/models/Models/Models.html create mode 100644 docs/models/Models/dispose.html create mode 100644 docs/models/Models/init.html create mode 100644 docs/models/Models/instance.html create mode 100644 docs/models/Models/isReady.html create mode 100644 docs/models/Models/reminders.html create mode 100644 docs/models/Models/schedule.html create mode 100644 docs/models/Models/sports.html create mode 100644 docs/models/Models/user.html create mode 100644 docs/models/Reminders-class.html create mode 100644 docs/models/Reminders/Reminders.html create mode 100644 docs/models/Reminders/addReminder.html create mode 100644 docs/models/Reminders/cleanReminders.html create mode 100644 docs/models/Reminders/currentReminders.html create mode 100644 docs/models/Reminders/deleteReminder.html create mode 100644 docs/models/Reminders/getReminders.html create mode 100644 docs/models/Reminders/hasNextReminder.html create mode 100644 docs/models/Reminders/hasReminder.html create mode 100644 docs/models/Reminders/init.html create mode 100644 docs/models/Reminders/markShown.html create mode 100644 docs/models/Reminders/nextReminders.html create mode 100644 docs/models/Reminders/readReminders.html create mode 100644 docs/models/Reminders/reminders.html create mode 100644 docs/models/Reminders/replaceReminder.html create mode 100644 docs/models/Reminders/verifyReminders.html create mode 100644 docs/models/RemindersBuilderModel-class.html create mode 100644 docs/models/RemindersBuilderModel/RemindersBuilderModel.html create mode 100644 docs/models/RemindersBuilderModel/build.html create mode 100644 docs/models/RemindersBuilderModel/changeCourse.html create mode 100644 docs/models/RemindersBuilderModel/changeDay.html create mode 100644 docs/models/RemindersBuilderModel/changePeriod.html create mode 100644 docs/models/RemindersBuilderModel/course.html create mode 100644 docs/models/RemindersBuilderModel/courses.html create mode 100644 docs/models/RemindersBuilderModel/dayName.html create mode 100644 docs/models/RemindersBuilderModel/message.html create mode 100644 docs/models/RemindersBuilderModel/onMessageChanged.html create mode 100644 docs/models/RemindersBuilderModel/period.html create mode 100644 docs/models/RemindersBuilderModel/periods.html create mode 100644 docs/models/RemindersBuilderModel/ready.html create mode 100644 docs/models/RemindersBuilderModel/shouldRepeat.html create mode 100644 docs/models/RemindersBuilderModel/time.html create mode 100644 docs/models/RemindersBuilderModel/toggleRepeat.html create mode 100644 docs/models/RemindersBuilderModel/toggleRepeatType.html create mode 100644 docs/models/RemindersBuilderModel/type.html create mode 100644 docs/models/ScheduleBuilderModel-class.html create mode 100644 docs/models/ScheduleBuilderModel/ScheduleBuilderModel.html create mode 100644 docs/models/ScheduleBuilderModel/name.html create mode 100644 docs/models/ScheduleBuilderModel/numPeriods.html create mode 100644 docs/models/ScheduleBuilderModel/periods.html create mode 100644 docs/models/ScheduleBuilderModel/preset.html create mode 100644 docs/models/ScheduleBuilderModel/ready.html create mode 100644 docs/models/ScheduleBuilderModel/replaceTime.html create mode 100644 docs/models/ScheduleBuilderModel/schedule.html create mode 100644 docs/models/ScheduleBuilderModel/usePreset.html create mode 100644 docs/models/ScheduleModel-class.html create mode 100644 docs/models/ScheduleModel/ScheduleModel.html create mode 100644 docs/models/ScheduleModel/calendar.html create mode 100644 docs/models/ScheduleModel/dispose.html create mode 100644 docs/models/ScheduleModel/hasSchool.html create mode 100644 docs/models/ScheduleModel/init.html create mode 100644 docs/models/ScheduleModel/initCalendar.html create mode 100644 docs/models/ScheduleModel/isValidReminder.html create mode 100644 docs/models/ScheduleModel/nextPeriod.html create mode 100644 docs/models/ScheduleModel/nextSubject.html create mode 100644 docs/models/ScheduleModel/now.html create mode 100644 docs/models/ScheduleModel/onNewPeriod.html create mode 100644 docs/models/ScheduleModel/period.html create mode 100644 docs/models/ScheduleModel/periodIndex.html create mode 100644 docs/models/ScheduleModel/periods.html create mode 100644 docs/models/ScheduleModel/reminders.html create mode 100644 docs/models/ScheduleModel/remindersListener.html create mode 100644 docs/models/ScheduleModel/scheduleReminders.html create mode 100644 docs/models/ScheduleModel/setToday.html create mode 100644 docs/models/ScheduleModel/subject.html create mode 100644 docs/models/ScheduleModel/subjects.html create mode 100644 docs/models/ScheduleModel/timer.html create mode 100644 docs/models/ScheduleModel/timerInterval-constant.html create mode 100644 docs/models/ScheduleModel/today.html create mode 100644 docs/models/ScheduleModel/updateReminders.html create mode 100644 docs/models/ScheduleModel/user.html create mode 100644 docs/models/ScheduleViewModel-class.html create mode 100644 docs/models/ScheduleViewModel/ScheduleViewModel.html create mode 100644 docs/models/ScheduleViewModel/dataModel.html create mode 100644 docs/models/ScheduleViewModel/date.html create mode 100644 docs/models/ScheduleViewModel/day.html create mode 100644 docs/models/ScheduleViewModel/defatulSchedule.html create mode 100644 docs/models/ScheduleViewModel/defaultDay.html create mode 100644 docs/models/ScheduleViewModel/update.html create mode 100644 docs/models/SortOption-class.html create mode 100644 docs/models/SortOption/hashCode.html create mode 100644 docs/models/SortOption/noSuchMethod.html create mode 100644 docs/models/SortOption/operator_equals.html create mode 100644 docs/models/SortOption/runtimeType.html create mode 100644 docs/models/SortOption/toString.html create mode 100644 docs/models/Sports-class.html create mode 100644 docs/models/Sports/Sports.html create mode 100644 docs/models/Sports/addGame.html create mode 100644 docs/models/Sports/delete.html create mode 100644 docs/models/Sports/games.html create mode 100644 docs/models/Sports/getTodayGames.html create mode 100644 docs/models/Sports/init.html create mode 100644 docs/models/Sports/now.html create mode 100644 docs/models/Sports/replace.html create mode 100644 docs/models/Sports/saveGames.html create mode 100644 docs/models/Sports/timer.html create mode 100644 docs/models/Sports/todayGames.html create mode 100644 docs/models/SportsBuilderModel-class.html create mode 100644 docs/models/SportsBuilderModel/SportsBuilderModel.html create mode 100644 docs/models/SportsBuilderModel/away.html create mode 100644 docs/models/SportsBuilderModel/date.html create mode 100644 docs/models/SportsBuilderModel/end.html create mode 100644 docs/models/SportsBuilderModel/game.html create mode 100644 docs/models/SportsBuilderModel/loading.html create mode 100644 docs/models/SportsBuilderModel/opponent.html create mode 100644 docs/models/SportsBuilderModel/ready.html create mode 100644 docs/models/SportsBuilderModel/scores.html create mode 100644 docs/models/SportsBuilderModel/sport.html create mode 100644 docs/models/SportsBuilderModel/start.html create mode 100644 docs/models/SportsBuilderModel/team.html create mode 100644 docs/models/SportsModel-class.html create mode 100644 docs/models/SportsModel/SportsModel.html create mode 100644 docs/models/SportsModel/adminFunc.html create mode 100644 docs/models/SportsModel/data.html create mode 100644 docs/models/SportsModel/dispose.html create mode 100644 docs/models/SportsModel/divideGames.html create mode 100644 docs/models/SportsModel/isAdmin.html create mode 100644 docs/models/SportsModel/loading.html create mode 100644 docs/models/SportsModel/recentBySport.html create mode 100644 docs/models/SportsModel/recents.html create mode 100644 docs/models/SportsModel/setup.html create mode 100644 docs/models/SportsModel/sortByDate.html create mode 100644 docs/models/SportsModel/sortBySport.html create mode 100644 docs/models/SportsModel/sortGames.html create mode 100644 docs/models/SportsModel/sortOption.html create mode 100644 docs/models/SportsModel/upcoming.html create mode 100644 docs/models/SportsModel/upcomingBySport.html create mode 100644 docs/models/UserModel-class.html create mode 100644 docs/models/UserModel/UserModel.html create mode 100644 docs/models/UserModel/adminScopes.html create mode 100644 docs/models/UserModel/data.html create mode 100644 docs/models/UserModel/init.html create mode 100644 docs/models/UserModel/isAdmin.html create mode 100644 docs/models/UserModel/subjects.html create mode 100644 docs/models/models-library.html create mode 100644 docs/pages/AdminCalendarPage-class.html create mode 100644 docs/pages/AdminCalendarPage/AdminCalendarPage.html create mode 100644 docs/pages/AdminCalendarPage/createState.html create mode 100644 docs/pages/AdminCalendarState-class.html create mode 100644 docs/pages/AdminCalendarState/AdminCalendarState.html create mode 100644 docs/pages/AdminCalendarState/build.html create mode 100644 docs/pages/AdminCalendarState/currentMonth.html create mode 100644 docs/pages/AdminCalendarState/dispose.html create mode 100644 docs/pages/AdminCalendarState/initState.html create mode 100644 docs/pages/AdminCalendarState/listener.html create mode 100644 docs/pages/AdminCalendarState/loopMonth.html create mode 100644 docs/pages/AdminCalendarState/model.html create mode 100644 docs/pages/AdminCalendarState/months-constant.html create mode 100644 docs/pages/AdminCalendarState/weekdays-constant.html create mode 100644 docs/pages/AdminSchedulesPage-class.html create mode 100644 docs/pages/AdminSchedulesPage/AdminSchedulesPage.html create mode 100644 docs/pages/AdminSchedulesPage/build.html create mode 100644 docs/pages/DayBuilder-class.html create mode 100644 docs/pages/DayBuilder/DayBuilder.html create mode 100644 docs/pages/DayBuilder/build.html create mode 100644 docs/pages/DayBuilder/date.html create mode 100644 docs/pages/DayBuilder/day.html create mode 100644 docs/pages/DayBuilder/upload.html create mode 100644 docs/pages/FeedbackPage-class.html create mode 100644 docs/pages/FeedbackPage/FeedbackPage.html create mode 100644 docs/pages/FeedbackPage/build.html create mode 100644 docs/pages/FormRow-class.html create mode 100644 docs/pages/FormRow/FormRow.editable.html create mode 100644 docs/pages/FormRow/FormRow.html create mode 100644 docs/pages/FormRow/build.html create mode 100644 docs/pages/FormRow/moreSpace.html create mode 100644 docs/pages/FormRow/picker.html create mode 100644 docs/pages/FormRow/sized.html create mode 100644 docs/pages/FormRow/title.html create mode 100644 docs/pages/GenericSportsView-class.html create mode 100644 docs/pages/GenericSportsView/GenericSportsView.html create mode 100644 docs/pages/GenericSportsView/build.html create mode 100644 docs/pages/GenericSportsView/builder.html create mode 100644 docs/pages/GenericSportsView/loading.html create mode 100644 docs/pages/GenericSportsView/onRefresh.html create mode 100644 docs/pages/GenericSportsView/recents.html create mode 100644 docs/pages/GenericSportsView/upcoming.html create mode 100644 docs/pages/HomePage-class.html create mode 100644 docs/pages/HomePage/HomePage.html create mode 100644 docs/pages/HomePage/createState.html create mode 100644 docs/pages/HomePage/pageIndex.html create mode 100644 docs/pages/HomePageState-class.html create mode 100644 docs/pages/HomePageState/HomePageState.html create mode 100644 docs/pages/HomePageState/build.html create mode 100644 docs/pages/HomePageState/index.html create mode 100644 docs/pages/HomePageState/initState.html create mode 100644 docs/pages/HomePageState/navItems.html create mode 100644 docs/pages/Login-class.html create mode 100644 docs/pages/Login/Login.html create mode 100644 docs/pages/Login/createState.html create mode 100644 docs/pages/Login/destination.html create mode 100644 docs/pages/LoginState-class.html create mode 100644 docs/pages/LoginState/LoginState.html create mode 100644 docs/pages/LoginState/build.html create mode 100644 docs/pages/LoginState/initState.html create mode 100644 docs/pages/LoginState/isLoading.html create mode 100644 docs/pages/LoginState/onError.html create mode 100644 docs/pages/LoginState/safely.html create mode 100644 docs/pages/LoginState/signIn.html create mode 100644 docs/pages/NavigationDrawer-class.html create mode 100644 docs/pages/NavigationDrawer/NavigationDrawer.html create mode 100644 docs/pages/NavigationDrawer/build.html create mode 100644 docs/pages/NavigationDrawer/getRouteName.html create mode 100644 docs/pages/NavigationDrawer/isScheduleAdmin.html create mode 100644 docs/pages/NavigationDrawer/isSportsAdmin.html create mode 100644 docs/pages/NavigationDrawer/pushRoute.html create mode 100644 docs/pages/OldCalendarWidget-class.html create mode 100644 docs/pages/OldCalendarWidget/OldCalendarWidget.html create mode 100644 docs/pages/OldCalendarWidget/build.html create mode 100644 docs/pages/ReminderBuilder-class.html create mode 100644 docs/pages/ReminderBuilder/ReminderBuilder.html create mode 100644 docs/pages/ReminderBuilder/buildReminder.html create mode 100644 docs/pages/ReminderBuilder/createState.html create mode 100644 docs/pages/ReminderBuilder/reminder.html create mode 100644 docs/pages/ReminderBuilder/trimString.html create mode 100644 docs/pages/ReminderBuilderState-class.html create mode 100644 docs/pages/ReminderBuilderState/ReminderBuilderState.html create mode 100644 docs/pages/ReminderBuilderState/build.html create mode 100644 docs/pages/ReminderBuilderState/controller.html create mode 100644 docs/pages/ReminderBuilderState/initState.html create mode 100644 docs/pages/ResponsiveReminders-class.html create mode 100644 docs/pages/ResponsiveReminders/ResponsiveReminders.html create mode 100644 docs/pages/ResponsiveReminders/appBar.html create mode 100644 docs/pages/ResponsiveReminders/build.html create mode 100644 docs/pages/ResponsiveReminders/floatingActionButton.html create mode 100644 docs/pages/ResponsiveReminders/model.html create mode 100644 docs/pages/ResponsiveSchedule-class.html create mode 100644 docs/pages/ResponsiveSchedule/ResponsiveSchedule.html create mode 100644 docs/pages/ResponsiveSchedule/appBar.html create mode 100644 docs/pages/ResponsiveSchedule/build.html create mode 100644 docs/pages/ResponsiveSchedule/floatingActionButton.html create mode 100644 docs/pages/ResponsiveSchedule/handleInvalidSchedule.html create mode 100644 docs/pages/ResponsiveSchedule/model.html create mode 100644 docs/pages/ResponsiveSchedule/viewDay.html create mode 100644 docs/pages/RouteInitializer-class.html create mode 100644 docs/pages/RouteInitializer/RouteInitializer.html create mode 100644 docs/pages/RouteInitializer/child.html create mode 100644 docs/pages/RouteInitializer/createState.html create mode 100644 docs/pages/RouteInitializer/isAllowed.html create mode 100644 docs/pages/RouteInitializer/isSignedIn.html create mode 100644 docs/pages/RouteInitializer/onError.html create mode 100644 docs/pages/RouteInitializer/onFailure.html create mode 100644 docs/pages/RouteInitializerState-class.html create mode 100644 docs/pages/RouteInitializerState/RouteInitializerState.html create mode 100644 docs/pages/RouteInitializerState/build.html create mode 100644 docs/pages/RouteInitializerState/init.html create mode 100644 docs/pages/RouteInitializerState/initFuture.html create mode 100644 docs/pages/RouteInitializerState/initState.html create mode 100644 docs/pages/Routes-class.html create mode 100644 docs/pages/Routes/Routes.html create mode 100644 docs/pages/Routes/calendar-constant.html create mode 100644 docs/pages/Routes/feedback-constant.html create mode 100644 docs/pages/Routes/hashCode.html create mode 100644 docs/pages/Routes/home-constant.html create mode 100644 docs/pages/Routes/login-constant.html create mode 100644 docs/pages/Routes/noSuchMethod.html create mode 100644 docs/pages/Routes/operator_equals.html create mode 100644 docs/pages/Routes/reminders-constant.html create mode 100644 docs/pages/Routes/runtimeType.html create mode 100644 docs/pages/Routes/schedule-constant.html create mode 100644 docs/pages/Routes/schedules-constant.html create mode 100644 docs/pages/Routes/sports-constant.html create mode 100644 docs/pages/Routes/toString.html create mode 100644 docs/pages/ScheduleBuilder-class.html create mode 100644 docs/pages/ScheduleBuilder/ScheduleBuilder.html create mode 100644 docs/pages/ScheduleBuilder/buildSchedule.html create mode 100644 docs/pages/ScheduleBuilder/createState.html create mode 100644 docs/pages/ScheduleBuilder/preset.html create mode 100644 docs/pages/ScheduleBuilderState-class.html create mode 100644 docs/pages/ScheduleBuilderState/ScheduleBuilderState.html create mode 100644 docs/pages/ScheduleBuilderState/build.html create mode 100644 docs/pages/ScheduleBuilderState/conflicting.html create mode 100644 docs/pages/ScheduleBuilderState/controller.html create mode 100644 docs/pages/ScheduleBuilderState/initState.html create mode 100644 docs/pages/SportBuilderState-class.html create mode 100644 docs/pages/SportBuilderState/SportBuilderState.html create mode 100644 docs/pages/SportBuilderState/build.html create mode 100644 docs/pages/SportBuilderState/initState.html create mode 100644 docs/pages/SportBuilderState/opponentController.html create mode 100644 docs/pages/SportBuilderState/teamController.html create mode 100644 docs/pages/SportsBuilder-class.html create mode 100644 docs/pages/SportsBuilder/SportsBuilder.html create mode 100644 docs/pages/SportsBuilder/createGame.html create mode 100644 docs/pages/SportsBuilder/createState.html create mode 100644 docs/pages/SportsBuilder/parent.html create mode 100644 docs/pages/SportsPage-class.html create mode 100644 docs/pages/SportsPage/SportsPage.html create mode 100644 docs/pages/SportsPage/build.html create mode 100644 docs/pages/buildAppBar.html create mode 100644 docs/pages/getLayout.html create mode 100644 docs/pages/openMenu.html create mode 100644 docs/pages/pages-library.html create mode 100644 docs/ramaz_services/Auth-class.html create mode 100644 docs/ramaz_services/Auth/Auth.html create mode 100644 docs/ramaz_services/Auth/adminScopes.html create mode 100644 docs/ramaz_services/Auth/auth.html create mode 100644 docs/ramaz_services/Auth/calendarScope-constant.html create mode 100644 docs/ramaz_services/Auth/claims.html create mode 100644 docs/ramaz_services/Auth/email.html create mode 100644 docs/ramaz_services/Auth/google.html create mode 100644 docs/ramaz_services/Auth/hashCode.html create mode 100644 docs/ramaz_services/Auth/isAdmin.html create mode 100644 docs/ramaz_services/Auth/isCalendarAdmin.html create mode 100644 docs/ramaz_services/Auth/isSignedIn.html create mode 100644 docs/ramaz_services/Auth/isSportsAdmin.html create mode 100644 docs/ramaz_services/Auth/name.html create mode 100644 docs/ramaz_services/Auth/noSuchMethod.html create mode 100644 docs/ramaz_services/Auth/operator_equals.html create mode 100644 docs/ramaz_services/Auth/runtimeType.html create mode 100644 docs/ramaz_services/Auth/signIn.html create mode 100644 docs/ramaz_services/Auth/signOut.html create mode 100644 docs/ramaz_services/Auth/sportsScope-constant.html create mode 100644 docs/ramaz_services/Auth/toString.html create mode 100644 docs/ramaz_services/Crashlytics-class.html create mode 100644 docs/ramaz_services/Crashlytics/Crashlytics.html create mode 100644 docs/ramaz_services/Crashlytics/didCrashLastTime.html create mode 100644 docs/ramaz_services/Crashlytics/hashCode.html create mode 100644 docs/ramaz_services/Crashlytics/init.html create mode 100644 docs/ramaz_services/Crashlytics/instance.html create mode 100644 docs/ramaz_services/Crashlytics/log.html create mode 100644 docs/ramaz_services/Crashlytics/noSuchMethod.html create mode 100644 docs/ramaz_services/Crashlytics/operator_equals.html create mode 100644 docs/ramaz_services/Crashlytics/recordError.html create mode 100644 docs/ramaz_services/Crashlytics/recordFlutterError.html create mode 100644 docs/ramaz_services/Crashlytics/runtimeType.html create mode 100644 docs/ramaz_services/Crashlytics/setEmail.html create mode 100644 docs/ramaz_services/Crashlytics/signIn.html create mode 100644 docs/ramaz_services/Crashlytics/toString.html create mode 100644 docs/ramaz_services/Crashlytics/toggle.html create mode 100644 docs/ramaz_services/NoAccountException-class.html create mode 100644 docs/ramaz_services/NoAccountException/NoAccountException.html create mode 100644 docs/ramaz_services/NoAccountException/hashCode.html create mode 100644 docs/ramaz_services/NoAccountException/noSuchMethod.html create mode 100644 docs/ramaz_services/NoAccountException/operator_equals.html create mode 100644 docs/ramaz_services/NoAccountException/runtimeType.html create mode 100644 docs/ramaz_services/NoAccountException/toString.html create mode 100644 docs/ramaz_services/Notification-class.html create mode 100644 docs/ramaz_services/Notification/Notification.html create mode 100644 docs/ramaz_services/Notification/Notification.reminder.html create mode 100644 docs/ramaz_services/Notification/hashCode.html create mode 100644 docs/ramaz_services/Notification/id-constant.html create mode 100644 docs/ramaz_services/Notification/message.html create mode 100644 docs/ramaz_services/Notification/noSuchMethod.html create mode 100644 docs/ramaz_services/Notification/operator_equals.html create mode 100644 docs/ramaz_services/Notification/runtimeType.html create mode 100644 docs/ramaz_services/Notification/title.html create mode 100644 docs/ramaz_services/Notification/toString.html create mode 100644 docs/ramaz_services/Notifications-class.html create mode 100644 docs/ramaz_services/Notifications/Notifications.html create mode 100644 docs/ramaz_services/Notifications/cancelAll.html create mode 100644 docs/ramaz_services/Notifications/hashCode.html create mode 100644 docs/ramaz_services/Notifications/init.html create mode 100644 docs/ramaz_services/Notifications/instance.html create mode 100644 docs/ramaz_services/Notifications/noSuchMethod.html create mode 100644 docs/ramaz_services/Notifications/operator_equals.html create mode 100644 docs/ramaz_services/Notifications/pendingNotifications.html create mode 100644 docs/ramaz_services/Notifications/runtimeType.html create mode 100644 docs/ramaz_services/Notifications/scheduleNotification.html create mode 100644 docs/ramaz_services/Notifications/sendNotification.html create mode 100644 docs/ramaz_services/Notifications/signIn.html create mode 100644 docs/ramaz_services/Notifications/toString.html create mode 100644 docs/ramaz_services/Preferences-class.html create mode 100644 docs/ramaz_services/Preferences/Preferences.html create mode 100644 docs/ramaz_services/Preferences/brightness.html create mode 100644 docs/ramaz_services/Preferences/firstTime.html create mode 100644 docs/ramaz_services/Preferences/firstTimeKey-constant.html create mode 100644 docs/ramaz_services/Preferences/hashCode.html create mode 100644 docs/ramaz_services/Preferences/init.html create mode 100644 docs/ramaz_services/Preferences/lightMode-constant.html create mode 100644 docs/ramaz_services/Preferences/noSuchMethod.html create mode 100644 docs/ramaz_services/Preferences/operator_equals.html create mode 100644 docs/ramaz_services/Preferences/runtimeType.html create mode 100644 docs/ramaz_services/Preferences/signIn.html create mode 100644 docs/ramaz_services/Preferences/toString.html create mode 100644 docs/ramaz_services/Services-class.html create mode 100644 docs/ramaz_services/Services/Services.html create mode 100644 docs/ramaz_services/Services/crashlytics.html create mode 100644 docs/ramaz_services/Services/database.html create mode 100644 docs/ramaz_services/Services/hashCode.html create mode 100644 docs/ramaz_services/Services/init.html create mode 100644 docs/ramaz_services/Services/instance.html create mode 100644 docs/ramaz_services/Services/isReady.html create mode 100644 docs/ramaz_services/Services/noSuchMethod.html create mode 100644 docs/ramaz_services/Services/notifications.html create mode 100644 docs/ramaz_services/Services/operator_equals.html create mode 100644 docs/ramaz_services/Services/prefs.html create mode 100644 docs/ramaz_services/Services/pushNotifications.html create mode 100644 docs/ramaz_services/Services/runtimeType.html create mode 100644 docs/ramaz_services/Services/services.html create mode 100644 docs/ramaz_services/Services/signIn.html create mode 100644 docs/ramaz_services/Services/toString.html create mode 100644 docs/ramaz_services/ramaz_services-library.html create mode 100644 docs/static-assets/favicon.png create mode 100644 docs/static-assets/github.css create mode 100644 docs/static-assets/highlight.pack.js create mode 100644 docs/static-assets/play_button.svg create mode 100644 docs/static-assets/readme.md create mode 100644 docs/static-assets/script.js create mode 100644 docs/static-assets/styles.css create mode 100644 docs/widgets/ActivityTile-class.html create mode 100644 docs/widgets/ActivityTile/ActivityTile.html create mode 100644 docs/widgets/ActivityTile/activity.html create mode 100644 docs/widgets/ActivityTile/build.html create mode 100644 docs/widgets/ActivityTile/detailedActivities-constant.html create mode 100644 docs/widgets/BrightnessChanger-class.html create mode 100644 docs/widgets/BrightnessChanger/BrightnessChanger.dropdown.html create mode 100644 docs/widgets/BrightnessChanger/BrightnessChanger.html create mode 100644 docs/widgets/BrightnessChanger/BrightnessChanger.iconButton.html create mode 100644 docs/widgets/BrightnessChanger/createState.html create mode 100644 docs/widgets/BrightnessChanger/form.html create mode 100644 docs/widgets/BrightnessChangerForm-class.html create mode 100644 docs/widgets/BrightnessChangerForm/hashCode.html create mode 100644 docs/widgets/BrightnessChangerForm/noSuchMethod.html create mode 100644 docs/widgets/BrightnessChangerForm/operator_equals.html create mode 100644 docs/widgets/BrightnessChangerForm/runtimeType.html create mode 100644 docs/widgets/BrightnessChangerForm/toString.html create mode 100644 docs/widgets/BrightnessChangerState-class.html create mode 100644 docs/widgets/BrightnessChangerState/BrightnessChangerState.html create mode 100644 docs/widgets/BrightnessChangerState/build.html create mode 100644 docs/widgets/BrightnessChangerState/buttonToggle.html create mode 100644 docs/widgets/BrightnessChangerState/icon.html create mode 100644 docs/widgets/BrightnessChangerState/setBrightness.html create mode 100644 docs/widgets/CalendarTile-class.html create mode 100644 docs/widgets/CalendarTile/CalendarTile.html create mode 100644 docs/widgets/CalendarTile/blank-constant.html create mode 100644 docs/widgets/CalendarTile/build.html create mode 100644 docs/widgets/CalendarTile/date.html create mode 100644 docs/widgets/CalendarTile/day.html create mode 100644 docs/widgets/ClassList-class.html create mode 100644 docs/widgets/ClassList/ClassList.html create mode 100644 docs/widgets/ClassList/build.html create mode 100644 docs/widgets/ClassList/day.html create mode 100644 docs/widgets/ClassList/getPanel.html create mode 100644 docs/widgets/ClassList/headerText.html create mode 100644 docs/widgets/ClassList/periods.html create mode 100644 docs/widgets/ClassPanel-class.html create mode 100644 docs/widgets/ClassPanel/ClassPanel.html create mode 100644 docs/widgets/ClassPanel/activity.html create mode 100644 docs/widgets/ClassPanel/build.html create mode 100644 docs/widgets/ClassPanel/children.html create mode 100644 docs/widgets/ClassPanel/reminders.html create mode 100644 docs/widgets/ClassPanel/title.html create mode 100644 docs/widgets/Footer-class.html create mode 100644 docs/widgets/Footer/Footer.html create mode 100644 docs/widgets/Footer/build.html create mode 100644 docs/widgets/Footer/textScale-constant.html create mode 100644 docs/widgets/LayoutInfo-class.html create mode 100644 docs/widgets/LayoutInfo/LayoutInfo.html create mode 100644 docs/widgets/LayoutInfo/hasBottomNavBar.html create mode 100644 docs/widgets/LayoutInfo/hasNavRail.html create mode 100644 docs/widgets/LayoutInfo/hasStandardDrawer.html create mode 100644 docs/widgets/LayoutInfo/hasStandardSideSheet.html create mode 100644 docs/widgets/LayoutInfo/hashCode.html create mode 100644 docs/widgets/LayoutInfo/isDesktop.html create mode 100644 docs/widgets/LayoutInfo/isMobile.html create mode 100644 docs/widgets/LayoutInfo/isTabletLandscape.html create mode 100644 docs/widgets/LayoutInfo/isTabletPortrait.html create mode 100644 docs/widgets/LayoutInfo/noSuchMethod.html create mode 100644 docs/widgets/LayoutInfo/operator_equals.html create mode 100644 docs/widgets/LayoutInfo/runtimeType.html create mode 100644 docs/widgets/LayoutInfo/toString.html create mode 100644 docs/widgets/LayoutInfo/windowType.html create mode 100644 docs/widgets/LinkIcon-class.html create mode 100644 docs/widgets/LinkIcon/LinkIcon.html create mode 100644 docs/widgets/LinkIcon/build.html create mode 100644 docs/widgets/LinkIcon/path.html create mode 100644 docs/widgets/LinkIcon/url.html create mode 100644 docs/widgets/LoadingImage-class.html create mode 100644 docs/widgets/LoadingImage/LoadingImage.html create mode 100644 docs/widgets/LoadingImage/aspectRatio.html create mode 100644 docs/widgets/LoadingImage/createState.html create mode 100644 docs/widgets/LoadingImage/image.html create mode 100644 docs/widgets/LoadingImageState-class.html create mode 100644 docs/widgets/LoadingImageState/LoadingImageState.html create mode 100644 docs/widgets/LoadingImageState/aspectRatio.html create mode 100644 docs/widgets/LoadingImageState/build.html create mode 100644 docs/widgets/LoadingImageState/dispose.html create mode 100644 docs/widgets/LoadingImageState/initState.html create mode 100644 docs/widgets/LoadingImageState/listener.html create mode 100644 docs/widgets/LoadingImageState/loading.html create mode 100644 docs/widgets/LoadingImageState/onLoad.html create mode 100644 docs/widgets/LoadingImageState/stream.html create mode 100644 docs/widgets/Logos-class.html create mode 100644 docs/widgets/Logos/Logos.html create mode 100644 docs/widgets/Logos/drive-constant.html create mode 100644 docs/widgets/Logos/google-constant.html create mode 100644 docs/widgets/Logos/hashCode.html create mode 100644 docs/widgets/Logos/noSuchMethod.html create mode 100644 docs/widgets/Logos/operator_equals.html create mode 100644 docs/widgets/Logos/outlook-constant.html create mode 100644 docs/widgets/Logos/ramazIcon-constant.html create mode 100644 docs/widgets/Logos/runtimeType.html create mode 100644 docs/widgets/Logos/schoology-constant.html create mode 100644 docs/widgets/Logos/seniorSystems-constant.html create mode 100644 docs/widgets/Logos/toString.html create mode 100644 docs/widgets/ModelBuilder.html create mode 100644 docs/widgets/ModelListener-class.html create mode 100644 docs/widgets/ModelListener/ModelListener.html create mode 100644 docs/widgets/ModelListener/builder.html create mode 100644 docs/widgets/ModelListener/child.html create mode 100644 docs/widgets/ModelListener/createState.html create mode 100644 docs/widgets/ModelListener/dispose.html create mode 100644 docs/widgets/ModelListener/model.html create mode 100644 docs/widgets/ModelListenerState-class.html create mode 100644 docs/widgets/ModelListenerState/ModelListenerState.html create mode 100644 docs/widgets/ModelListenerState/build.html create mode 100644 docs/widgets/ModelListenerState/dispose.html create mode 100644 docs/widgets/ModelListenerState/initState.html create mode 100644 docs/widgets/ModelListenerState/listener.html create mode 100644 docs/widgets/ModelListenerState/model.html create mode 100644 docs/widgets/NavigationItem-class.html create mode 100644 docs/widgets/NavigationItem/NavigationItem.html create mode 100644 docs/widgets/NavigationItem/appBar.html create mode 100644 docs/widgets/NavigationItem/bottomNavBar.html create mode 100644 docs/widgets/NavigationItem/floatingActionButton.html create mode 100644 docs/widgets/NavigationItem/floatingActionButtonLocation.html create mode 100644 docs/widgets/NavigationItem/icon.html create mode 100644 docs/widgets/NavigationItem/label.html create mode 100644 docs/widgets/NavigationItem/navRail.html create mode 100644 docs/widgets/NavigationItem/sideSheet.html create mode 100644 docs/widgets/NextClass-class.html create mode 100644 docs/widgets/NextClass/NextClass.html create mode 100644 docs/widgets/NextClass/build.html create mode 100644 docs/widgets/NextClass/next.html create mode 100644 docs/widgets/NextClass/period.html create mode 100644 docs/widgets/NextClass/reminders.html create mode 100644 docs/widgets/NextClass/subject.html create mode 100644 docs/widgets/PeriodTile-class.html create mode 100644 docs/widgets/PeriodTile/PeriodTile.html create mode 100644 docs/widgets/PeriodTile/activity.html create mode 100644 docs/widgets/PeriodTile/build.html create mode 100644 docs/widgets/PeriodTile/end.html create mode 100644 docs/widgets/PeriodTile/getRange.html create mode 100644 docs/widgets/PeriodTile/index.html create mode 100644 docs/widgets/PeriodTile/model.html create mode 100644 docs/widgets/PeriodTile/range.html create mode 100644 docs/widgets/PeriodTile/start.html create mode 100644 docs/widgets/RamazLogos-class.html create mode 100644 docs/widgets/RamazLogos/RamazLogos.html create mode 100644 docs/widgets/RamazLogos/hashCode.html create mode 100644 docs/widgets/RamazLogos/noSuchMethod.html create mode 100644 docs/widgets/RamazLogos/operator_equals.html create mode 100644 docs/widgets/RamazLogos/ramRectangle-constant.html create mode 100644 docs/widgets/RamazLogos/ramSquare-constant.html create mode 100644 docs/widgets/RamazLogos/ramSquareWords-constant.html create mode 100644 docs/widgets/RamazLogos/runtimeType.html create mode 100644 docs/widgets/RamazLogos/teal-constant.html create mode 100644 docs/widgets/RamazLogos/toString.html create mode 100644 docs/widgets/ReminderTile-class.html create mode 100644 docs/widgets/ReminderTile/ReminderTile.html create mode 100644 docs/widgets/ReminderTile/build.html create mode 100644 docs/widgets/ReminderTile/height.html create mode 100644 docs/widgets/ReminderTile/index.html create mode 100644 docs/widgets/ResponsiveBuilder-class.html create mode 100644 docs/widgets/ResponsiveBuilder/ResponsiveBuilder.html create mode 100644 docs/widgets/ResponsiveBuilder/build.html create mode 100644 docs/widgets/ResponsiveBuilder/builder.html create mode 100644 docs/widgets/ResponsiveBuilder/child.html create mode 100644 docs/widgets/ResponsiveScaffold-class.html create mode 100644 docs/widgets/ResponsiveScaffold/ResponsiveScaffold.html create mode 100644 docs/widgets/ResponsiveScaffold/ResponsiveScaffold.navBar.html create mode 100644 docs/widgets/ResponsiveScaffold/appBar.html create mode 100644 docs/widgets/ResponsiveScaffold/bodyBuilder.html create mode 100644 docs/widgets/ResponsiveScaffold/build.html create mode 100644 docs/widgets/ResponsiveScaffold/drawer.html create mode 100644 docs/widgets/ResponsiveScaffold/floatingActionButton.html create mode 100644 docs/widgets/ResponsiveScaffold/floatingActionButtonLocation.html create mode 100644 docs/widgets/ResponsiveScaffold/hasNavBar.html create mode 100644 docs/widgets/ResponsiveScaffold/navIndex.html create mode 100644 docs/widgets/ResponsiveScaffold/navItems.html create mode 100644 docs/widgets/ResponsiveScaffold/onNavIndexChanged.html create mode 100644 docs/widgets/ResponsiveScaffold/secondaryDrawer.html create mode 100644 docs/widgets/ResponsiveScaffold/sideSheet.html create mode 100644 docs/widgets/ResponsiveWidgetBuilder.html create mode 100644 docs/widgets/ScoreUpdaterState-class.html create mode 100644 docs/widgets/ScoreUpdaterState/ScoreUpdaterState.html create mode 100644 docs/widgets/ScoreUpdaterState/build.html create mode 100644 docs/widgets/ScoreUpdaterState/initState.html create mode 100644 docs/widgets/ScoreUpdaterState/otherController.html create mode 100644 docs/widgets/ScoreUpdaterState/otherScore.html create mode 100644 docs/widgets/ScoreUpdaterState/ramazController.html create mode 100644 docs/widgets/ScoreUpdaterState/ramazScore.html create mode 100644 docs/widgets/ScoreUpdaterState/ready.html create mode 100644 docs/widgets/ScoreUpdaterState/scores.html create mode 100644 docs/widgets/SpecialTile-class.html create mode 100644 docs/widgets/SpecialTile/SpecialTile.html create mode 100644 docs/widgets/SpecialTile/build.html create mode 100644 docs/widgets/SpecialTile/child.html create mode 100644 docs/widgets/SportsIcons-class.html create mode 100644 docs/widgets/SportsIcons/SportsIcons.html create mode 100644 docs/widgets/SportsIcons/baseball-constant.html create mode 100644 docs/widgets/SportsIcons/basketball-constant.html create mode 100644 docs/widgets/SportsIcons/hashCode.html create mode 100644 docs/widgets/SportsIcons/hockey-constant.html create mode 100644 docs/widgets/SportsIcons/noSuchMethod.html create mode 100644 docs/widgets/SportsIcons/operator_equals.html create mode 100644 docs/widgets/SportsIcons/runtimeType.html create mode 100644 docs/widgets/SportsIcons/soccer-constant.html create mode 100644 docs/widgets/SportsIcons/tennis-constant.html create mode 100644 docs/widgets/SportsIcons/toString.html create mode 100644 docs/widgets/SportsIcons/volleyball-constant.html create mode 100644 docs/widgets/SportsScoreUpdater-class.html create mode 100644 docs/widgets/SportsScoreUpdater/SportsScoreUpdater.html create mode 100644 docs/widgets/SportsScoreUpdater/createState.html create mode 100644 docs/widgets/SportsScoreUpdater/game.html create mode 100644 docs/widgets/SportsScoreUpdater/updateScores.html create mode 100644 docs/widgets/SportsStats-class.html create mode 100644 docs/widgets/SportsStats/SportsStats.html create mode 100644 docs/widgets/SportsStats/build.html create mode 100644 docs/widgets/SportsStats/dateTime.html create mode 100644 docs/widgets/SportsStats/score.html create mode 100644 docs/widgets/SportsStats/team.html create mode 100644 docs/widgets/SportsTile-class.html create mode 100644 docs/widgets/SportsTile/SportsTile.html create mode 100644 docs/widgets/SportsTile/build.html create mode 100644 docs/widgets/SportsTile/cardColor.html create mode 100644 docs/widgets/SportsTile/formatDate.html create mode 100644 docs/widgets/SportsTile/game.html create mode 100644 docs/widgets/SportsTile/icon.html create mode 100644 docs/widgets/SportsTile/onTap.html create mode 100644 docs/widgets/SportsTile/padLength.html create mode 100644 docs/widgets/ThemeBuilder.html create mode 100644 docs/widgets/ThemeChanger-class.html create mode 100644 docs/widgets/ThemeChanger/ThemeChanger.html create mode 100644 docs/widgets/ThemeChanger/builder.html create mode 100644 docs/widgets/ThemeChanger/createState.html create mode 100644 docs/widgets/ThemeChanger/dark.html create mode 100644 docs/widgets/ThemeChanger/defaultBrightness.html create mode 100644 docs/widgets/ThemeChanger/light.html create mode 100644 docs/widgets/ThemeChanger/of.html create mode 100644 docs/widgets/ThemeChanger/themes.html create mode 100644 docs/widgets/ThemeChangerState-class.html create mode 100644 docs/widgets/ThemeChangerState/ThemeChangerState.html create mode 100644 docs/widgets/ThemeChangerState/brightness.html create mode 100644 docs/widgets/ThemeChangerState/build.html create mode 100644 docs/widgets/ThemeChangerState/initState.html create mode 100644 docs/widgets/ThemeChangerState/theme.html create mode 100644 docs/widgets/ThemeChangerState/themeName.html create mode 100644 docs/widgets/caseConverter.html create mode 100644 docs/widgets/pickDate.html create mode 100644 docs/widgets/widgets-library.html diff --git a/docs/__404error.html b/docs/__404error.html new file mode 100644 index 000000000..c96d986bb --- /dev/null +++ b/docs/__404error.html @@ -0,0 +1,109 @@ + + + + + + + + + ramaz - Dart API docs + + + + + + + + + + + + + + + + +
+ +
+ + +
ramaz
+ +
+ +
+ + + + +
+

404: Something's gone wrong :-(

+ +
+

You've tried to visit a page that doesn't exist. Luckily this site + has other pages.

+

If you were looking for something specific, try searching: +

+

+ +
+
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/app/RamLife-class.html b/docs/app/RamLife-class.html new file mode 100644 index 000000000..c5f6ed601 --- /dev/null +++ b/docs/app/RamLife-class.html @@ -0,0 +1,417 @@ + + + + + + + + RamLife class - app library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
RamLife
+ +
+ +
+ + + + +
+
+ +

RamLife class + Null safety + +

+ + +
+

The main app widget.

+
+ + +
+
+
Inheritance
+
+ + + + + +
+
+ +
+

Constructors

+ +
+
+ RamLife() +
+
+ Provides a const constructor. +
const
+
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
@nonVirtual, read-only, inherited
+ +
+ +
+ key + Key? + +
+
+ Controls how one widget replaces another widget in the tree. [...] +
final, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ build(BuildContext context) + Widget + + + +
+
+ Describes the part of the user interface represented by this widget. [...] +
override
+ +
+ +
+ createElement() + StatelessElement + + + +
+
+ Creates a StatelessElement to manage this widget's location in the tree. [...] +
inherited
+ +
+ +
+ debugDescribeChildren() + → List<DiagnosticsNode> + + + +
+
+ Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
@protected, inherited
+ +
+ +
+ debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
+
+ Add additional properties associated with the node. [...] +
inherited
+ +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
+
+ Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
inherited
+ +
+ +
+ toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+ toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
+
+ Returns a string representation of this node and its descendants. [...] +
inherited
+ +
+ +
+ toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
+
+ Returns a one-line detailed description of the object. [...] +
inherited
+ +
+ +
+ toStringShort() + → String + + + +
+
+ A short, textual description of this widget. +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
@nonVirtual, inherited
+ +
+ +
+
+ +
+

Static Properties

+ +
+
+ routes + → Map<String, WidgetBuilder> + +
+
+ The routes for this app. +
final
+ +
+ +
+
+ +
+

Static Methods

+
+
+ hasAdminScope(AdminScope scope) + → bool + + + +
+
+ + + +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/app/RamLife/RamLife.html b/docs/app/RamLife/RamLife.html new file mode 100644 index 000000000..9694b2b20 --- /dev/null +++ b/docs/app/RamLife/RamLife.html @@ -0,0 +1,149 @@ + + + + + + + + RamLife constructor - RamLife class - app library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
RamLife
+ +
+ +
+ + + + +
+
+ +

RamLife constructor + Null safety +

+ +
const + RamLife() +
+ + +
+

Provides a const constructor.

+
+ + + +
+

Implementation

+
const RamLife();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/app/RamLife/build.html b/docs/app/RamLife/build.html new file mode 100644 index 000000000..04ab6187b --- /dev/null +++ b/docs/app/RamLife/build.html @@ -0,0 +1,270 @@ + + + + + + + + build method - RamLife class - app library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
build
+ +
+ +
+ + + + +
+
+ +

build method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +Widget +build(
  1. BuildContext context
  2. +
) + +
override
+ +
+ +
+

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+
+ + + +
+

Implementation

+
@override
+Widget build (BuildContext context) => ThemeChanger(
+	defaultBrightness: Brightness.light,
+	light: ThemeData (
+		brightness: Brightness.light,
+		primarySwatch: Colors.blue,
+		primaryColor: RamazColors.blue,
+		primaryColorBrightness: Brightness.dark,
+		primaryColorLight: RamazColors.blueLight,
+		primaryColorDark: RamazColors.blueDark,
+		accentColor: RamazColors.gold,
+		accentColorBrightness: Brightness.light,
+		textSelectionTheme: const TextSelectionThemeData(
+			cursorColor: RamazColors.blueLight,
+			selectionHandleColor: RamazColors.blueLight,
+		),
+		buttonColor: RamazColors.gold,
+		buttonTheme: const ButtonThemeData (
+			buttonColor: RamazColors.gold,
+			textTheme: ButtonTextTheme.normal,
+		),
+		elevatedButtonTheme: ElevatedButtonThemeData(
+			style: ButtonStyle(
+				backgroundColor: MaterialStateProperty.all(RamazColors.gold)
+			)
+		)
+	),
+	dark: ThemeData(
+		brightness: Brightness.dark,
+		scaffoldBackgroundColor: Colors.grey[850],
+		primarySwatch: Colors.blue,
+		primaryColorBrightness: Brightness.dark,
+		primaryColorLight: RamazColors.blueLight,
+		primaryColorDark: RamazColors.blueDark,
+		accentColor: RamazColors.goldDark,
+		accentColorBrightness: Brightness.light,
+		iconTheme: const IconThemeData (color: RamazColors.goldDark),
+		primaryIconTheme: const IconThemeData (color: RamazColors.goldDark),
+		accentIconTheme: const IconThemeData (color: RamazColors.goldDark),
+		floatingActionButtonTheme: const FloatingActionButtonThemeData(
+			backgroundColor: RamazColors.goldDark,
+			foregroundColor: RamazColors.blue
+		),
+		textSelectionTheme: const TextSelectionThemeData(
+			cursorColor: RamazColors.blueLight,
+			selectionHandleColor: RamazColors.blueLight,
+		),
+		cardTheme: CardTheme (
+			color: Colors.grey[820]
+		),
+		toggleableActiveColor: RamazColors.blueLight,
+		buttonColor: RamazColors.blueDark,
+		buttonTheme: const ButtonThemeData (
+			buttonColor: RamazColors.blueDark,
+			textTheme: ButtonTextTheme.accent,
+		),
+		elevatedButtonTheme: ElevatedButtonThemeData(
+			style: ButtonStyle(
+				backgroundColor: MaterialStateProperty.all(RamazColors.blueDark)
+			)
+		),
+	),
+	builder: (BuildContext context, ThemeData theme) => MaterialApp (
+		initialRoute: Routes.home,
+		title: "Ram Life",
+		color: RamazColors.blue,
+		theme: theme,
+		onGenerateRoute: (RouteSettings settings) => PageRouteBuilder(
+        settings: settings,
+        transitionDuration: Duration.zero,
+        pageBuilder: (BuildContext context, __, ___) {
+        	final String routeName =
+        		(settings.name == null || !routes.containsKey(settings.name))
+        		? Routes.home : settings.name!;
+        return routes [routeName]! (context);
+        },
+      )
+	)
+);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/app/RamLife/hasAdminScope.html b/docs/app/RamLife/hasAdminScope.html new file mode 100644 index 000000000..5a6fb291f --- /dev/null +++ b/docs/app/RamLife/hasAdminScope.html @@ -0,0 +1,154 @@ + + + + + + + + hasAdminScope method - RamLife class - app library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hasAdminScope
+ +
+ +
+ + + + +
+
+ +

hasAdminScope method + Null safety +

+ +
+ + +bool +hasAdminScope(
  1. AdminScope scope
  2. +
) + + + +
+ + + + +
+

Implementation

+
static bool hasAdminScope(AdminScope scope) => Auth.isSignedIn
+	&& Models.instance.user.isAdmin
+	&& Models.instance.user.adminScopes!.contains(scope);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/app/RamLife/routes.html b/docs/app/RamLife/routes.html new file mode 100644 index 000000000..a395179a4 --- /dev/null +++ b/docs/app/RamLife/routes.html @@ -0,0 +1,181 @@ + + + + + + + + routes property - RamLife class - app library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
routes
+ +
+ +
+ + + + +
+
+ +

routes property + Null safety +

+ +
+ Map<String, WidgetBuilder> + routes +
final
+ +
+ +
+

The routes for this app.

+
+ + +
+

Implementation

+
static final Map<String, WidgetBuilder> routes = {
+	Routes.login: (_) => RouteInitializer(
+		onError: null ,
+		isAllowed: () => true,
+		child: const Login(),
+	),
+	Routes.home: (_) => const RouteInitializer(
+		child: HomePage(),
+	),
+	Routes.schedule: (_) => const RouteInitializer(
+		child: HomePage(pageIndex: 1),
+	),
+	Routes.reminders: (_) => const RouteInitializer(
+		child: HomePage(pageIndex: 2),
+	),
+	Routes.feedback: (_) => const RouteInitializer(
+		child: FeedbackPage(),
+	),
+	Routes.calendar: (_) => RouteInitializer(
+		isAllowed: () => hasAdminScope(AdminScope.calendar),
+		child: const AdminCalendarPage(),
+	),
+	Routes.schedules: (_) => RouteInitializer(
+		isAllowed: () => hasAdminScope(AdminScope.calendar),
+		child: const AdminSchedulesPage(),
+	),
+	Routes.sports: (_) => const RouteInitializer(
+		child: SportsPage(),
+	),
+};
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/app/app-library.html b/docs/app/app-library.html new file mode 100644 index 000000000..ee199a1e1 --- /dev/null +++ b/docs/app/app-library.html @@ -0,0 +1,145 @@ + + + + + + + + app library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
app
+ +
+ +
+ + + + +
+
+ +

app library + Null safety + +

+ + + + +
+

Classes

+ +
+
+ RamLife + +
+
+ The main app widget. +
+ +
+
+ + + + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/categories.json b/docs/categories.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/docs/categories.json @@ -0,0 +1 @@ +[] diff --git a/docs/constants/DayComparison.html b/docs/constants/DayComparison.html new file mode 100644 index 000000000..348ec5e8e --- /dev/null +++ b/docs/constants/DayComparison.html @@ -0,0 +1,167 @@ + + + + + + + + DayComparison extension - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
DayComparison
+ +
+ +
+ + + + +
+
+ +

DayComparison extension + Null safety + +

+ + +
+

Has a method for checking if a DateTime is the same day as another.

+
+ +
+
+
on
+
+
    +
  • DateTime
  • +
+
+
+
+ + +
+

Methods

+
+
+ isSameDay(DateTime other) + → bool + + + +
+
+ Returns true if other is the same days as this date. + + +
+ +
+
+ + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/DayComparison/isSameDay.html b/docs/constants/DayComparison/isSameDay.html new file mode 100644 index 000000000..008bf5543 --- /dev/null +++ b/docs/constants/DayComparison/isSameDay.html @@ -0,0 +1,134 @@ + + + + + + + + isSameDay method - DayComparison extension - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
isSameDay
+ +
+ +
+ + + + +
+
+ +

isSameDay method + Null safety +

+ +
+ + +bool +isSameDay(
  1. DateTime other
  2. +
) + + + +
+ +
+

Returns true if other is the same days as this date.

+
+ + + +
+

Implementation

+
bool isSameDay(DateTime other) => other.year == year &&
+	other.month == month &&
+	other.day == day;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors-class.html b/docs/constants/RamazColors-class.html new file mode 100644 index 000000000..614522eaf --- /dev/null +++ b/docs/constants/RamazColors-class.html @@ -0,0 +1,346 @@ + + + + + + + + RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
RamazColors
+ +
+ +
+ + + + +
+
+ +

RamazColors class + Null safety + +

+ + +
+

A container for Ramaz-specific colors

+

blue and gold were taken from seniorelectives.ramaz.org

+

The other variants were taken from: +https://material.io/resources/color/#!/?view.left=0&view.right=0&primary.color=074d92&secondary.color=fcc30c

+
+ + + +
+

Constructors

+ +
+
+ RamazColors() +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + +
+

Constants

+ +
+
+ blue + → const Color + + +
+
+ Ramaz's brand blue. + + +
+ const Color(0xff074d92) +
+
+ +
+ blueDark + → const Color + + +
+
+ The material-specific dark variant of blue. + + +
+ const Color(0xff002664) +
+
+ +
+ blueLight + → const Color + + +
+
+ The material-specific light variant of blue. + + +
+ const Color(0xff4e78c3) +
+
+ +
+ gold + → const Color + + +
+
+ Ramaz's brand gold. + + +
+ const Color(0xfffcc30c) +
+
+ +
+ goldDark + → const Color + + +
+
+ The material-specific dark variant of gold. + + +
+ const Color(0xffc49300) +
+
+ +
+ goldLight + → const Color + + +
+
+ The material-specific light variant of gold. + + +
+ const Color(0xfffff552) +
+
+ +
+
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/RamazColors.html b/docs/constants/RamazColors/RamazColors.html new file mode 100644 index 000000000..8d7cd64f2 --- /dev/null +++ b/docs/constants/RamazColors/RamazColors.html @@ -0,0 +1,136 @@ + + + + + + + + RamazColors constructor - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
RamazColors
+ +
+ +
+ + + + +
+
+ +

RamazColors constructor + Null safety +

+ +
+ RamazColors() +
+ + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/blue-constant.html b/docs/constants/RamazColors/blue-constant.html new file mode 100644 index 000000000..23ae6b11f --- /dev/null +++ b/docs/constants/RamazColors/blue-constant.html @@ -0,0 +1,146 @@ + + + + + + + + blue constant - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
blue
+ +
+ +
+ + + + +
+
+ +

blue constant + Null safety +

+ +
+ Color + const blue + + +
+ +
+

Ramaz's brand blue.

+
+ + +
+

Implementation

+
static const Color blue = Color(0xff074d92);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/blueDark-constant.html b/docs/constants/RamazColors/blueDark-constant.html new file mode 100644 index 000000000..2b50ab396 --- /dev/null +++ b/docs/constants/RamazColors/blueDark-constant.html @@ -0,0 +1,146 @@ + + + + + + + + blueDark constant - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
blueDark
+ +
+ +
+ + + + +
+
+ +

blueDark constant + Null safety +

+ +
+ Color + const blueDark + + +
+ +
+

The material-specific dark variant of blue.

+
+ + +
+

Implementation

+
static const Color blueDark = Color (0xff002664);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/blueLight-constant.html b/docs/constants/RamazColors/blueLight-constant.html new file mode 100644 index 000000000..ac00a61a2 --- /dev/null +++ b/docs/constants/RamazColors/blueLight-constant.html @@ -0,0 +1,146 @@ + + + + + + + + blueLight constant - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
blueLight
+ +
+ +
+ + + + +
+
+ +

blueLight constant + Null safety +

+ +
+ Color + const blueLight + + +
+ +
+

The material-specific light variant of blue.

+
+ + +
+

Implementation

+
static const Color blueLight = Color(0xff4e78c3);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/gold-constant.html b/docs/constants/RamazColors/gold-constant.html new file mode 100644 index 000000000..90ef99105 --- /dev/null +++ b/docs/constants/RamazColors/gold-constant.html @@ -0,0 +1,146 @@ + + + + + + + + gold constant - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
gold
+ +
+ +
+ + + + +
+
+ +

gold constant + Null safety +

+ +
+ Color + const gold + + +
+ +
+

Ramaz's brand gold.

+
+ + +
+

Implementation

+
static const Color gold = Color(0xfffcc30c);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/goldDark-constant.html b/docs/constants/RamazColors/goldDark-constant.html new file mode 100644 index 000000000..aaaa465ac --- /dev/null +++ b/docs/constants/RamazColors/goldDark-constant.html @@ -0,0 +1,146 @@ + + + + + + + + goldDark constant - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
goldDark
+ +
+ +
+ + + + +
+
+ +

goldDark constant + Null safety +

+ +
+ Color + const goldDark + + +
+ +
+

The material-specific dark variant of gold.

+
+ + +
+

Implementation

+
static const Color goldDark = Color (0xffc49300);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/goldLight-constant.html b/docs/constants/RamazColors/goldLight-constant.html new file mode 100644 index 000000000..7d1832c87 --- /dev/null +++ b/docs/constants/RamazColors/goldLight-constant.html @@ -0,0 +1,146 @@ + + + + + + + + goldLight constant - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
goldLight
+ +
+ +
+ + + + +
+
+ +

goldLight constant + Null safety +

+ +
+ Color + const goldLight + + +
+ +
+

The material-specific light variant of gold.

+
+ + +
+

Implementation

+
static const Color goldLight = Color (0xfffff552);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/hashCode.html b/docs/constants/RamazColors/hashCode.html new file mode 100644 index 000000000..58a062be0 --- /dev/null +++ b/docs/constants/RamazColors/hashCode.html @@ -0,0 +1,175 @@ + + + + + + + + hashCode property - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/noSuchMethod.html b/docs/constants/RamazColors/noSuchMethod.html new file mode 100644 index 000000000..45b64e2ee --- /dev/null +++ b/docs/constants/RamazColors/noSuchMethod.html @@ -0,0 +1,183 @@ + + + + + + + + noSuchMethod method - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/operator_equals.html b/docs/constants/RamazColors/operator_equals.html new file mode 100644 index 000000000..ac7aa56cd --- /dev/null +++ b/docs/constants/RamazColors/operator_equals.html @@ -0,0 +1,174 @@ + + + + + + + + operator == method - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/runtimeType.html b/docs/constants/RamazColors/runtimeType.html new file mode 100644 index 000000000..f96dcc51f --- /dev/null +++ b/docs/constants/RamazColors/runtimeType.html @@ -0,0 +1,150 @@ + + + + + + + + runtimeType property - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/RamazColors/toString.html b/docs/constants/RamazColors/toString.html new file mode 100644 index 000000000..9193c84fc --- /dev/null +++ b/docs/constants/RamazColors/toString.html @@ -0,0 +1,156 @@ + + + + + + + + toString method - RamazColors class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+

toString method + Null safety +

+ +
+ + +String +toString() + +
inherited
+ +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
external String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/TimeConverter.html b/docs/constants/TimeConverter.html new file mode 100644 index 000000000..92cf1f20c --- /dev/null +++ b/docs/constants/TimeConverter.html @@ -0,0 +1,167 @@ + + + + + + + + TimeConverter extension - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
TimeConverter
+ +
+ +
+ + + + +
+
+ +

TimeConverter extension + Null safety + +

+ + +
+

Extension class for converting TimeOfDay to a Time.

+
+ +
+
+
on
+
+ +
+
+
+ +
+

Properties

+ +
+
+ asTime + Time + +
+
+ Converts this object to a Time. +
read-only
+ +
+ +
+
+ + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/TimeConverter/asTime.html b/docs/constants/TimeConverter/asTime.html new file mode 100644 index 000000000..b2ab18c0b --- /dev/null +++ b/docs/constants/TimeConverter/asTime.html @@ -0,0 +1,135 @@ + + + + + + + + asTime property - TimeConverter extension - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
asTime
+ +
+ +
+ + + + +
+
+ +

asTime property + Null safety +

+ + + +
+ +
+ Time + asTime + + +
+ + +
+

Converts this object to a Time.

+
+ + +
+

Implementation

+
Time get asTime => Time(hour, minute);
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/TimeOfDayConverter.html b/docs/constants/TimeOfDayConverter.html new file mode 100644 index 000000000..0b1c76b75 --- /dev/null +++ b/docs/constants/TimeOfDayConverter.html @@ -0,0 +1,169 @@ + + + + + + + + TimeOfDayConverter extension - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
TimeOfDayConverter
+ +
+ +
+ + + + +
+
+ +

TimeOfDayConverter extension + Null safety + +

+ + +
+

Extension class for converting Time to a TimeOfDay.

+

This cannot be defined in the data library, since it would establish +a dependency on the material library.

+
+ +
+
+
on
+
+ +
+
+
+ +
+

Properties

+ +
+
+ asTimeOfDay + TimeOfDay + +
+
+ Converts this object to a TimeOfDay. +
read-only
+ +
+ +
+
+ + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/TimeOfDayConverter/asTimeOfDay.html b/docs/constants/TimeOfDayConverter/asTimeOfDay.html new file mode 100644 index 000000000..c3c414ec9 --- /dev/null +++ b/docs/constants/TimeOfDayConverter/asTimeOfDay.html @@ -0,0 +1,135 @@ + + + + + + + + asTimeOfDay property - TimeOfDayConverter extension - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
asTimeOfDay
+ +
+ +
+ + + + +
+
+ +

asTimeOfDay property + Null safety +

+ + + +
+ +
+ TimeOfDay + asTimeOfDay + + +
+ + +
+

Converts this object to a TimeOfDay.

+
+ + +
+

Implementation

+
TimeOfDay get asTimeOfDay => TimeOfDay(hour: hour, minute: minutes);
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times-class.html b/docs/constants/Times-class.html new file mode 100644 index 000000000..f1553d3aa --- /dev/null +++ b/docs/constants/Times-class.html @@ -0,0 +1,343 @@ + + + + + + + + Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Times
+ +
+ +
+ + + + +
+
+ +

Times class + Null safety + +

+ + +
+

Some date constants.

+
+ + + +
+

Constructors

+ +
+
+ Times() +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + +
+

Constants

+ +
+
+ schoolEnd + → const int + + +
+
+ The month that school ends (July). + + +
+ 7 +
+
+ +
+ schoolStart + → const int + + +
+
+ The month that school starts (September). + + +
+ 9 +
+
+ +
+ winterFridayDayEnd + → const int + + +
+
+ The date that Winter Fridays end (assume the 1st). + + +
+ 1 +
+
+ +
+ winterFridayDayStart + → const int + + +
+
+ The date that Winter Fridays start (assume the 1st). + + +
+ 1 +
+
+ +
+ winterFridayMonthEnd + → const int + + +
+
+ The month that winter Fridays end (March). + + +
+ 3 +
+
+ +
+ winterFridayMonthStart + → const int + + +
+
+ The month that winter Fridays start (November). + + +
+ 11 +
+
+ +
+
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/Times.html b/docs/constants/Times/Times.html new file mode 100644 index 000000000..8e3a0ee19 --- /dev/null +++ b/docs/constants/Times/Times.html @@ -0,0 +1,136 @@ + + + + + + + + Times constructor - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Times
+ +
+ +
+ + + + +
+
+ +

Times constructor + Null safety +

+ +
+ Times() +
+ + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/hashCode.html b/docs/constants/Times/hashCode.html new file mode 100644 index 000000000..097752476 --- /dev/null +++ b/docs/constants/Times/hashCode.html @@ -0,0 +1,175 @@ + + + + + + + + hashCode property - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/noSuchMethod.html b/docs/constants/Times/noSuchMethod.html new file mode 100644 index 000000000..e62c06923 --- /dev/null +++ b/docs/constants/Times/noSuchMethod.html @@ -0,0 +1,183 @@ + + + + + + + + noSuchMethod method - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/operator_equals.html b/docs/constants/Times/operator_equals.html new file mode 100644 index 000000000..b13c82d40 --- /dev/null +++ b/docs/constants/Times/operator_equals.html @@ -0,0 +1,174 @@ + + + + + + + + operator == method - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/runtimeType.html b/docs/constants/Times/runtimeType.html new file mode 100644 index 000000000..95ccf2e25 --- /dev/null +++ b/docs/constants/Times/runtimeType.html @@ -0,0 +1,150 @@ + + + + + + + + runtimeType property - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/schoolEnd-constant.html b/docs/constants/Times/schoolEnd-constant.html new file mode 100644 index 000000000..23572120d --- /dev/null +++ b/docs/constants/Times/schoolEnd-constant.html @@ -0,0 +1,146 @@ + + + + + + + + schoolEnd constant - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schoolEnd
+ +
+ +
+ + + + +
+
+ +

schoolEnd constant + Null safety +

+ +
+ int + const schoolEnd + + +
+ +
+

The month that school ends (July).

+
+ + +
+

Implementation

+
static const int schoolEnd = 7;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/schoolStart-constant.html b/docs/constants/Times/schoolStart-constant.html new file mode 100644 index 000000000..980f7bc93 --- /dev/null +++ b/docs/constants/Times/schoolStart-constant.html @@ -0,0 +1,146 @@ + + + + + + + + schoolStart constant - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schoolStart
+ +
+ +
+ + + + +
+
+ +

schoolStart constant + Null safety +

+ +
+ int + const schoolStart + + +
+ +
+

The month that school starts (September).

+
+ + +
+

Implementation

+
static const int schoolStart = 9;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/toString.html b/docs/constants/Times/toString.html new file mode 100644 index 000000000..6c6523eca --- /dev/null +++ b/docs/constants/Times/toString.html @@ -0,0 +1,156 @@ + + + + + + + + toString method - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+

toString method + Null safety +

+ +
+ + +String +toString() + +
inherited
+ +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
external String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/winterFridayDayEnd-constant.html b/docs/constants/Times/winterFridayDayEnd-constant.html new file mode 100644 index 000000000..42e0269f0 --- /dev/null +++ b/docs/constants/Times/winterFridayDayEnd-constant.html @@ -0,0 +1,146 @@ + + + + + + + + winterFridayDayEnd constant - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
winterFridayDayEnd
+ +
+ +
+ + + + +
+
+ +

winterFridayDayEnd constant + Null safety +

+ +
+ int + const winterFridayDayEnd + + +
+ +
+

The date that Winter Fridays end (assume the 1st).

+
+ + +
+

Implementation

+
static const int winterFridayDayEnd = 1;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/winterFridayDayStart-constant.html b/docs/constants/Times/winterFridayDayStart-constant.html new file mode 100644 index 000000000..6b37e29e7 --- /dev/null +++ b/docs/constants/Times/winterFridayDayStart-constant.html @@ -0,0 +1,146 @@ + + + + + + + + winterFridayDayStart constant - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
winterFridayDayStart
+ +
+ +
+ + + + +
+
+ +

winterFridayDayStart constant + Null safety +

+ +
+ int + const winterFridayDayStart + + +
+ +
+

The date that Winter Fridays start (assume the 1st).

+
+ + +
+

Implementation

+
static const int winterFridayDayStart = 1;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/winterFridayMonthEnd-constant.html b/docs/constants/Times/winterFridayMonthEnd-constant.html new file mode 100644 index 000000000..c37aedeed --- /dev/null +++ b/docs/constants/Times/winterFridayMonthEnd-constant.html @@ -0,0 +1,146 @@ + + + + + + + + winterFridayMonthEnd constant - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
winterFridayMonthEnd
+ +
+ +
+ + + + +
+
+ +

winterFridayMonthEnd constant + Null safety +

+ +
+ int + const winterFridayMonthEnd + + +
+ +
+

The month that winter Fridays end (March).

+
+ + +
+

Implementation

+
static const int winterFridayMonthEnd = 3;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Times/winterFridayMonthStart-constant.html b/docs/constants/Times/winterFridayMonthStart-constant.html new file mode 100644 index 000000000..49fe4a433 --- /dev/null +++ b/docs/constants/Times/winterFridayMonthStart-constant.html @@ -0,0 +1,146 @@ + + + + + + + + winterFridayMonthStart constant - Times class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
winterFridayMonthStart
+ +
+ +
+ + + + +
+
+ +

winterFridayMonthStart constant + Null safety +

+ +
+ int + const winterFridayMonthStart + + +
+ +
+

The month that winter Fridays start (November).

+
+ + +
+

Implementation

+
static const int winterFridayMonthStart = 11;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls-class.html b/docs/constants/Urls-class.html new file mode 100644 index 000000000..a13a1ac2d --- /dev/null +++ b/docs/constants/Urls-class.html @@ -0,0 +1,343 @@ + + + + + + + + Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Urls
+ +
+ +
+ + + + +
+
+ +

Urls class + Null safety + +

+ + +
+

A collection of URLs used throughout the app

+
+ + + +
+

Constructors

+ +
+
+ Urls() +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + +
+

Constants

+ +
+
+ email + → const String + + +
+
+ The URL for Outlook mail. + + +
+ "http://mymail.ramaz.org" +
+
+ +
+ googleDrive + → const String + + +
+
+ The URL for Google Drive. + + +
+ "http://drive.google.com" +
+
+ +
+ ramaz + → const String + + +
+
+ The URL for the Ramaz website. + + +
+ "https://www.ramaz.org" +
+
+ +
+ schoology + → const String + + +
+
+ The URL for schoology. + + +
+ "https://app.schoology.com" +
+
+ +
+ seniorSystems + → const String + + +
+
+ The URL for Outlook mail. + + +
+ "https://my.ramaz.org/SeniorApps/facelets/home/home.xhtml" +
+
+ +
+ sportsLivestream + → const String + + +
+
+ The URL for Ramaz livestreaming. + + +
+ "https://www.ramaz.org/page.cfm?p=10769" +
+
+ +
+
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/Urls.html b/docs/constants/Urls/Urls.html new file mode 100644 index 000000000..9d73ba010 --- /dev/null +++ b/docs/constants/Urls/Urls.html @@ -0,0 +1,136 @@ + + + + + + + + Urls constructor - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Urls
+ +
+ +
+ + + + +
+
+ +

Urls constructor + Null safety +

+ +
+ Urls() +
+ + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/email-constant.html b/docs/constants/Urls/email-constant.html new file mode 100644 index 000000000..48df4df8e --- /dev/null +++ b/docs/constants/Urls/email-constant.html @@ -0,0 +1,146 @@ + + + + + + + + email constant - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
email
+ +
+ +
+ + + + +
+
+ +

email constant + Null safety +

+ +
+ String + const email + + +
+ +
+

The URL for Outlook mail.

+
+ + +
+

Implementation

+
static const String email = "http://mymail.ramaz.org";
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/googleDrive-constant.html b/docs/constants/Urls/googleDrive-constant.html new file mode 100644 index 000000000..f2157d4a7 --- /dev/null +++ b/docs/constants/Urls/googleDrive-constant.html @@ -0,0 +1,146 @@ + + + + + + + + googleDrive constant - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
googleDrive
+ +
+ +
+ + + + +
+
+ +

googleDrive constant + Null safety +

+ +
+ String + const googleDrive + + +
+ +
+

The URL for Google Drive.

+
+ + +
+

Implementation

+
static const String googleDrive = "http://drive.google.com";
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/hashCode.html b/docs/constants/Urls/hashCode.html new file mode 100644 index 000000000..1ee5d3bc8 --- /dev/null +++ b/docs/constants/Urls/hashCode.html @@ -0,0 +1,175 @@ + + + + + + + + hashCode property - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/noSuchMethod.html b/docs/constants/Urls/noSuchMethod.html new file mode 100644 index 000000000..1b383bbb2 --- /dev/null +++ b/docs/constants/Urls/noSuchMethod.html @@ -0,0 +1,183 @@ + + + + + + + + noSuchMethod method - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/operator_equals.html b/docs/constants/Urls/operator_equals.html new file mode 100644 index 000000000..931d6c805 --- /dev/null +++ b/docs/constants/Urls/operator_equals.html @@ -0,0 +1,174 @@ + + + + + + + + operator == method - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/ramaz-constant.html b/docs/constants/Urls/ramaz-constant.html new file mode 100644 index 000000000..cb6b95dc9 --- /dev/null +++ b/docs/constants/Urls/ramaz-constant.html @@ -0,0 +1,146 @@ + + + + + + + + ramaz constant - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ramaz
+ +
+ +
+ + + + +
+
+ +

ramaz constant + Null safety +

+ +
+ String + const ramaz + + +
+ +
+

The URL for the Ramaz website.

+
+ + +
+

Implementation

+
static const String ramaz = "https://www.ramaz.org";
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/runtimeType.html b/docs/constants/Urls/runtimeType.html new file mode 100644 index 000000000..6380ececc --- /dev/null +++ b/docs/constants/Urls/runtimeType.html @@ -0,0 +1,150 @@ + + + + + + + + runtimeType property - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/schoology-constant.html b/docs/constants/Urls/schoology-constant.html new file mode 100644 index 000000000..20d4790ae --- /dev/null +++ b/docs/constants/Urls/schoology-constant.html @@ -0,0 +1,146 @@ + + + + + + + + schoology constant - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schoology
+ +
+ +
+ + + + +
+
+ +

schoology constant + Null safety +

+ +
+ String + const schoology + + +
+ +
+

The URL for schoology.

+
+ + +
+

Implementation

+
static const String schoology = "https://app.schoology.com";
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/seniorSystems-constant.html b/docs/constants/Urls/seniorSystems-constant.html new file mode 100644 index 000000000..1de29cd4e --- /dev/null +++ b/docs/constants/Urls/seniorSystems-constant.html @@ -0,0 +1,146 @@ + + + + + + + + seniorSystems constant - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
seniorSystems
+ +
+ +
+ + + + +
+
+ +

seniorSystems constant + Null safety +

+ +
+ String + const seniorSystems + + +
+ +
+

The URL for Outlook mail.

+
+ + +
+

Implementation

+
static const String seniorSystems = "https://my.ramaz.org/SeniorApps/facelets/home/home.xhtml";
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/sportsLivestream-constant.html b/docs/constants/Urls/sportsLivestream-constant.html new file mode 100644 index 000000000..c455e240d --- /dev/null +++ b/docs/constants/Urls/sportsLivestream-constant.html @@ -0,0 +1,146 @@ + + + + + + + + sportsLivestream constant - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
sportsLivestream
+ +
+ +
+ + + + +
+
+ +

sportsLivestream constant + Null safety +

+ +
+ String + const sportsLivestream + + +
+ +
+

The URL for Ramaz livestreaming.

+
+ + +
+

Implementation

+
static const String sportsLivestream = "https://www.ramaz.org/page.cfm?p=10769";
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/Urls/toString.html b/docs/constants/Urls/toString.html new file mode 100644 index 000000000..df6387a5e --- /dev/null +++ b/docs/constants/Urls/toString.html @@ -0,0 +1,156 @@ + + + + + + + + toString method - Urls class - constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+

toString method + Null safety +

+ +
+ + +String +toString() + +
inherited
+ +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
external String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/constants/constants-library.html b/docs/constants/constants-library.html new file mode 100644 index 000000000..6a7f98a64 --- /dev/null +++ b/docs/constants/constants-library.html @@ -0,0 +1,200 @@ + + + + + + + + constants library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
constants
+ +
+ +
+ + + + +
+
+ +

constants library + Null safety + +

+ + + + +
+

Classes

+ +
+
+ RamazColors + +
+
+ A container for Ramaz-specific colors [...] +
+ +
+ Times + +
+
+ Some date constants. +
+ +
+ Urls + +
+
+ A collection of URLs used throughout the app +
+ +
+
+ + +
+

Extensions

+ +
+
+ DayComparison + +
+
+ Has a method for checking if a DateTime is the same day as another. +
+ + +
+ TimeConverter + +
+
+ Extension class for converting TimeOfDay to a Time. +
+ + +
+ TimeOfDayConverter + +
+
+ Extension class for converting Time to a TimeOfDay. [...] +
+ + +
+
+ + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity-class.html b/docs/data/Activity-class.html new file mode 100644 index 000000000..9bdce8151 --- /dev/null +++ b/docs/data/Activity-class.html @@ -0,0 +1,361 @@ + + + + + + + + Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Activity
+ +
+ +
+ + + + +
+
+ +

Activity class + Null safety + +

+ + +
+

An activity during a period.

+

Students can either be directed to their advisories or to a certain room. +See ActivityType for a description of different activities.

+

Activities can also be nested.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ Activity({required ActivityType type, required String message}) +
+
+ Creates an activity. +
const
+
+
+ Activity.fromJson(Map json) +
+
+ Creates an activity from a JSON object. +
factory
+
+
+ Activity.grade(GradeActivity gradeActivty) +
+
+ Creates an activity for each grade +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ message + → String + +
+
+ A message to be displayed with this activity. [...] +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ type + ActivityType + +
+
+ The type of this activity. +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + +
+

Static Methods

+
+
+ getActivities(Map json) + → Map<String, Activity> + + + +
+
+ Parses a JSON map of Activities still in JSON. + + +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/Activity.fromJson.html b/docs/data/Activity/Activity.fromJson.html new file mode 100644 index 000000000..d060b68c0 --- /dev/null +++ b/docs/data/Activity/Activity.fromJson.html @@ -0,0 +1,151 @@ + + + + + + + + Activity.fromJson constructor - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Activity.fromJson
+ +
+ +
+ + + + +
+
+ +

Activity.fromJson constructor + Null safety +

+ +
+ Activity.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Creates an activity from a JSON object.

+
+ + + +
+

Implementation

+
factory Activity.fromJson(Map json) => json ["message"] is Map
+	? Activity.grade(
+		GradeActivity.fromJson(Map.from(json ["message"]))
+	)
+	: Activity(
+		type: parseActivityType(json ["type"]),
+		message: json ["message"]
+	);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/Activity.grade.html b/docs/data/Activity/Activity.grade.html new file mode 100644 index 000000000..95854ac51 --- /dev/null +++ b/docs/data/Activity/Activity.grade.html @@ -0,0 +1,146 @@ + + + + + + + + Activity.grade constructor - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Activity.grade
+ +
+ +
+ + + + +
+
+ +

Activity.grade constructor + Null safety +

+ +
+ Activity.grade(
  1. GradeActivity gradeActivty
  2. +
) +
+ + +
+

Creates an activity for each grade

+
+ + + +
+

Implementation

+
Activity.grade(GradeActivity gradeActivty) :
+	message = gradeActivty.toString(),
+	type = ActivityType.grade;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/Activity.html b/docs/data/Activity/Activity.html new file mode 100644 index 000000000..9aa7fe5c6 --- /dev/null +++ b/docs/data/Activity/Activity.html @@ -0,0 +1,148 @@ + + + + + + + + Activity constructor - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Activity
+ +
+ +
+ + + + +
+
+ +

Activity constructor + Null safety +

+ +
const + Activity(
  1. {required ActivityType type,
  2. +
  3. required String message}
  4. +
) +
+ + +
+

Creates an activity.

+
+ + + +
+

Implementation

+
const Activity({
+	required this.type,
+	required this.message,
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/getActivities.html b/docs/data/Activity/getActivities.html new file mode 100644 index 000000000..be50d01b9 --- /dev/null +++ b/docs/data/Activity/getActivities.html @@ -0,0 +1,157 @@ + + + + + + + + getActivities method - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getActivities
+ +
+ +
+ + + + +
+
+ +

getActivities method + Null safety +

+ +
+ + +Map<String, Activity> +getActivities(
  1. Map json
  2. +
) + + + +
+ +
+

Parses a JSON map of Activities still in JSON.

+
+ + + +
+

Implementation

+
static Map<String, Activity> getActivities(Map json) {
+	final Map<String, Activity> result = {};
+	for (final MapEntry entry in json.entries) {
+		result [entry.key] = Activity.fromJson(
+			Map.from(entry.value)
+		);
+	}
+	return result;
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/hashCode.html b/docs/data/Activity/hashCode.html new file mode 100644 index 000000000..8bc4aa52a --- /dev/null +++ b/docs/data/Activity/hashCode.html @@ -0,0 +1,175 @@ + + + + + + + + hashCode property - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/message.html b/docs/data/Activity/message.html new file mode 100644 index 000000000..87422dd09 --- /dev/null +++ b/docs/data/Activity/message.html @@ -0,0 +1,148 @@ + + + + + + + + message property - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
message
+ +
+ +
+ + + + +
+
+ +

message property + Null safety +

+ +
+ String + message +
final
+ +
+ +
+

A message to be displayed with this activity.

+

For example, this can be used to direct students to a certain room based +on grade, which is better handled by the user rather than the app.

+
+ + +
+

Implementation

+
final String message;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/noSuchMethod.html b/docs/data/Activity/noSuchMethod.html new file mode 100644 index 000000000..099626ac2 --- /dev/null +++ b/docs/data/Activity/noSuchMethod.html @@ -0,0 +1,183 @@ + + + + + + + + noSuchMethod method - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/operator_equals.html b/docs/data/Activity/operator_equals.html new file mode 100644 index 000000000..2b24e241b --- /dev/null +++ b/docs/data/Activity/operator_equals.html @@ -0,0 +1,174 @@ + + + + + + + + operator == method - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/runtimeType.html b/docs/data/Activity/runtimeType.html new file mode 100644 index 000000000..51ac427e1 --- /dev/null +++ b/docs/data/Activity/runtimeType.html @@ -0,0 +1,150 @@ + + + + + + + + runtimeType property - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/toJson.html b/docs/data/Activity/toJson.html new file mode 100644 index 000000000..5991245b6 --- /dev/null +++ b/docs/data/Activity/toJson.html @@ -0,0 +1,148 @@ + + + + + + + + toJson method - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ + + + +
+

Implementation

+
Map toJson() => {
+	"message": message,
+	"type": activityTypeToString(type),
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/toString.html b/docs/data/Activity/toString.html new file mode 100644 index 000000000..fa3178763 --- /dev/null +++ b/docs/data/Activity/toString.html @@ -0,0 +1,170 @@ + + + + + + + + toString method - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
@override
+String toString() {
+	switch (type) {
+		case ActivityType.misc: return message;
+		case ActivityType.advisory: return "Advisory -- $message";
+		case ActivityType.room: return message;
+		default: return "Activity";
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Activity/type.html b/docs/data/Activity/type.html new file mode 100644 index 000000000..720b73711 --- /dev/null +++ b/docs/data/Activity/type.html @@ -0,0 +1,146 @@ + + + + + + + + type property - Activity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
type
+ +
+ +
+ + + + +
+
+ +

type property + Null safety +

+ +
+ ActivityType + type +
final
+ +
+ +
+

The type of this activity.

+
+ + +
+

Implementation

+
final ActivityType type;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ActivityType-class.html b/docs/data/ActivityType-class.html new file mode 100644 index 000000000..0b74306fc --- /dev/null +++ b/docs/data/ActivityType-class.html @@ -0,0 +1,357 @@ + + + + + + + + ActivityType enum - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ActivityType
+ +
+ +
+ + + + +
+
+ +

ActivityType enum + Null safety + +

+ + +
+

A type of activity during the day.

+
+ + + +
+

Constants

+ +
+
+ advisory + → const ActivityType + + +
+
+

When students should go to their advisories.

+

The app will show everyone to their advisories.

+ + +
+ const ActivityType(0) +
+
+ +
+ grade + → const ActivityType + + +
+
+

A grade activity.

+

Students will be shown the activities for each grade, and in the future, +students can be shown their grade's activity.

+ + +
+ const ActivityType(2) +
+
+ +
+ misc + → const ActivityType + + +
+
+

This type of activity should not be parsed by the app.

+

Just shows the message associated with the action.

+ + +
+ const ActivityType(3) +
+
+ +
+ room + → const ActivityType + + +
+
+

When students should go to a certain room.

+ + +
+ const ActivityType(1) +
+
+ +
+ values + → const List<ActivityType> + + +
+
+

A constant List of the values in this enum, in order of their declaration.

+ + +
+ const List<ActivityType> +
+
+ +
+
+ + +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ index + → int + +
+
+

The integer index of this enum.

+
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ActivityType/hashCode.html b/docs/data/ActivityType/hashCode.html new file mode 100644 index 000000000..2093594b3 --- /dev/null +++ b/docs/data/ActivityType/hashCode.html @@ -0,0 +1,171 @@ + + + + + + + + hashCode property - ActivityType extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ActivityType/noSuchMethod.html b/docs/data/ActivityType/noSuchMethod.html new file mode 100644 index 000000000..51c606343 --- /dev/null +++ b/docs/data/ActivityType/noSuchMethod.html @@ -0,0 +1,179 @@ + + + + + + + + noSuchMethod method - ActivityType extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ActivityType/operator_equals.html b/docs/data/ActivityType/operator_equals.html new file mode 100644 index 000000000..08a930916 --- /dev/null +++ b/docs/data/ActivityType/operator_equals.html @@ -0,0 +1,170 @@ + + + + + + + + operator == method - ActivityType extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ActivityType/runtimeType.html b/docs/data/ActivityType/runtimeType.html new file mode 100644 index 000000000..c99a24ab8 --- /dev/null +++ b/docs/data/ActivityType/runtimeType.html @@ -0,0 +1,146 @@ + + + + + + + + runtimeType property - ActivityType extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ActivityType/toString.html b/docs/data/ActivityType/toString.html new file mode 100644 index 000000000..444cac11a --- /dev/null +++ b/docs/data/ActivityType/toString.html @@ -0,0 +1,149 @@ + + + + + + + + toString method - ActivityType extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ + +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/AdminScope-class.html b/docs/data/AdminScope-class.html new file mode 100644 index 000000000..c435726a5 --- /dev/null +++ b/docs/data/AdminScope-class.html @@ -0,0 +1,338 @@ + + + + + + + + AdminScope enum - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
AdminScope
+ +
+ +
+ + + + +
+
+ +

AdminScope enum + Null safety + +

+ + +
+

Scopes for administrative privileges.

+

Admin users use these scopes to determine what they can read/write.

+
+ + + +
+

Constants

+ +
+
+ calendar + → const AdminScope + + +
+
+

The admin can access and modify the calendar.

+ + +
+ const AdminScope(0) +
+
+ +
+ schedule + → const AdminScope + + +
+
+

The admin can access and modify student schedules.

+ + +
+ const AdminScope(1) +
+
+ +
+ sports + → const AdminScope + + +
+
+

The admin can create and update sports games.

+ + +
+ const AdminScope(2) +
+
+ +
+ values + → const List<AdminScope> + + +
+
+

A constant List of the values in this enum, in order of their declaration.

+ + +
+ const List<AdminScope> +
+
+ +
+
+ + +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ index + → int + +
+
+

The integer index of this enum.

+
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/AdminScope/hashCode.html b/docs/data/AdminScope/hashCode.html new file mode 100644 index 000000000..8a6aa0b5f --- /dev/null +++ b/docs/data/AdminScope/hashCode.html @@ -0,0 +1,170 @@ + + + + + + + + hashCode property - AdminScope extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/AdminScope/noSuchMethod.html b/docs/data/AdminScope/noSuchMethod.html new file mode 100644 index 000000000..88f2b6526 --- /dev/null +++ b/docs/data/AdminScope/noSuchMethod.html @@ -0,0 +1,178 @@ + + + + + + + + noSuchMethod method - AdminScope extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/AdminScope/operator_equals.html b/docs/data/AdminScope/operator_equals.html new file mode 100644 index 000000000..f50bb39b8 --- /dev/null +++ b/docs/data/AdminScope/operator_equals.html @@ -0,0 +1,169 @@ + + + + + + + + operator == method - AdminScope extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/AdminScope/runtimeType.html b/docs/data/AdminScope/runtimeType.html new file mode 100644 index 000000000..3914c18c6 --- /dev/null +++ b/docs/data/AdminScope/runtimeType.html @@ -0,0 +1,145 @@ + + + + + + + + runtimeType property - AdminScope extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/AdminScope/toString.html b/docs/data/AdminScope/toString.html new file mode 100644 index 000000000..9c1977a35 --- /dev/null +++ b/docs/data/AdminScope/toString.html @@ -0,0 +1,148 @@ + + + + + + + + toString method - AdminScope extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ + +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Advisory-class.html b/docs/data/Advisory-class.html new file mode 100644 index 000000000..8bb6c200c --- /dev/null +++ b/docs/data/Advisory-class.html @@ -0,0 +1,318 @@ + + + + + + + + Advisory class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Advisory
+ +
+ +
+ + + + +
+
+ +

Advisory class + Null safety + +

+ + +
+

Bundles data relevant to advisory.

+

This is not incorporated with the schedule since advisories can happen +during homeroom, and are thus dependent on the day, not the user's profile.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ Advisory({required String id, required String room}) +
+
+ Holds advisory data. +
const
+
+
+ Advisory.fromJson(Map json) +
+
+ Creates an advisory object from JSON. [...] +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ id + → String + +
+
+ The section ID of this advisory. +
final
+ +
+ +
+ room + → String + +
+
+ The room where this advisory meets. +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Advisory/Advisory.fromJson.html b/docs/data/Advisory/Advisory.fromJson.html new file mode 100644 index 000000000..dc90c9972 --- /dev/null +++ b/docs/data/Advisory/Advisory.fromJson.html @@ -0,0 +1,143 @@ + + + + + + + + Advisory.fromJson constructor - Advisory class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Advisory.fromJson
+ +
+ +
+ + + + +
+
+ +

Advisory.fromJson constructor + Null safety +

+ +
+ Advisory.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Creates an advisory object from JSON.

+

This JSON can be null, so this constructor should only be called if needed.

+
+ + + +
+

Implementation

+
Advisory.fromJson(Map json) :
+	id = json ["id"],
+	room = json ["room"];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Advisory/Advisory.html b/docs/data/Advisory/Advisory.html new file mode 100644 index 000000000..e29117b27 --- /dev/null +++ b/docs/data/Advisory/Advisory.html @@ -0,0 +1,144 @@ + + + + + + + + Advisory constructor - Advisory class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Advisory
+ +
+ +
+ + + + +
+
+ +

Advisory constructor + Null safety +

+ +
const + Advisory(
  1. {required String id,
  2. +
  3. required String room}
  4. +
) +
+ + +
+

Holds advisory data.

+
+ + + +
+

Implementation

+
const Advisory({
+	required this.id,
+	required this.room,
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Advisory/hashCode.html b/docs/data/Advisory/hashCode.html new file mode 100644 index 000000000..16cfc5eda --- /dev/null +++ b/docs/data/Advisory/hashCode.html @@ -0,0 +1,171 @@ + + + + + + + + hashCode property - Advisory class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Advisory/id.html b/docs/data/Advisory/id.html new file mode 100644 index 000000000..46923b039 --- /dev/null +++ b/docs/data/Advisory/id.html @@ -0,0 +1,142 @@ + + + + + + + + id property - Advisory class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
id
+ +
+ +
+ + + + +
+
+ +

id property + Null safety +

+ +
+ String + id +
final
+ +
+ +
+

The section ID of this advisory.

+
+ + +
+

Implementation

+
final String id;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Advisory/noSuchMethod.html b/docs/data/Advisory/noSuchMethod.html new file mode 100644 index 000000000..be672eefe --- /dev/null +++ b/docs/data/Advisory/noSuchMethod.html @@ -0,0 +1,179 @@ + + + + + + + + noSuchMethod method - Advisory class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Advisory/operator_equals.html b/docs/data/Advisory/operator_equals.html new file mode 100644 index 000000000..021b8d679 --- /dev/null +++ b/docs/data/Advisory/operator_equals.html @@ -0,0 +1,170 @@ + + + + + + + + operator == method - Advisory class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Advisory/room.html b/docs/data/Advisory/room.html new file mode 100644 index 000000000..b5184d5df --- /dev/null +++ b/docs/data/Advisory/room.html @@ -0,0 +1,142 @@ + + + + + + + + room property - Advisory class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
room
+ +
+ +
+ + + + +
+
+ +

room property + Null safety +

+ +
+ String + room +
final
+ +
+ +
+

The room where this advisory meets.

+
+ + +
+

Implementation

+
final String room;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Advisory/runtimeType.html b/docs/data/Advisory/runtimeType.html new file mode 100644 index 000000000..0486efea7 --- /dev/null +++ b/docs/data/Advisory/runtimeType.html @@ -0,0 +1,146 @@ + + + + + + + + runtimeType property - Advisory class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Advisory/toString.html b/docs/data/Advisory/toString.html new file mode 100644 index 000000000..36aaa8e9a --- /dev/null +++ b/docs/data/Advisory/toString.html @@ -0,0 +1,152 @@ + + + + + + + + toString method - Advisory class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+

toString method + Null safety +

+ +
+ + +String +toString() + +
inherited
+ +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
external String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club-class.html b/docs/data/Club-class.html new file mode 100644 index 000000000..9e762bf12 --- /dev/null +++ b/docs/data/Club-class.html @@ -0,0 +1,400 @@ + + + + + + + + Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Club
+ +
+ +
+ + + + +
+
+ +

Club class + Null safety + +

+ + + + + +
+

Constructors

+ +
+
+ Club({required String name, required String shortDescription, required String description, required bool phoneNumberRequested, required List<ContactInfo> captains, required ContactInfo facultyAdvisor, required String image, String? formUrl}) +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ attendance + → Map<String, int> + +
+
+ +
final
+ +
+ +
+ captains + → List<ContactInfo> + +
+
+ +
final
+ +
+ +
+ description + → String + +
+
+ +
final
+ +
+ +
+ facultyAdvisor + → ContactInfo + +
+
+ +
final
+ +
+ +
+ formUrl + → String? + +
+
+ +
final
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ image + → String + +
+
+ +
final
+ +
+ +
+ members + → List<ContactInfo> + +
+
+ +
final
+ +
+ +
+ messages + → List<Message> + +
+
+ +
final
+ +
+ +
+ name + → String + +
+
+ +
final
+ +
+ +
+ phoneNumberRequested + → bool + +
+
+ +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ shortDescription + → String + +
+
+ +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/Club.html b/docs/data/Club/Club.html new file mode 100644 index 000000000..42ea647cf --- /dev/null +++ b/docs/data/Club/Club.html @@ -0,0 +1,164 @@ + + + + + + + + Club constructor - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Club
+ +
+ +
+ + + + +
+
+ +

Club constructor + Null safety +

+ +
+ Club(
  1. {required String name,
  2. +
  3. required String shortDescription,
  4. +
  5. required String description,
  6. +
  7. required bool phoneNumberRequested,
  8. +
  9. required List<ContactInfo> captains,
  10. +
  11. required ContactInfo facultyAdvisor,
  12. +
  13. required String image,
  14. +
  15. String? formUrl}
  16. +
) +
+ + + + + +
+

Implementation

+
Club({
+	required this.name,
+	required this.shortDescription,
+	required this.description,
+	required this.phoneNumberRequested,
+	required this.captains,
+	required this.facultyAdvisor,
+	required this.image,
+	this.formUrl,
+}) :
+	members = [],
+	attendance = {},
+	messages = [];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/attendance.html b/docs/data/Club/attendance.html new file mode 100644 index 000000000..73e43e76e --- /dev/null +++ b/docs/data/Club/attendance.html @@ -0,0 +1,147 @@ + + + + + + + + attendance property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
attendance
+ +
+ +
+ + + + +
+
+ +

attendance property + Null safety +

+ +
+ Map<String, int> + attendance +
final
+ +
+ + + +
+

Implementation

+
final Map<String, int> attendance;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/captains.html b/docs/data/Club/captains.html new file mode 100644 index 000000000..39b243811 --- /dev/null +++ b/docs/data/Club/captains.html @@ -0,0 +1,147 @@ + + + + + + + + captains property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
captains
+ +
+ +
+ + + + +
+
+ +

captains property + Null safety +

+ +
+ List<ContactInfo> + captains +
final
+ +
+ + + +
+

Implementation

+
final List<ContactInfo> captains;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/description.html b/docs/data/Club/description.html new file mode 100644 index 000000000..c2ec4d35e --- /dev/null +++ b/docs/data/Club/description.html @@ -0,0 +1,147 @@ + + + + + + + + description property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
description
+ +
+ +
+ + + + +
+
+ +

description property + Null safety +

+ +
+ String + description +
final
+ +
+ + + +
+

Implementation

+
final String description;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/facultyAdvisor.html b/docs/data/Club/facultyAdvisor.html new file mode 100644 index 000000000..bd31bc8a9 --- /dev/null +++ b/docs/data/Club/facultyAdvisor.html @@ -0,0 +1,147 @@ + + + + + + + + facultyAdvisor property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
facultyAdvisor
+ +
+ +
+ + + + +
+
+ +

facultyAdvisor property + Null safety +

+ +
+ ContactInfo + facultyAdvisor +
final
+ +
+ + + +
+

Implementation

+
final ContactInfo facultyAdvisor;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/formUrl.html b/docs/data/Club/formUrl.html new file mode 100644 index 000000000..fcddcbb41 --- /dev/null +++ b/docs/data/Club/formUrl.html @@ -0,0 +1,147 @@ + + + + + + + + formUrl property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
formUrl
+ +
+ +
+ + + + +
+
+ +

formUrl property + Null safety +

+ +
+ String? + formUrl +
final
+ +
+ + + +
+

Implementation

+
final String? formUrl;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/hashCode.html b/docs/data/Club/hashCode.html new file mode 100644 index 000000000..c1264f312 --- /dev/null +++ b/docs/data/Club/hashCode.html @@ -0,0 +1,179 @@ + + + + + + + + hashCode property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/image.html b/docs/data/Club/image.html new file mode 100644 index 000000000..1b2923f1f --- /dev/null +++ b/docs/data/Club/image.html @@ -0,0 +1,147 @@ + + + + + + + + image property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
image
+ +
+ +
+ + + + +
+
+ +

image property + Null safety +

+ +
+ String + image +
final
+ +
+ + + +
+

Implementation

+
final String image;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/members.html b/docs/data/Club/members.html new file mode 100644 index 000000000..a29d5a6d2 --- /dev/null +++ b/docs/data/Club/members.html @@ -0,0 +1,147 @@ + + + + + + + + members property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
members
+ +
+ +
+ + + + +
+
+ +

members property + Null safety +

+ +
+ List<ContactInfo> + members +
final
+ +
+ + + +
+

Implementation

+
final List<ContactInfo> members;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/messages.html b/docs/data/Club/messages.html new file mode 100644 index 000000000..430441052 --- /dev/null +++ b/docs/data/Club/messages.html @@ -0,0 +1,147 @@ + + + + + + + + messages property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
messages
+ +
+ +
+ + + + +
+
+ +

messages property + Null safety +

+ +
+ List<Message> + messages +
final
+ +
+ + + +
+

Implementation

+
final List<Message> messages;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/name.html b/docs/data/Club/name.html new file mode 100644 index 000000000..1f46c59f7 --- /dev/null +++ b/docs/data/Club/name.html @@ -0,0 +1,147 @@ + + + + + + + + name property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
name
+ +
+ +
+ + + + +
+
+ +

name property + Null safety +

+ +
+ String + name +
final
+ +
+ + + +
+

Implementation

+
final String name;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/noSuchMethod.html b/docs/data/Club/noSuchMethod.html new file mode 100644 index 000000000..22fe3a87e --- /dev/null +++ b/docs/data/Club/noSuchMethod.html @@ -0,0 +1,187 @@ + + + + + + + + noSuchMethod method - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/operator_equals.html b/docs/data/Club/operator_equals.html new file mode 100644 index 000000000..0c276e017 --- /dev/null +++ b/docs/data/Club/operator_equals.html @@ -0,0 +1,178 @@ + + + + + + + + operator == method - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/phoneNumberRequested.html b/docs/data/Club/phoneNumberRequested.html new file mode 100644 index 000000000..92180f0ad --- /dev/null +++ b/docs/data/Club/phoneNumberRequested.html @@ -0,0 +1,147 @@ + + + + + + + + phoneNumberRequested property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
phoneNumberRequested
+ +
+ +
+ + + + +
+
+ +

phoneNumberRequested property + Null safety +

+ +
+ bool + phoneNumberRequested +
final
+ +
+ + + +
+

Implementation

+
final bool phoneNumberRequested;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/runtimeType.html b/docs/data/Club/runtimeType.html new file mode 100644 index 000000000..346071aa0 --- /dev/null +++ b/docs/data/Club/runtimeType.html @@ -0,0 +1,154 @@ + + + + + + + + runtimeType property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/shortDescription.html b/docs/data/Club/shortDescription.html new file mode 100644 index 000000000..81b71a28b --- /dev/null +++ b/docs/data/Club/shortDescription.html @@ -0,0 +1,147 @@ + + + + + + + + shortDescription property - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
shortDescription
+ +
+ +
+ + + + +
+
+ +

shortDescription property + Null safety +

+ +
+ String + shortDescription +
final
+ +
+ + + +
+

Implementation

+
final String shortDescription;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Club/toString.html b/docs/data/Club/toString.html new file mode 100644 index 000000000..c2334f2bc --- /dev/null +++ b/docs/data/Club/toString.html @@ -0,0 +1,160 @@ + + + + + + + + toString method - Club class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+

toString method + Null safety +

+ +
+ + +String +toString() + +
inherited
+ +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
external String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day-class.html b/docs/data/Day-class.html new file mode 100644 index 000000000..33f913bf2 --- /dev/null +++ b/docs/data/Day-class.html @@ -0,0 +1,406 @@ + + + + + + + + Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Day
+ +
+ +
+ + + + +
+
+ +

Day class + Null safety + +

+ + +
+

A day at Ramaz.

+

Each day has a name and schedule property. +The name property decides which schedule to show, +while the schedule property decides what time slots to give the periods.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ Day({required String name, required Schedule schedule}) +
+
+ Returns a new Day from a name and Schedule. +
const
+
+
+ Day.fromJson(Map json) +
+
+ Returns a Day from a JSON object. [...] +
factory
+
+
+
+ +
+

Properties

+ +
+
+ displayName + → String + +
+
+ A human-readable string representation of this day. +
read-only
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only
+ +
+ +
+ n + → String + +
+
+ Whether to say "a" or "an". [...] +
read-only
+ +
+ +
+ name + → String + +
+
+ The name of this day. [...] +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ schedule + Schedule + +
+
+ The time allotment for this day. [...] +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ getCurrentPeriod() + → int? + + + +
+
+ The period right now. [...] + + +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ Returns a JSON representation of this Day. + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(dynamic other) + → bool + + + +
+
+ The equality operator. [...] + + +
+ +
+
+ + +
+

Static Methods

+
+
+ getCalendar(List<List<Map?>> year) + → List<List<Day?>> + + + +
+
+ Gets the calendar for the whole year. [...] + + +
+ +
+ getDate(List<List<Day?>> calendar, DateTime date) + Day? + + + +
+
+ Gets the Day for date in the calendar. + + +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/Day.fromJson.html b/docs/data/Day/Day.fromJson.html new file mode 100644 index 000000000..5fa9ecfbf --- /dev/null +++ b/docs/data/Day/Day.fromJson.html @@ -0,0 +1,162 @@ + + + + + + + + Day.fromJson constructor - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Day.fromJson
+ +
+ +
+ + + + +
+
+ +

Day.fromJson constructor + Null safety +

+ +
+ Day.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Returns a Day from a JSON object.

+

json ["name"] and json ["schedule"] must not be null. +json ["schedule"] must be the name of a schedule in the calendar.

+
+ + + +
+

Implementation

+
factory Day.fromJson(Map json) {
+	final String scheduleName = json ["schedule"];
+	final Schedule? schedule = Schedule.schedules.firstWhere(
+		(Schedule schedule) => schedule.name == scheduleName
+	);
+	if (schedule == null) {
+		throw ArgumentError.value(
+			json ["schedule"],  // problematic value
+			"scheduleName",     // description of this value
+			"Unrecognized schedule name"  // error message
+		);
+	}
+	return Day(name: json ["name"], schedule: schedule);
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/Day.html b/docs/data/Day/Day.html new file mode 100644 index 000000000..211210a11 --- /dev/null +++ b/docs/data/Day/Day.html @@ -0,0 +1,151 @@ + + + + + + + + Day constructor - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Day
+ +
+ +
+ + + + +
+
+ +

Day constructor + Null safety +

+ +
const + Day(
  1. {required String name,
  2. +
  3. required Schedule schedule}
  4. +
) +
+ + +
+

Returns a new Day from a name and Schedule.

+
+ + + +
+

Implementation

+
const Day({
+	required this.name,
+	required this.schedule
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/displayName.html b/docs/data/Day/displayName.html new file mode 100644 index 000000000..57dd7a710 --- /dev/null +++ b/docs/data/Day/displayName.html @@ -0,0 +1,154 @@ + + + + + + + + displayName property - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
displayName
+ +
+ +
+ + + + +
+
+ +

displayName property + Null safety +

+ + + +
+ +
+ String + displayName + + +
+ + +
+

A human-readable string representation of this day.

+
+ + +
+

Implementation

+
String get displayName => "$name ${schedule.name}";
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/getCalendar.html b/docs/data/Day/getCalendar.html new file mode 100644 index 000000000..c70827a61 --- /dev/null +++ b/docs/data/Day/getCalendar.html @@ -0,0 +1,160 @@ + + + + + + + + getCalendar method - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getCalendar
+ +
+ +
+ + + + +
+
+ +

getCalendar method + Null safety +

+ +
+ + +List<List<Day?>> +getCalendar(
  1. List<List<Map?>> year
  2. +
) + + + +
+ +
+

Gets the calendar for the whole year.

+

Each element of year's months should be a JSON representation of a Day. +See Day.fromJson for how to represent a Day in JSON.

+
+ + + +
+

Implementation

+
static List<List<Day?>> getCalendar(List<List<Map?>> year) => [
+	for (final List<Map?> month in year) [
+		for (final Map? day in month)
+			if (day == null) null
+			else Day.fromJson(day)
+	]
+];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/getCurrentPeriod.html b/docs/data/Day/getCurrentPeriod.html new file mode 100644 index 000000000..8d253f1a2 --- /dev/null +++ b/docs/data/Day/getCurrentPeriod.html @@ -0,0 +1,168 @@ + + + + + + + + getCurrentPeriod method - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getCurrentPeriod
+ +
+ +
+ + + + +
+
+ +

getCurrentPeriod method + Null safety +

+ +
+ + +int? +getCurrentPeriod() + + + +
+ +
+

The period right now.

+

Uses schedule to calculate the time slots for all the different periods, +and uses DateTime.now() to look up what period it is right now. Also +makes use of Range and Time comparison operators.

+
+ + + +
+

Implementation

+
int? getCurrentPeriod() {
+	final Time time = Time.fromDateTime(DateTime.now());
+	for (int index = 0; index < schedule.periods.length; index++) {
+		final Range range = schedule.periods [index].time;
+		if (range.contains(time)  // during class
+			|| (  // between periods
+				index != 0 &&
+				schedule.periods [index - 1].time < time &&
+				range > time
+			)
+		) {
+			return index;
+		}
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/getDate.html b/docs/data/Day/getDate.html new file mode 100644 index 000000000..94eb4035d --- /dev/null +++ b/docs/data/Day/getDate.html @@ -0,0 +1,154 @@ + + + + + + + + getDate method - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getDate
+ +
+ +
+ + + + +
+
+ +

getDate method + Null safety +

+ +
+ + +Day? +getDate(
  1. List<List<Day?>> calendar,
  2. +
  3. DateTime date
  4. +
) + + + +
+ +
+

Gets the Day for date in the calendar.

+
+ + + +
+

Implementation

+
static Day? getDate(List<List<Day?>> calendar, DateTime date) =>
+	calendar [date.month - 1] [date.day - 1];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/hashCode.html b/docs/data/Day/hashCode.html new file mode 100644 index 000000000..a556bef37 --- /dev/null +++ b/docs/data/Day/hashCode.html @@ -0,0 +1,180 @@ + + + + + + + + hashCode property - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+ +

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode + + +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
@override
+int get hashCode => name.hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/n.html b/docs/data/Day/n.html new file mode 100644 index 000000000..ad62a7a7b --- /dev/null +++ b/docs/data/Day/n.html @@ -0,0 +1,158 @@ + + + + + + + + n property - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
n
+ +
+ +
+ + + + +
+
+ +

n property + Null safety +

+ + + +
+ +
+ String + n + + +
+ + +
+

Whether to say "a" or "an".

+

Remember, name can be a letter and not a word. +So a letter like "R" might need "an" while "B" would need "a".

+
+ + +
+

Implementation

+
String get n =>
+	{"A", "E", "I", "O", "U"}.contains(name [0])
+	|| {"A", "M", "R", "E", "F"}.contains(name) ? "n" : "";
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/name.html b/docs/data/Day/name.html new file mode 100644 index 000000000..e59af5fa6 --- /dev/null +++ b/docs/data/Day/name.html @@ -0,0 +1,150 @@ + + + + + + + + name property - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
name
+ +
+ +
+ + + + +
+
+ +

name property + Null safety +

+ +
+ String + name +
final
+ +
+ +
+

The name of this day.

+

This decides which schedule of the student is shown.

+
+ + +
+

Implementation

+
final String name;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/noSuchMethod.html b/docs/data/Day/noSuchMethod.html new file mode 100644 index 000000000..dfe54d0e9 --- /dev/null +++ b/docs/data/Day/noSuchMethod.html @@ -0,0 +1,186 @@ + + + + + + + + noSuchMethod method - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/operator_equals.html b/docs/data/Day/operator_equals.html new file mode 100644 index 000000000..1f37125c3 --- /dev/null +++ b/docs/data/Day/operator_equals.html @@ -0,0 +1,186 @@ + + + + + + + + operator == method - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+ +

operator == method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +bool +operator ==(
  1. dynamic other
  2. +
) + + + +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
@override
+bool operator == (dynamic other) => other is Day &&
+	other.name == name &&
+	other.schedule == schedule;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/runtimeType.html b/docs/data/Day/runtimeType.html new file mode 100644 index 000000000..dbe9a26b1 --- /dev/null +++ b/docs/data/Day/runtimeType.html @@ -0,0 +1,153 @@ + + + + + + + + runtimeType property - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/schedule.html b/docs/data/Day/schedule.html new file mode 100644 index 000000000..9e69a08ec --- /dev/null +++ b/docs/data/Day/schedule.html @@ -0,0 +1,150 @@ + + + + + + + + schedule property - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schedule
+ +
+ +
+ + + + +
+
+ +

schedule property + Null safety +

+ +
+ Schedule + schedule +
final
+ +
+ +
+

The time allotment for this day.

+

See the Schedule class for more details.

+
+ + +
+

Implementation

+
final Schedule schedule;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/toJson.html b/docs/data/Day/toJson.html new file mode 100644 index 000000000..fb718ca4f --- /dev/null +++ b/docs/data/Day/toJson.html @@ -0,0 +1,154 @@ + + + + + + + + toJson method - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ +
+

Returns a JSON representation of this Day.

+
+ + + +
+

Implementation

+
Map toJson() => {
+	"name": name,
+	"schedule": schedule.name,
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Day/toString.html b/docs/data/Day/toString.html new file mode 100644 index 000000000..b56fa7128 --- /dev/null +++ b/docs/data/Day/toString.html @@ -0,0 +1,166 @@ + + + + + + + + toString method - Day class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
@override
+String toString() => displayName;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback-class.html b/docs/data/Feedback-class.html new file mode 100644 index 000000000..cd68835d8 --- /dev/null +++ b/docs/data/Feedback-class.html @@ -0,0 +1,346 @@ + + + + + + + + Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Feedback
+ +
+ +
+ + + + +
+
+ +

Feedback class + Null safety + +

+ + +
+

Feedback from the user.

+
+ + + +
+

Constructors

+ +
+
+ Feedback({required String message, required bool anonymous, required DateTime timestamp, String? email, String? name}) +
+
+ A const constructor for making a Feedback. [...] +
const
+
+
+
+ +
+

Properties

+ +
+
+ anonymous + → bool + +
+
+ If the feedback should be anonymized. +
final
+ +
+ +
+ email + → String? + +
+
+ The user's email +
final
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ message + → String + +
+
+ The message to the developer. +
final
+ +
+ +
+ name + → String? + +
+
+ The user's name +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ timestamp + → DateTime + +
+
+ When the feedback was submitted. +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ A JSON representation of this feedback. + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/Feedback.html b/docs/data/Feedback/Feedback.html new file mode 100644 index 000000000..c98f75902 --- /dev/null +++ b/docs/data/Feedback/Feedback.html @@ -0,0 +1,157 @@ + + + + + + + + Feedback constructor - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Feedback
+ +
+ +
+ + + + +
+
+ +

Feedback constructor + Null safety +

+ +
const + Feedback(
  1. {required String message,
  2. +
  3. required bool anonymous,
  4. +
  5. required DateTime timestamp,
  6. +
  7. String? email,
  8. +
  9. String? name}
  10. +
) +
+ + +
+

A const constructor for making a Feedback.

+

If anonymous is true, email and name must be null. +This is for privacy reasons.

+
+ + + +
+

Implementation

+
const Feedback({
+	required this.message,
+	required this.anonymous,
+	required this.timestamp,
+	String? email,
+	String? name,
+}) :
+	email = anonymous ? null : email,
+	name = anonymous ? null : name;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/anonymous.html b/docs/data/Feedback/anonymous.html new file mode 100644 index 000000000..0c694d2e4 --- /dev/null +++ b/docs/data/Feedback/anonymous.html @@ -0,0 +1,145 @@ + + + + + + + + anonymous property - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
anonymous
+ +
+ +
+ + + + +
+
+ +

anonymous property + Null safety +

+ +
+ bool + anonymous +
final
+ +
+ +
+

If the feedback should be anonymized.

+
+ + +
+

Implementation

+
final bool anonymous;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/email.html b/docs/data/Feedback/email.html new file mode 100644 index 000000000..e1f8bc843 --- /dev/null +++ b/docs/data/Feedback/email.html @@ -0,0 +1,145 @@ + + + + + + + + email property - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
email
+ +
+ +
+ + + + +
+
+ +

email property + Null safety +

+ +
+ String? + email +
final
+ +
+ +
+

The user's email

+
+ + +
+

Implementation

+
final String? email;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/hashCode.html b/docs/data/Feedback/hashCode.html new file mode 100644 index 000000000..6c4e0350d --- /dev/null +++ b/docs/data/Feedback/hashCode.html @@ -0,0 +1,174 @@ + + + + + + + + hashCode property - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/message.html b/docs/data/Feedback/message.html new file mode 100644 index 000000000..2bffe1b8b --- /dev/null +++ b/docs/data/Feedback/message.html @@ -0,0 +1,145 @@ + + + + + + + + message property - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
message
+ +
+ +
+ + + + +
+
+ +

message property + Null safety +

+ +
+ String + message +
final
+ +
+ +
+

The message to the developer.

+
+ + +
+

Implementation

+
final String message;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/name.html b/docs/data/Feedback/name.html new file mode 100644 index 000000000..fbbb76482 --- /dev/null +++ b/docs/data/Feedback/name.html @@ -0,0 +1,145 @@ + + + + + + + + name property - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
name
+ +
+ +
+ + + + +
+
+ +

name property + Null safety +

+ +
+ String? + name +
final
+ +
+ +
+

The user's name

+
+ + +
+

Implementation

+
final String? name;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/noSuchMethod.html b/docs/data/Feedback/noSuchMethod.html new file mode 100644 index 000000000..3fa634af4 --- /dev/null +++ b/docs/data/Feedback/noSuchMethod.html @@ -0,0 +1,182 @@ + + + + + + + + noSuchMethod method - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/operator_equals.html b/docs/data/Feedback/operator_equals.html new file mode 100644 index 000000000..6e89d0207 --- /dev/null +++ b/docs/data/Feedback/operator_equals.html @@ -0,0 +1,173 @@ + + + + + + + + operator == method - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/runtimeType.html b/docs/data/Feedback/runtimeType.html new file mode 100644 index 000000000..aa4a2cd58 --- /dev/null +++ b/docs/data/Feedback/runtimeType.html @@ -0,0 +1,149 @@ + + + + + + + + runtimeType property - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/timestamp.html b/docs/data/Feedback/timestamp.html new file mode 100644 index 000000000..0119dcec8 --- /dev/null +++ b/docs/data/Feedback/timestamp.html @@ -0,0 +1,145 @@ + + + + + + + + timestamp property - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
timestamp
+ +
+ +
+ + + + +
+
+ +

timestamp property + Null safety +

+ +
+ DateTime + timestamp +
final
+ +
+ +
+

When the feedback was submitted.

+
+ + +
+

Implementation

+
final DateTime timestamp;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/toJson.html b/docs/data/Feedback/toJson.html new file mode 100644 index 000000000..08a406350 --- /dev/null +++ b/docs/data/Feedback/toJson.html @@ -0,0 +1,153 @@ + + + + + + + + toJson method - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ +
+

A JSON representation of this feedback.

+
+ + + +
+

Implementation

+
Map toJson() => {
+	"message": message,
+	"email": email,
+	"name": name,
+	"anonymous": anonymous,
+	"timestamp": timestamp
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Feedback/toString.html b/docs/data/Feedback/toString.html new file mode 100644 index 000000000..8d33adead --- /dev/null +++ b/docs/data/Feedback/toString.html @@ -0,0 +1,155 @@ + + + + + + + + toString method - Feedback class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+

toString method + Null safety +

+ +
+ + +String +toString() + +
inherited
+ +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
external String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Grade-class.html b/docs/data/Grade-class.html new file mode 100644 index 000000000..793562183 --- /dev/null +++ b/docs/data/Grade-class.html @@ -0,0 +1,357 @@ + + + + + + + + Grade enum - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Grade
+ +
+ +
+ + + + +
+
+ +

Grade enum + Null safety + +

+ + +
+

What grade the user is in.

+

The User.grade field could be an int, but by specifying the exact +possible values, we avoid any possible errors, as well as possibly cleaner +code.

+

Faculty users can have User.grade be null.

+
+ + + +
+

Constants

+ +
+
+ freshman + → const Grade + + +
+
+

A Freshman.

+ + +
+ const Grade(0) +
+
+ +
+ junior + → const Grade + + +
+
+

A Junior.

+ + +
+ const Grade(2) +
+
+ +
+ senior + → const Grade + + +
+
+

A Senior.

+ + +
+ const Grade(3) +
+
+ +
+ sophomore + → const Grade + + +
+
+

A Sophomore.

+ + +
+ const Grade(1) +
+
+ +
+ values + → const List<Grade> + + +
+
+

A constant List of the values in this enum, in order of their declaration.

+ + +
+ const List<Grade> +
+
+ +
+
+ + +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ index + → int + +
+
+

The integer index of this enum.

+
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Grade/hashCode.html b/docs/data/Grade/hashCode.html new file mode 100644 index 000000000..5fac0604b --- /dev/null +++ b/docs/data/Grade/hashCode.html @@ -0,0 +1,171 @@ + + + + + + + + hashCode property - Grade extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Grade/noSuchMethod.html b/docs/data/Grade/noSuchMethod.html new file mode 100644 index 000000000..43e8088a2 --- /dev/null +++ b/docs/data/Grade/noSuchMethod.html @@ -0,0 +1,179 @@ + + + + + + + + noSuchMethod method - Grade extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Grade/operator_equals.html b/docs/data/Grade/operator_equals.html new file mode 100644 index 000000000..e08f052ec --- /dev/null +++ b/docs/data/Grade/operator_equals.html @@ -0,0 +1,170 @@ + + + + + + + + operator == method - Grade extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Grade/runtimeType.html b/docs/data/Grade/runtimeType.html new file mode 100644 index 000000000..e7e455b09 --- /dev/null +++ b/docs/data/Grade/runtimeType.html @@ -0,0 +1,146 @@ + + + + + + + + runtimeType property - Grade extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Grade/toString.html b/docs/data/Grade/toString.html new file mode 100644 index 000000000..3764f483d --- /dev/null +++ b/docs/data/Grade/toString.html @@ -0,0 +1,149 @@ + + + + + + + + toString method - Grade extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ + +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity-class.html b/docs/data/GradeActivity-class.html new file mode 100644 index 000000000..9e25d0f88 --- /dev/null +++ b/docs/data/GradeActivity-class.html @@ -0,0 +1,340 @@ + + + + + + + + GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
GradeActivity
+ +
+ +
+ + + + +
+
+ +

GradeActivity class + Null safety + +

+ + +
+

An activity for each grade.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ GradeActivity({required Activity? freshmen, required Activity? sophomores, required Activity? juniors, required Activity? seniors}) +
+
+ Creates a container for activities by grade. +
const
+
+
+ GradeActivity.fromJson(Map json) +
+
+ Creates a container for activities from a JSON object. +
+
+
+ +
+

Properties

+ +
+
+ freshmen + Activity? + +
+
+ The activity for freshmen. +
final
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ juniors + Activity? + +
+
+ The activity for juniors. +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ seniors + Activity? + +
+
+ The activity for seniors. +
final
+ +
+ +
+ sophomores + Activity? + +
+
+ The activity for sophomores. +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/GradeActivity.fromJson.html b/docs/data/GradeActivity/GradeActivity.fromJson.html new file mode 100644 index 000000000..82a3ba990 --- /dev/null +++ b/docs/data/GradeActivity/GradeActivity.fromJson.html @@ -0,0 +1,148 @@ + + + + + + + + GradeActivity.fromJson constructor - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
GradeActivity.fromJson
+ +
+ +
+ + + + +
+
+ +

GradeActivity.fromJson constructor + Null safety +

+ +
+ GradeActivity.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Creates a container for activities from a JSON object.

+
+ + + +
+

Implementation

+
GradeActivity.fromJson(Map json) :
+	freshmen = Activity.fromJson(Map.from(json ["freshmen"])),
+	sophomores = Activity.fromJson(
+		Map.from(json ["sophomores"])
+	),
+	juniors = Activity.fromJson(Map.from(json ["juniors"])),
+	seniors = Activity.fromJson(Map.from(json ["seniors"]));
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/GradeActivity.html b/docs/data/GradeActivity/GradeActivity.html new file mode 100644 index 000000000..dea24eafd --- /dev/null +++ b/docs/data/GradeActivity/GradeActivity.html @@ -0,0 +1,150 @@ + + + + + + + + GradeActivity constructor - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
GradeActivity
+ +
+ +
+ + + + +
+
+ +

GradeActivity constructor + Null safety +

+ +
const + GradeActivity(
  1. {required Activity? freshmen,
  2. +
  3. required Activity? sophomores,
  4. +
  5. required Activity? juniors,
  6. +
  7. required Activity? seniors}
  8. +
) +
+ + +
+

Creates a container for activities by grade.

+
+ + + +
+

Implementation

+
const GradeActivity({
+	required this.freshmen,
+	required this.sophomores,
+	required this.juniors,
+	required this.seniors,
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/freshmen.html b/docs/data/GradeActivity/freshmen.html new file mode 100644 index 000000000..06a5c3e4c --- /dev/null +++ b/docs/data/GradeActivity/freshmen.html @@ -0,0 +1,144 @@ + + + + + + + + freshmen property - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
freshmen
+ +
+ +
+ + + + +
+
+ +

freshmen property + Null safety +

+ +
+ Activity? + freshmen +
final
+ +
+ +
+

The activity for freshmen.

+
+ + +
+

Implementation

+
final Activity? freshmen;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/hashCode.html b/docs/data/GradeActivity/hashCode.html new file mode 100644 index 000000000..e1a97f20c --- /dev/null +++ b/docs/data/GradeActivity/hashCode.html @@ -0,0 +1,173 @@ + + + + + + + + hashCode property - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/juniors.html b/docs/data/GradeActivity/juniors.html new file mode 100644 index 000000000..9b42d9939 --- /dev/null +++ b/docs/data/GradeActivity/juniors.html @@ -0,0 +1,144 @@ + + + + + + + + juniors property - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
juniors
+ +
+ +
+ + + + +
+
+ +

juniors property + Null safety +

+ +
+ Activity? + juniors +
final
+ +
+ +
+

The activity for juniors.

+
+ + +
+

Implementation

+
final Activity? juniors;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/noSuchMethod.html b/docs/data/GradeActivity/noSuchMethod.html new file mode 100644 index 000000000..8af0b6ef5 --- /dev/null +++ b/docs/data/GradeActivity/noSuchMethod.html @@ -0,0 +1,181 @@ + + + + + + + + noSuchMethod method - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/operator_equals.html b/docs/data/GradeActivity/operator_equals.html new file mode 100644 index 000000000..5e8fddd36 --- /dev/null +++ b/docs/data/GradeActivity/operator_equals.html @@ -0,0 +1,172 @@ + + + + + + + + operator == method - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/runtimeType.html b/docs/data/GradeActivity/runtimeType.html new file mode 100644 index 000000000..66736a350 --- /dev/null +++ b/docs/data/GradeActivity/runtimeType.html @@ -0,0 +1,148 @@ + + + + + + + + runtimeType property - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/seniors.html b/docs/data/GradeActivity/seniors.html new file mode 100644 index 000000000..fb01427a8 --- /dev/null +++ b/docs/data/GradeActivity/seniors.html @@ -0,0 +1,144 @@ + + + + + + + + seniors property - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
seniors
+ +
+ +
+ + + + +
+
+ +

seniors property + Null safety +

+ +
+ Activity? + seniors +
final
+ +
+ +
+

The activity for seniors.

+
+ + +
+

Implementation

+
final Activity? seniors;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/sophomores.html b/docs/data/GradeActivity/sophomores.html new file mode 100644 index 000000000..569dcdcdc --- /dev/null +++ b/docs/data/GradeActivity/sophomores.html @@ -0,0 +1,144 @@ + + + + + + + + sophomores property - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
sophomores
+ +
+ +
+ + + + +
+
+ +

sophomores property + Null safety +

+ +
+ Activity? + sophomores +
final
+ +
+ +
+

The activity for sophomores.

+
+ + +
+

Implementation

+
final Activity? sophomores;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/GradeActivity/toString.html b/docs/data/GradeActivity/toString.html new file mode 100644 index 000000000..4feeeee05 --- /dev/null +++ b/docs/data/GradeActivity/toString.html @@ -0,0 +1,165 @@ + + + + + + + + toString method - GradeActivity class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
@override
+String toString() =>
+	"Freshmen: ${freshmen.toString()}\n\n"
+	"Sophomores: ${sophomores.toString()}\n\n"
+	"Juniors: ${juniors.toString()}\n\n"
+	"Seniors: ${seniors.toString()}";
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Message-class.html b/docs/data/Message-class.html new file mode 100644 index 000000000..5219c4bb4 --- /dev/null +++ b/docs/data/Message-class.html @@ -0,0 +1,304 @@ + + + + + + + + Message class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Message
+ +
+ +
+ + + + +
+
+ +

Message class + Null safety + +

+ + + + + +
+

Constructors

+ +
+
+ Message({required ContactInfo sender, required DateTime timestamp, required String body}) +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ body + ↔ String + +
+
+ +
read / write
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ sender + ↔ ContactInfo + +
+
+ +
read / write
+ +
+ +
+ timestamp + ↔ DateTime + +
+
+ +
read / write
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Message/Message.html b/docs/data/Message/Message.html new file mode 100644 index 000000000..8817f44fc --- /dev/null +++ b/docs/data/Message/Message.html @@ -0,0 +1,143 @@ + + + + + + + + Message constructor - Message class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Message
+ +
+ +
+ + + + +
+
+ +

Message constructor + Null safety +

+ +
+ Message(
  1. {required ContactInfo sender,
  2. +
  3. required DateTime timestamp,
  4. +
  5. required String body}
  6. +
) +
+ + + + + +
+

Implementation

+
Message({
+	required this.sender,
+	required this.timestamp,
+	required this.body,
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Message/body.html b/docs/data/Message/body.html new file mode 100644 index 000000000..960f834b8 --- /dev/null +++ b/docs/data/Message/body.html @@ -0,0 +1,139 @@ + + + + + + + + body property - Message class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
body
+ +
+ +
+ + + + +
+
+ +

body property + Null safety +

+ +
+ String + body +
read / write
+ +
+ + + +
+

Implementation

+
String body;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Message/hashCode.html b/docs/data/Message/hashCode.html new file mode 100644 index 000000000..0d8afb516 --- /dev/null +++ b/docs/data/Message/hashCode.html @@ -0,0 +1,171 @@ + + + + + + + + hashCode property - Message class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Message/noSuchMethod.html b/docs/data/Message/noSuchMethod.html new file mode 100644 index 000000000..ce1c5a5d2 --- /dev/null +++ b/docs/data/Message/noSuchMethod.html @@ -0,0 +1,179 @@ + + + + + + + + noSuchMethod method - Message class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Message/operator_equals.html b/docs/data/Message/operator_equals.html new file mode 100644 index 000000000..1e94ee978 --- /dev/null +++ b/docs/data/Message/operator_equals.html @@ -0,0 +1,170 @@ + + + + + + + + operator == method - Message class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Message/runtimeType.html b/docs/data/Message/runtimeType.html new file mode 100644 index 000000000..4d239a02d --- /dev/null +++ b/docs/data/Message/runtimeType.html @@ -0,0 +1,146 @@ + + + + + + + + runtimeType property - Message class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Message/sender.html b/docs/data/Message/sender.html new file mode 100644 index 000000000..6d12d9bd6 --- /dev/null +++ b/docs/data/Message/sender.html @@ -0,0 +1,139 @@ + + + + + + + + sender property - Message class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
sender
+ +
+ +
+ + + + +
+
+ +

sender property + Null safety +

+ +
+ ContactInfo + sender +
read / write
+ +
+ + + +
+

Implementation

+
ContactInfo sender;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Message/timestamp.html b/docs/data/Message/timestamp.html new file mode 100644 index 000000000..bc0c351ea --- /dev/null +++ b/docs/data/Message/timestamp.html @@ -0,0 +1,139 @@ + + + + + + + + timestamp property - Message class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
timestamp
+ +
+ +
+ + + + +
+
+ +

timestamp property + Null safety +

+ +
+ DateTime + timestamp +
read / write
+ +
+ + + +
+

Implementation

+
DateTime timestamp;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Message/toString.html b/docs/data/Message/toString.html new file mode 100644 index 000000000..60e776aad --- /dev/null +++ b/docs/data/Message/toString.html @@ -0,0 +1,152 @@ + + + + + + + + toString method - Message class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+

toString method + Null safety +

+ +
+ + +String +toString() + +
inherited
+ +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
external String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period-class.html b/docs/data/Period-class.html new file mode 100644 index 000000000..7695e003c --- /dev/null +++ b/docs/data/Period-class.html @@ -0,0 +1,430 @@ + + + + + + + + Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Period
+ +
+ +
+ + + + +
+
+ +

Period class + Null safety + +

+ + +
+

A representation of a period, including the time it takes place.

+

Period objects unpack the PeriodData passed to them, +so that they alone contain all the information to represent a period.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ Period({required PeriodData? data, required Range time, required String name, Activity? activity}) +
+
+ Unpacks a PeriodData object and returns a Period. +
const
+
+
+ Period.fromJson(Map json) +
+
+ A Period as represented by the calendar. [...] +
+
+ Period.raw({required String name, required Range time, Activity? activity}) +
+
+ A Period as represented by the calendar. [...] +
const
+
+
+
+ +
+

Properties

+ +
+
+ activity + Activity? + +
+
+ The activity for this period. +
final
+ +
+ +
+ data + PeriodData? + +
+
+ The section ID and room for this period. [...] +
final
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only
+ +
+ +
+ id + → String? + +
+
+ The section ID for this period. [...] +
read-only
+ +
+ +
+ isFree + → bool + +
+
+ Whether this is a free period. +
read-only
+ +
+ +
+ name + → String + +
+
+ A String representation of this period. [...] +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ time + Range + +
+
+ The time this period takes place. +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ copyWith(PeriodData? data) + Period + + + +
+
+ Copies this period with the PeriodData of another. [...] + + +
+ +
+ getInfo(Subject? subject) + → List<String> + + + +
+
+ Returns a list of descriptions for this period. [...] + + +
+ +
+ getName(Subject? subject) + → String + + + +
+
+ Returns a String representation of this period. [...] + + +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ The JSON representation of this period. + + +
+ +
+ toString() + → String + + + +
+
+ This is only for debug purposes. Use getName for UI labels. + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(dynamic other) + → bool + + + +
+
+ The equality operator. [...] + + +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/Period.fromJson.html b/docs/data/Period/Period.fromJson.html new file mode 100644 index 000000000..ddd33183c --- /dev/null +++ b/docs/data/Period/Period.fromJson.html @@ -0,0 +1,155 @@ + + + + + + + + Period.fromJson constructor - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Period.fromJson
+ +
+ +
+ + + + +
+
+ +

Period.fromJson constructor + Null safety +

+ +
+ Period.fromJson(
  1. Map json
  2. +
) +
+ + +
+

A Period as represented by the calendar.

+

This period is student-agnostic, so data is automatically null.

+
+ + + +
+

Implementation

+
Period.fromJson(Map json) :
+	time = Range.fromJson(json ["time"]),
+	name = json ["name"],
+	data = null,
+	activity = json ["activity"] == null ? null
+		: Activity.fromJson(json ["activity"]);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/Period.html b/docs/data/Period/Period.html new file mode 100644 index 000000000..3b4d908e0 --- /dev/null +++ b/docs/data/Period/Period.html @@ -0,0 +1,157 @@ + + + + + + + + Period constructor - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Period
+ +
+ +
+ + + + +
+
+ +

Period constructor + Null safety +

+ +
const + Period(
  1. {required PeriodData? data,
  2. +
  3. required Range time,
  4. +
  5. required String name,
  6. +
  7. Activity? activity}
  8. +
) +
+ + +
+

Unpacks a PeriodData object and returns a Period.

+
+ + + +
+

Implementation

+
const Period({
+	required this.data,
+	required this.time,
+	required this.name,
+	this.activity
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/Period.raw.html b/docs/data/Period/Period.raw.html new file mode 100644 index 000000000..10880c13f --- /dev/null +++ b/docs/data/Period/Period.raw.html @@ -0,0 +1,157 @@ + + + + + + + + Period.raw constructor - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Period.raw
+ +
+ +
+ + + + +
+
+ +

Period.raw constructor + Null safety +

+ +
const + Period.raw(
  1. {required String name,
  2. +
  3. required Range time,
  4. +
  5. Activity? activity}
  6. +
) +
+ + +
+

A Period as represented by the calendar.

+

This period is student-agnostic, so data is automatically null. This +constructor can be used instead of fromJson() to build preset schedules

+
+ + + +
+

Implementation

+
const Period.raw({
+	required this.name,
+	required this.time,
+	this.activity,
+}) : data = null;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/activity.html b/docs/data/Period/activity.html new file mode 100644 index 000000000..5dde340cb --- /dev/null +++ b/docs/data/Period/activity.html @@ -0,0 +1,151 @@ + + + + + + + + activity property - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
activity
+ +
+ +
+ + + + +
+
+ +

activity property + Null safety +

+ +
+ Activity? + activity +
final
+ +
+ +
+

The activity for this period.

+
+ + +
+

Implementation

+
final Activity? activity;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/copyWith.html b/docs/data/Period/copyWith.html new file mode 100644 index 000000000..5798c0790 --- /dev/null +++ b/docs/data/Period/copyWith.html @@ -0,0 +1,164 @@ + + + + + + + + copyWith method - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
copyWith
+ +
+ +
+ + + + +
+
+ +

copyWith method + Null safety +

+ +
+ + +Period +copyWith(
  1. PeriodData? data
  2. +
) + + + +
+ +
+

Copies this period with the PeriodData of another.

+

This is useful because Period objects serve a dual purpose. Their first +use is in the calendar, where they simply store data about Ranges and +are used to determine when the periods occur. Then, this information is +merged with the user's PeriodData objects to create a Period that has +access to the class the user has at a given time.

+
+ + + +
+

Implementation

+
Period copyWith(PeriodData? data) => Period(
+	name: name,
+	data: data,
+	time: time,
+	activity: activity,
+);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/data.html b/docs/data/Period/data.html new file mode 100644 index 000000000..988b0bd7a --- /dev/null +++ b/docs/data/Period/data.html @@ -0,0 +1,152 @@ + + + + + + + + data property - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
data
+ +
+ +
+ + + + +
+
+ +

data property + Null safety +

+ +
+ PeriodData? + data +
final
+ +
+ +
+

The section ID and room for this period.

+

If null, it's a free period.

+
+ + +
+

Implementation

+
final PeriodData? data;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/getInfo.html b/docs/data/Period/getInfo.html new file mode 100644 index 000000000..8a11e8226 --- /dev/null +++ b/docs/data/Period/getInfo.html @@ -0,0 +1,168 @@ + + + + + + + + getInfo method - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getInfo
+ +
+ +
+ + + + +
+
+ +

getInfo method + Null safety +

+ +
+ + +List<String> +getInfo(
  1. Subject? subject
  2. +
) + + + +
+ +
+

Returns a list of descriptions for this period.

+

The expected subject can be retrieved by looking up data.id.

+

Useful throughout the UI. This function will:

+
    +
  1. Always display the time.
  2. +
  3. If name is a number, will display the period.
  4. +
  5. If data.room is not null, will display the room.
  6. +
  7. If data.id is valid, will return the name of the Subject.
  8. +
+
+ + + +
+

Implementation

+
List <String> getInfo (Subject? subject) => [
+	"Time: $time",
+	if (int.tryParse(name) != null) "Period: $name",
+	if (data != null) "Room: ${data!.room}",
+	if (subject != null) "Teacher: ${subject.teacher}",
+	if (subject?.virtualLink != null) "Zoom link: ${subject!.virtualLink}",
+];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/getName.html b/docs/data/Period/getName.html new file mode 100644 index 000000000..57b7cafd8 --- /dev/null +++ b/docs/data/Period/getName.html @@ -0,0 +1,166 @@ + + + + + + + + getName method - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getName
+ +
+ +
+ + + + +
+
+ +

getName method + Null safety +

+ +
+ + +String +getName(
  1. Subject? subject
  2. +
) + + + +
+ +
+

Returns a String representation of this period.

+

The expected subject can be retrieved by looking up data.id.

+

If name is an integer and data is null, then it is a free period. +Otherwise, if name is not a number, than it is returned instead. +Finally, the Subject that corresponds to data will be returned.

+

For example:

+
    +
  1. A period with null data will return "Free period"
  2. +
  3. A period with name == "Homeroom" will return "Homeroom"
  4. +
  5. A period with name == "3" will return the name of the Subject.
  6. +
+
+ + + +
+

Implementation

+
String getName(Subject? subject) => int.tryParse(name) != null && isFree
+	? "Free period"
+	: subject?.name ?? name;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/hashCode.html b/docs/data/Period/hashCode.html new file mode 100644 index 000000000..5c885a913 --- /dev/null +++ b/docs/data/Period/hashCode.html @@ -0,0 +1,182 @@ + + + + + + + + hashCode property - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+ +

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode + + +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
@override
+int get hashCode => "$name-${data?.id ?? ''}".hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/id.html b/docs/data/Period/id.html new file mode 100644 index 000000000..1366d8959 --- /dev/null +++ b/docs/data/Period/id.html @@ -0,0 +1,157 @@ + + + + + + + + id property - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
id
+ +
+ +
+ + + + +
+
+ +

id property + Null safety +

+ + + +
+ +
+ String? + id + + +
+ + +
+

The section ID for this period.

+

See PeriodData.id.

+
+ + +
+

Implementation

+
String? get id => data?.id;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/isFree.html b/docs/data/Period/isFree.html new file mode 100644 index 000000000..a28f797a7 --- /dev/null +++ b/docs/data/Period/isFree.html @@ -0,0 +1,156 @@ + + + + + + + + isFree property - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
isFree
+ +
+ +
+ + + + +
+
+ +

isFree property + Null safety +

+ + + +
+ +
+ bool + isFree + + +
+ + +
+

Whether this is a free period.

+
+ + +
+

Implementation

+
bool get isFree => data == null;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/name.html b/docs/data/Period/name.html new file mode 100644 index 000000000..a31dc7320 --- /dev/null +++ b/docs/data/Period/name.html @@ -0,0 +1,154 @@ + + + + + + + + name property - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
name
+ +
+ +
+ + + + +
+
+ +

name property + Null safety +

+ +
+ String + name +
final
+ +
+ +
+

A String representation of this period.

+

Since a period can be a number (like 9), or a word (like "Homeroom"), +String was chosen to represent both. This means that the app does not +care whether a period is a regular class or something like homeroom.

+
+ + +
+

Implementation

+
final String name;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/noSuchMethod.html b/docs/data/Period/noSuchMethod.html new file mode 100644 index 000000000..8d6cf2220 --- /dev/null +++ b/docs/data/Period/noSuchMethod.html @@ -0,0 +1,188 @@ + + + + + + + + noSuchMethod method - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/operator_equals.html b/docs/data/Period/operator_equals.html new file mode 100644 index 000000000..1bbae1f9b --- /dev/null +++ b/docs/data/Period/operator_equals.html @@ -0,0 +1,189 @@ + + + + + + + + operator == method - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+ +

operator == method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +bool +operator ==(
  1. dynamic other
  2. +
) + + + +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
@override
+bool operator == (dynamic other) => other is Period &&
+	other.time == time &&
+	other.name == name &&
+	other.data == data;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/runtimeType.html b/docs/data/Period/runtimeType.html new file mode 100644 index 000000000..be24f2362 --- /dev/null +++ b/docs/data/Period/runtimeType.html @@ -0,0 +1,155 @@ + + + + + + + + runtimeType property - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/time.html b/docs/data/Period/time.html new file mode 100644 index 000000000..ac4ae9c4e --- /dev/null +++ b/docs/data/Period/time.html @@ -0,0 +1,151 @@ + + + + + + + + time property - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
time
+ +
+ +
+ + + + +
+
+ +

time property + Null safety +

+ +
+ Range + time +
final
+ +
+ +
+

The time this period takes place.

+
+ + +
+

Implementation

+
final Range time;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/toJson.html b/docs/data/Period/toJson.html new file mode 100644 index 000000000..5a8688397 --- /dev/null +++ b/docs/data/Period/toJson.html @@ -0,0 +1,157 @@ + + + + + + + + toJson method - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ +
+

The JSON representation of this period.

+
+ + + +
+

Implementation

+
Map toJson() => {
+	"time": time.toJson(),
+	"name": name,
+	"activity": activity?.toJson(),
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Period/toString.html b/docs/data/Period/toString.html new file mode 100644 index 000000000..4d8ce21c8 --- /dev/null +++ b/docs/data/Period/toString.html @@ -0,0 +1,159 @@ + + + + + + + + toString method - Period class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

This is only for debug purposes. Use getName for UI labels.

+
+ + + +
+

Implementation

+
@override
+String toString() => "Period $name";
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData-class.html b/docs/data/PeriodData-class.html new file mode 100644 index 000000000..43622b816 --- /dev/null +++ b/docs/data/PeriodData-class.html @@ -0,0 +1,339 @@ + + + + + + + + PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
PeriodData
+ +
+ +
+ + + + +
+
+ +

PeriodData class + Null safety + +

+ + +
+

A representation of a period, independent of the time.

+

This is needed since the time can change on any day. +See Schedule for how to handle different times.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ PeriodData({required String room, required String id}) +
+
+ A const constructor for a PeriodData. [...] +
const
+
+
+ PeriodData.fromJson(Map json) +
+
+ Returns a PeriodData from a JSON object. [...] +
factory
+
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only
+ +
+ +
+ id + → String + +
+
+ The id for this period's subject. [...] +
final
+ +
+ +
+ room + → String + +
+
+ The room the student needs to be in for this period. +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(dynamic other) + → bool + + + +
+
+ The equality operator. [...] + + +
+ +
+
+ + +
+

Static Methods

+
+
+ getList(List json) + → List<PeriodData?> + + + +
+
+ Returns a list of PeriodData from a JSON object. [...] + + +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData/PeriodData.fromJson.html b/docs/data/PeriodData/PeriodData.fromJson.html new file mode 100644 index 000000000..37d14689b --- /dev/null +++ b/docs/data/PeriodData/PeriodData.fromJson.html @@ -0,0 +1,146 @@ + + + + + + + + PeriodData.fromJson constructor - PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
PeriodData.fromJson
+ +
+ +
+ + + + +
+
+ +

PeriodData.fromJson constructor + Null safety +

+ +
+ PeriodData.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Returns a PeriodData from a JSON object.

+

Both json ["room"] and json ["id"] must be non-null.

+
+ + + +
+

Implementation

+
factory PeriodData.fromJson(Map json) => PeriodData(
+	room: json ["room"],
+	id: json ["id"]
+);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData/PeriodData.html b/docs/data/PeriodData/PeriodData.html new file mode 100644 index 000000000..684d8c5fb --- /dev/null +++ b/docs/data/PeriodData/PeriodData.html @@ -0,0 +1,147 @@ + + + + + + + + PeriodData constructor - PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
PeriodData
+ +
+ +
+ + + + +
+
+ +

PeriodData constructor + Null safety +

+ +
const + PeriodData(
  1. {required String room,
  2. +
  3. required String id}
  4. +
) +
+ + +
+

A const constructor for a PeriodData.

+

Free periods should be represented by null and not PeriodData.

+
+ + + +
+

Implementation

+
const PeriodData ({
+	required this.room,
+	required this.id
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData/getList.html b/docs/data/PeriodData/getList.html new file mode 100644 index 000000000..1892573dd --- /dev/null +++ b/docs/data/PeriodData/getList.html @@ -0,0 +1,154 @@ + + + + + + + + getList method - PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getList
+ +
+ +
+ + + + +
+
+ +

getList method + Null safety +

+ +
+ + +List<PeriodData?> +getList(
  1. List json
  2. +
) + + + +
+ +
+

Returns a list of PeriodData from a JSON object.

+

Note that some entries in the list may be null. +They represent a free period in the schedule. +See PeriodData.fromJson for more details.

+
+ + + +
+

Implementation

+
static List<PeriodData?> getList(List json) => [
+	for (final dynamic periodJson in json)
+		periodJson == null ? null :
+			PeriodData.fromJson(Map.from(periodJson))
+];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData/hashCode.html b/docs/data/PeriodData/hashCode.html new file mode 100644 index 000000000..2ab05dae1 --- /dev/null +++ b/docs/data/PeriodData/hashCode.html @@ -0,0 +1,175 @@ + + + + + + + + hashCode property - PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+ +

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode + + +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
@override
+int get hashCode => "$room-$id".hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData/id.html b/docs/data/PeriodData/id.html new file mode 100644 index 000000000..3a027c2cf --- /dev/null +++ b/docs/data/PeriodData/id.html @@ -0,0 +1,145 @@ + + + + + + + + id property - PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
id
+ +
+ +
+ + + + +
+
+ +

id property + Null safety +

+ +
+ String + id +
final
+ +
+ +
+

The id for this period's subject.

+

See the Subject class for more details.

+
+ + +
+

Implementation

+
final String id;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData/noSuchMethod.html b/docs/data/PeriodData/noSuchMethod.html new file mode 100644 index 000000000..6ecd7a9f5 --- /dev/null +++ b/docs/data/PeriodData/noSuchMethod.html @@ -0,0 +1,181 @@ + + + + + + + + noSuchMethod method - PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData/operator_equals.html b/docs/data/PeriodData/operator_equals.html new file mode 100644 index 000000000..acbd01368 --- /dev/null +++ b/docs/data/PeriodData/operator_equals.html @@ -0,0 +1,181 @@ + + + + + + + + operator == method - PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+ +

operator == method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +bool +operator ==(
  1. dynamic other
  2. +
) + + + +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
@override
+bool operator == (dynamic other) => other is PeriodData &&
+	other.id == id &&
+	other.room == room;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData/room.html b/docs/data/PeriodData/room.html new file mode 100644 index 000000000..c41c44dfa --- /dev/null +++ b/docs/data/PeriodData/room.html @@ -0,0 +1,144 @@ + + + + + + + + room property - PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
room
+ +
+ +
+ + + + +
+
+ +

room property + Null safety +

+ +
+ String + room +
final
+ +
+ +
+

The room the student needs to be in for this period.

+
+ + +
+

Implementation

+
final String room;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData/runtimeType.html b/docs/data/PeriodData/runtimeType.html new file mode 100644 index 000000000..dc46d221a --- /dev/null +++ b/docs/data/PeriodData/runtimeType.html @@ -0,0 +1,148 @@ + + + + + + + + runtimeType property - PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodData/toString.html b/docs/data/PeriodData/toString.html new file mode 100644 index 000000000..4d4cbca8a --- /dev/null +++ b/docs/data/PeriodData/toString.html @@ -0,0 +1,161 @@ + + + + + + + + toString method - PeriodData class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
@override
+String toString() => "PeriodData ($id, $room)";
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodReminderTime-class.html b/docs/data/PeriodReminderTime-class.html new file mode 100644 index 000000000..34137963a --- /dev/null +++ b/docs/data/PeriodReminderTime-class.html @@ -0,0 +1,382 @@ + + + + + + + + PeriodReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
PeriodReminderTime
+ +
+ +
+ + + + +
+
+ +

PeriodReminderTime class + Null safety + +

+ + +
+

A ReminderTime that depends on a name and period.

+
+ + +
+
+
Inheritance
+
+ + + + + +
+
+ +
+

Constructors

+ +
+
+ PeriodReminderTime({required String dayName, required String period, required bool repeats}) +
+
+ Returns a new PeriodReminderTime. [...] +
const
+
+
+ PeriodReminderTime.fromJson(Map json) +
+
+ Creates a new ReminderTime from JSON. [...] +
+
+
+ +
+

Properties

+ +
+
+ dayName + → String + +
+
+ The day for when this reminder should be displayed. +
final
+ +
+ +
+ hash + → String + +
+
+ +
read-only, override
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ period + → String + +
+
+ The period when this reminder should be displayed. +
final
+ +
+ +
+ repeats + → bool + +
+
+ Whether the reminder should repeat. +
final, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ type + ReminderTimeType + +
+
+ The type of reminder. [...] +
final, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ doesApply({required String? dayName, required String? subject, required String? period}) + → bool + + + +
+
+ Returns true if dayName and period match this instance's fields. +
override
+ +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ Returns this ReminderTime as JSON. +
override
+ +
+ +
+ toString() + → String + + + +
+
+ Returns a String representation of this ReminderTime. [...] +
override
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodReminderTime/PeriodReminderTime.fromJson.html b/docs/data/PeriodReminderTime/PeriodReminderTime.fromJson.html new file mode 100644 index 000000000..21bc7662d --- /dev/null +++ b/docs/data/PeriodReminderTime/PeriodReminderTime.fromJson.html @@ -0,0 +1,151 @@ + + + + + + + + PeriodReminderTime.fromJson constructor - PeriodReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
PeriodReminderTime.fromJson
+ +
+ +
+ + + + +
+
+ +

PeriodReminderTime.fromJson constructor + Null safety +

+ +
+ PeriodReminderTime.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Creates a new ReminderTime from JSON.

+

json ["dayName"] should be one of the valid names.

+

json ["period"] should be a valid period for that day, +notwithstanding any schedule changes (like an "early dismissal").

+
+ + + +
+

Implementation

+
PeriodReminderTime.fromJson(Map json) :
+	dayName = json ["dayName"],
+	period = json ["period"],
+	super (repeats: json ["repeats"], type: ReminderTimeType.period);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodReminderTime/PeriodReminderTime.html b/docs/data/PeriodReminderTime/PeriodReminderTime.html new file mode 100644 index 000000000..b7d2cb6c6 --- /dev/null +++ b/docs/data/PeriodReminderTime/PeriodReminderTime.html @@ -0,0 +1,152 @@ + + + + + + + + PeriodReminderTime constructor - PeriodReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
PeriodReminderTime
+ +
+ +
+ + + + +
+
+ +

PeriodReminderTime constructor + Null safety +

+ +
const + PeriodReminderTime(
  1. {required String dayName,
  2. +
  3. required String period,
  4. +
  5. required bool repeats}
  6. +
) +
+ + +
+

Returns a new PeriodReminderTime.

+

All parameters must be non-null.

+
+ + + +
+

Implementation

+
const PeriodReminderTime({
+	required this.dayName,
+	required this.period,
+	required bool repeats
+}) : super (repeats: repeats, type: ReminderTimeType.period);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodReminderTime/dayName.html b/docs/data/PeriodReminderTime/dayName.html new file mode 100644 index 000000000..d7ccca424 --- /dev/null +++ b/docs/data/PeriodReminderTime/dayName.html @@ -0,0 +1,147 @@ + + + + + + + + dayName property - PeriodReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
dayName
+ +
+ +
+ + + + +
+
+ +

dayName property + Null safety +

+ +
+ String + dayName +
final
+ +
+ +
+

The day for when this reminder should be displayed.

+
+ + +
+

Implementation

+
final String dayName;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodReminderTime/doesApply.html b/docs/data/PeriodReminderTime/doesApply.html new file mode 100644 index 000000000..fe35bd4f3 --- /dev/null +++ b/docs/data/PeriodReminderTime/doesApply.html @@ -0,0 +1,162 @@ + + + + + + + + doesApply method - PeriodReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
doesApply
+ +
+ +
+ + + + +
+
+ +

doesApply method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +bool +doesApply(
  1. {required String? dayName,
  2. +
  3. required String? subject,
  4. +
  5. required String? period}
  6. +
) + +
override
+ +
+ +
+

Returns true if dayName and period match this instance's fields.

+
+ + + +
+

Implementation

+
@override
+bool doesApply({
+	required String? dayName,
+	required String? subject,
+	required String? period,
+}) => dayName == this.dayName && period == this.period;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodReminderTime/hash.html b/docs/data/PeriodReminderTime/hash.html new file mode 100644 index 000000000..cc13673a2 --- /dev/null +++ b/docs/data/PeriodReminderTime/hash.html @@ -0,0 +1,150 @@ + + + + + + + + hash property - PeriodReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hash
+ +
+ +
+ + + + +
+
+ +

hash property + Null safety +

+ + + +
+ +
+ String + hash +
override
+ +
+ + + + +
+

Implementation

+
@override
+String get hash => "$dayName-$period-$repeats";
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodReminderTime/period.html b/docs/data/PeriodReminderTime/period.html new file mode 100644 index 000000000..39ede81cd --- /dev/null +++ b/docs/data/PeriodReminderTime/period.html @@ -0,0 +1,147 @@ + + + + + + + + period property - PeriodReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
period
+ +
+ +
+ + + + +
+
+ +

period property + Null safety +

+ +
+ String + period +
final
+ +
+ +
+

The period when this reminder should be displayed.

+
+ + +
+

Implementation

+
final String period;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodReminderTime/toJson.html b/docs/data/PeriodReminderTime/toJson.html new file mode 100644 index 000000000..e488c3967 --- /dev/null +++ b/docs/data/PeriodReminderTime/toJson.html @@ -0,0 +1,160 @@ + + + + + + + + toJson method - PeriodReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +Map +toJson() + +
override
+ +
+ +
+

Returns this ReminderTime as JSON.

+
+ + + +
+

Implementation

+
@override
+Map toJson() => {
+	"dayName": dayName,
+	"period": period,
+	"repeats": repeats,
+	"type": reminderTimeToString [type],
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/PeriodReminderTime/toString.html b/docs/data/PeriodReminderTime/toString.html new file mode 100644 index 000000000..6ec6d3206 --- /dev/null +++ b/docs/data/PeriodReminderTime/toString.html @@ -0,0 +1,157 @@ + + + + + + + + toString method - PeriodReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + +
override
+ +
+ +
+

Returns a String representation of this ReminderTime.

+

Used for debugging and throughout the UI.

+
+ + + +
+

Implementation

+
@override
+String toString() =>
+	"${repeats ? 'Repeats every ' : ''}$dayName-$period";
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range-class.html b/docs/data/Range-class.html new file mode 100644 index 000000000..d9b8be898 --- /dev/null +++ b/docs/data/Range-class.html @@ -0,0 +1,379 @@ + + + + + + + + Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Range
+ +
+ +
+ + + + +
+
+ +

Range class + Null safety + +

+ + +
+

A range of times.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ Range(Time start, Time end) +
+
+ Provides a const constructor. +
const
+
+
+ Range.fromJson(Map json) +
+
+ Returns a new Range from JSON data [...] +
+
+ Range.nums(int startHour, int startMinute, int endHour, int endMinute) +
+
+ Convenience method for manually creating a range by hand. +
+
+
+ +
+

Properties

+ +
+
+ end + Time + +
+
+ When this range ends. +
final
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ start + Time + +
+
+ When this range starts. +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ contains(Time other) + → bool + + + +
+
+ Returns whether other is in this range. + + +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ Returns a JSON representation of this range. + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator <(Time other) + → bool + + + +
+
+ Returns whether this range is before another range. + + +
+ +
+ operator ==(dynamic other) + → bool + + + +
+
+ The equality operator. [...] + + +
+ +
+ operator >(Time other) + → bool + + + +
+
+ Returns whether this range is after another range. + + +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/Range.fromJson.html b/docs/data/Range/Range.fromJson.html new file mode 100644 index 000000000..840fc9b4b --- /dev/null +++ b/docs/data/Range/Range.fromJson.html @@ -0,0 +1,150 @@ + + + + + + + + Range.fromJson constructor - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Range.fromJson
+ +
+ +
+ + + + +
+
+ +

Range.fromJson constructor + Null safety +

+ +
+ Range.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Returns a new Range from JSON data

+

The json must have start and end fields +that map to Time JSON objects. +See Time.fromJson for more details.

+
+ + + +
+

Implementation

+
Range.fromJson(Map json) :
+	start = Time.fromJson(Map.from(json ["start"])),
+	end = Time.fromJson(Map.from(json ["end"]));
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/Range.html b/docs/data/Range/Range.html new file mode 100644 index 000000000..51e7b393e --- /dev/null +++ b/docs/data/Range/Range.html @@ -0,0 +1,146 @@ + + + + + + + + Range constructor - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Range
+ +
+ +
+ + + + +
+
+ +

Range constructor + Null safety +

+ +
const + Range(
  1. Time start,
  2. +
  3. Time end
  4. +
) +
+ + +
+

Provides a const constructor.

+
+ + + +
+

Implementation

+
const Range (this.start, this.end);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/Range.nums.html b/docs/data/Range/Range.nums.html new file mode 100644 index 000000000..144b18869 --- /dev/null +++ b/docs/data/Range/Range.nums.html @@ -0,0 +1,155 @@ + + + + + + + + Range.nums constructor - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Range.nums
+ +
+ +
+ + + + +
+
+ +

Range.nums constructor + Null safety +

+ +
+ Range.nums(
  1. int startHour,
  2. +
  3. int startMinute,
  4. +
  5. int endHour,
  6. +
  7. int endMinute
  8. +
) +
+ + +
+

Convenience method for manually creating a range by hand.

+
+ + + +
+

Implementation

+
Range.nums (
+	int startHour,
+	int startMinute,
+	int endHour,
+	int endMinute
+) :
+	start = Time (startHour, startMinute),
+	end = Time (endHour, endMinute);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/contains.html b/docs/data/Range/contains.html new file mode 100644 index 000000000..f4ede8537 --- /dev/null +++ b/docs/data/Range/contains.html @@ -0,0 +1,150 @@ + + + + + + + + contains method - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
contains
+ +
+ +
+ + + + +
+
+ +

contains method + Null safety +

+ +
+ + +bool +contains(
  1. Time other
  2. +
) + + + +
+ +
+

Returns whether other is in this range.

+
+ + + +
+

Implementation

+
bool contains (Time other) => start <= other && other <= end;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/end.html b/docs/data/Range/end.html new file mode 100644 index 000000000..3ecf47816 --- /dev/null +++ b/docs/data/Range/end.html @@ -0,0 +1,147 @@ + + + + + + + + end property - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
end
+ +
+ +
+ + + + +
+
+ +

end property + Null safety +

+ +
+ Time + end +
final
+ +
+ +
+

When this range ends.

+
+ + +
+

Implementation

+
final Time end;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/hashCode.html b/docs/data/Range/hashCode.html new file mode 100644 index 000000000..b2d5ae385 --- /dev/null +++ b/docs/data/Range/hashCode.html @@ -0,0 +1,177 @@ + + + + + + + + hashCode property - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+ +

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode + + +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
@override int get hashCode => toString().hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/noSuchMethod.html b/docs/data/Range/noSuchMethod.html new file mode 100644 index 000000000..4dcf35b77 --- /dev/null +++ b/docs/data/Range/noSuchMethod.html @@ -0,0 +1,184 @@ + + + + + + + + noSuchMethod method - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/operator_equals.html b/docs/data/Range/operator_equals.html new file mode 100644 index 000000000..fa87cb67c --- /dev/null +++ b/docs/data/Range/operator_equals.html @@ -0,0 +1,182 @@ + + + + + + + + operator == method - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+ +

operator == method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +bool +operator ==(
  1. dynamic other
  2. +
) + + + +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
@override bool operator == (dynamic other) => other is Range &&
+	other.start == start && other.end == end;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/operator_greater.html b/docs/data/Range/operator_greater.html new file mode 100644 index 000000000..d4a07bba3 --- /dev/null +++ b/docs/data/Range/operator_greater.html @@ -0,0 +1,154 @@ + + + + + + + + operator > method - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator >
+ +
+ +
+ + + + +
+
+ +

operator > method + Null safety +

+ +
+ + +bool +operator >(
  1. Time other
  2. +
) + + + +
+ +
+

Returns whether this range is after another range.

+
+ + + +
+

Implementation

+
bool operator > (Time other) => start.hour > other.hour ||
+(
+	start.hour == other.hour &&
+	start.minutes > other.minutes
+);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/operator_less.html b/docs/data/Range/operator_less.html new file mode 100644 index 000000000..feec02e95 --- /dev/null +++ b/docs/data/Range/operator_less.html @@ -0,0 +1,154 @@ + + + + + + + + operator < method - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator <
+ +
+ +
+ + + + +
+
+ +

operator < method + Null safety +

+ +
+ + +bool +operator <(
  1. Time other
  2. +
) + + + +
+ +
+

Returns whether this range is before another range.

+
+ + + +
+

Implementation

+
bool operator < (Time other) => end.hour < other.hour ||
+(
+	end.hour == other.hour &&
+	end.minutes < other.minutes
+);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/runtimeType.html b/docs/data/Range/runtimeType.html new file mode 100644 index 000000000..cd7ba7162 --- /dev/null +++ b/docs/data/Range/runtimeType.html @@ -0,0 +1,151 @@ + + + + + + + + runtimeType property - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/start.html b/docs/data/Range/start.html new file mode 100644 index 000000000..79a057466 --- /dev/null +++ b/docs/data/Range/start.html @@ -0,0 +1,147 @@ + + + + + + + + start property - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
start
+ +
+ +
+ + + + +
+
+ +

start property + Null safety +

+ +
+ Time + start +
final
+ +
+ +
+

When this range starts.

+
+ + +
+

Implementation

+
final Time start;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/toJson.html b/docs/data/Range/toJson.html new file mode 100644 index 000000000..4ef4afd67 --- /dev/null +++ b/docs/data/Range/toJson.html @@ -0,0 +1,152 @@ + + + + + + + + toJson method - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ +
+

Returns a JSON representation of this range.

+
+ + + +
+

Implementation

+
Map toJson() => {
+	"start": start.toJson(),
+	"end": end.toJson(),
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Range/toString.html b/docs/data/Range/toString.html new file mode 100644 index 000000000..c06ed9de4 --- /dev/null +++ b/docs/data/Range/toString.html @@ -0,0 +1,163 @@ + + + + + + + + toString method - Range class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
@override String toString() => "$start-$end";
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder-class.html b/docs/data/Reminder-class.html new file mode 100644 index 000000000..0005de306 --- /dev/null +++ b/docs/data/Reminder-class.html @@ -0,0 +1,376 @@ + + + + + + + + Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Reminder
+ +
+ +
+ + + + +
+
+ +

Reminder class + Null safety + +

+ + +
+

A user-generated reminder.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ Reminder({required String message, required ReminderTime time}) +
+
+ Creates a new reminder. +
const
+
+
+ Reminder.fromJson(dynamic json) +
+
+ Creates a new Reminder from a JSON object. [...] +
+
+
+ +
+

Properties

+ +
+
+ hash + → String + +
+
+ +
read-only
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ message + → String + +
+
+ The message this reminder should show. +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ time + ReminderTime + +
+
+ The ReminderTime for this reminder. +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ Returns a JSON representation of this reminder. + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + +
+

Static Methods

+
+
+ fromList(List reminders) + → List<Reminder> + + + +
+
+ Returns a list of reminders from a list of JSON objects. [...] + + +
+ +
+ getReminders({required List<Reminder> reminders, required String? dayName, required String? period, required String? subject}) + → List<int> + + + +
+
+ Returns all reminders from a list of reminders that should be shown. [...] + + +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/Reminder.fromJson.html b/docs/data/Reminder/Reminder.fromJson.html new file mode 100644 index 000000000..086bc3c71 --- /dev/null +++ b/docs/data/Reminder/Reminder.fromJson.html @@ -0,0 +1,149 @@ + + + + + + + + Reminder.fromJson constructor - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Reminder.fromJson
+ +
+ +
+ + + + +
+
+ +

Reminder.fromJson constructor + Null safety +

+ +
+ Reminder.fromJson(
  1. dynamic json
  2. +
) +
+ + +
+

Creates a new Reminder from a JSON object.

+

Uses json ["message"] for the message and passes json["time"] +to ReminderTime.fromJson

+
+ + + +
+

Implementation

+
Reminder.fromJson(dynamic json) :
+	message = json ["message"],
+	time = ReminderTime.fromJson(Map.from(json ["time"]));
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/Reminder.html b/docs/data/Reminder/Reminder.html new file mode 100644 index 000000000..047f4462e --- /dev/null +++ b/docs/data/Reminder/Reminder.html @@ -0,0 +1,149 @@ + + + + + + + + Reminder constructor - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Reminder
+ +
+ +
+ + + + +
+
+ +

Reminder constructor + Null safety +

+ +
const + Reminder(
  1. {required String message,
  2. +
  3. required ReminderTime time}
  4. +
) +
+ + +
+

Creates a new reminder.

+
+ + + +
+

Implementation

+
const Reminder({
+	required this.message,
+	required this.time,
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/fromList.html b/docs/data/Reminder/fromList.html new file mode 100644 index 000000000..33b3156f6 --- /dev/null +++ b/docs/data/Reminder/fromList.html @@ -0,0 +1,154 @@ + + + + + + + + fromList method - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
fromList
+ +
+ +
+ + + + +
+
+ +

fromList method + Null safety +

+ +
+ + +List<Reminder> +fromList(
  1. List reminders
  2. +
) + + + +
+ +
+

Returns a list of reminders from a list of JSON objects.

+

Calls Reminder.fromJson for every JSON object in the list.

+
+ + + +
+

Implementation

+
static List<Reminder> fromList(List reminders) => [
+	for (final dynamic json in reminders)
+		Reminder.fromJson(Map.from(json))
+];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/getReminders.html b/docs/data/Reminder/getReminders.html new file mode 100644 index 000000000..2a8cd383b --- /dev/null +++ b/docs/data/Reminder/getReminders.html @@ -0,0 +1,167 @@ + + + + + + + + getReminders method - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getReminders
+ +
+ +
+ + + + +
+
+ +

getReminders method + Null safety +

+ +
+ + +List<int> +getReminders(
  1. {required List<Reminder> reminders,
  2. +
  3. required String? dayName,
  4. +
  5. required String? period,
  6. +
  7. required String? subject}
  8. +
) + + + +
+ +
+

Returns all reminders from a list of reminders that should be shown.

+

All possible parameters are required. +This function delegates logic to ReminderTime.doesApply

+
+ + + +
+

Implementation

+
static List<int> getReminders({
+	required List<Reminder> reminders,
+	required String? dayName,
+	required String? period,
+	required String? subject,
+}) => [
+	for (int index = 0; index < reminders.length; index++)
+		if (reminders [index].time.doesApply(
+			dayName: dayName,
+			period: period,
+			subject: subject
+		)) index
+];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/hash.html b/docs/data/Reminder/hash.html new file mode 100644 index 000000000..957b39a61 --- /dev/null +++ b/docs/data/Reminder/hash.html @@ -0,0 +1,149 @@ + + + + + + + + hash property - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hash
+ +
+ +
+ + + + +
+
+ +

hash property + Null safety +

+ + + +
+ +
+ String + hash + + +
+ + + + +
+

Implementation

+
String get hash => "$message-${time.hash}";
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/hashCode.html b/docs/data/Reminder/hashCode.html new file mode 100644 index 000000000..6990b3aae --- /dev/null +++ b/docs/data/Reminder/hashCode.html @@ -0,0 +1,176 @@ + + + + + + + + hashCode property - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/message.html b/docs/data/Reminder/message.html new file mode 100644 index 000000000..7c6276091 --- /dev/null +++ b/docs/data/Reminder/message.html @@ -0,0 +1,147 @@ + + + + + + + + message property - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
message
+ +
+ +
+ + + + +
+
+ +

message property + Null safety +

+ +
+ String + message +
final
+ +
+ +
+

The message this reminder should show.

+
+ + +
+

Implementation

+
final String message;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/noSuchMethod.html b/docs/data/Reminder/noSuchMethod.html new file mode 100644 index 000000000..c5d8731c2 --- /dev/null +++ b/docs/data/Reminder/noSuchMethod.html @@ -0,0 +1,184 @@ + + + + + + + + noSuchMethod method - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/operator_equals.html b/docs/data/Reminder/operator_equals.html new file mode 100644 index 000000000..1beb53ba5 --- /dev/null +++ b/docs/data/Reminder/operator_equals.html @@ -0,0 +1,175 @@ + + + + + + + + operator == method - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/runtimeType.html b/docs/data/Reminder/runtimeType.html new file mode 100644 index 000000000..6361ac07e --- /dev/null +++ b/docs/data/Reminder/runtimeType.html @@ -0,0 +1,151 @@ + + + + + + + + runtimeType property - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/time.html b/docs/data/Reminder/time.html new file mode 100644 index 000000000..d8c431e5f --- /dev/null +++ b/docs/data/Reminder/time.html @@ -0,0 +1,147 @@ + + + + + + + + time property - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
time
+ +
+ +
+ + + + +
+
+ +

time property + Null safety +

+ +
+ ReminderTime + time +
final
+ +
+ +
+

The ReminderTime for this reminder.

+
+ + +
+

Implementation

+
final ReminderTime time;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/toJson.html b/docs/data/Reminder/toJson.html new file mode 100644 index 000000000..45af9add0 --- /dev/null +++ b/docs/data/Reminder/toJson.html @@ -0,0 +1,153 @@ + + + + + + + + toJson method - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ +
+

Returns a JSON representation of this reminder.

+
+ + + +
+

Implementation

+
Map toJson() => {
+	"message": message,
+	"time": time.toJson(),
+	"hash": hash,
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Reminder/toString.html b/docs/data/Reminder/toString.html new file mode 100644 index 000000000..4512e02f0 --- /dev/null +++ b/docs/data/Reminder/toString.html @@ -0,0 +1,163 @@ + + + + + + + + toString method - Reminder class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
@override String toString() => "$message ($time)";
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime-class.html b/docs/data/ReminderTime-class.html new file mode 100644 index 000000000..2c1bd4223 --- /dev/null +++ b/docs/data/ReminderTime-class.html @@ -0,0 +1,370 @@ + + + + + + + + ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ReminderTime
+ +
+ +
+ + + + +
+
+ +

ReminderTime class + Null safety + +

+ + +
+

A time that a reminder should show.

+
+ + +
+
+ + + +
Implementers
+
+ + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ ReminderTime({required bool repeats, required ReminderTimeType type}) +
+
+ Allows its subclasses to be const. +
const
+
+
+ ReminderTime.fromJson(Map json) +
+
+ Initializes a new instance from JSON. [...] +
factory
+
+
+ ReminderTime.fromType({required ReminderTimeType type, required String? dayName, required String? period, required String? name, required bool repeats}) +
+
+ Instantiates new ReminderTime with all possible parameters. [...] +
factory
+
+
+
+ +
+

Properties

+ +
+
+ hash + → String + +
+
+ +
read-only
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ repeats + → bool + +
+
+ Whether the reminder should repeat. +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ type + ReminderTimeType + +
+
+ The type of reminder. [...] +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ doesApply({required String? dayName, required String? subject, required String? period}) + → bool + + + +
+
+ Checks if the reminder should be displayed. [...] + + +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ Returns this ReminderTime as JSON. + + +
+ +
+ toString() + → String + + + +
+
+ Returns a String representation of this ReminderTime. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/ReminderTime.fromJson.html b/docs/data/ReminderTime/ReminderTime.fromJson.html new file mode 100644 index 000000000..09fb35399 --- /dev/null +++ b/docs/data/ReminderTime/ReminderTime.fromJson.html @@ -0,0 +1,164 @@ + + + + + + + + ReminderTime.fromJson constructor - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ReminderTime.fromJson
+ +
+ +
+ + + + +
+
+ +

ReminderTime.fromJson constructor + Null safety +

+ +
+ ReminderTime.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Initializes a new instance from JSON.

+

Mainly looks at json ["type"] to choose which type of +ReminderTime it should instantiate, and then leaves the +work to that subclass' .fromJson method.

+

Example JSON:

+
{
+	"type": "period",
+	"repeats": false,
+	"period": "9",
+	"name": "Monday",
+}
+
+
+ + + +
+

Implementation

+
factory ReminderTime.fromJson(Map json) {
+	switch (stringToReminderTime [json ["type"]]) {
+		case ReminderTimeType.period: return PeriodReminderTime.fromJson(json);
+		case ReminderTimeType.subject: return SubjectReminderTime.fromJson(json);
+		default: throw JsonUnsupportedObjectError(
+			json,
+			cause: "Invalid time for reminder: $json"
+		);
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/ReminderTime.fromType.html b/docs/data/ReminderTime/ReminderTime.fromType.html new file mode 100644 index 000000000..25e8e6083 --- /dev/null +++ b/docs/data/ReminderTime/ReminderTime.fromType.html @@ -0,0 +1,167 @@ + + + + + + + + ReminderTime.fromType constructor - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ReminderTime.fromType
+ +
+ +
+ + + + +
+
+ +

ReminderTime.fromType constructor + Null safety +

+ +
+ ReminderTime.fromType(
  1. {required ReminderTimeType type,
  2. +
  3. required String? dayName,
  4. +
  5. required String? period,
  6. +
  7. required String? name,
  8. +
  9. required bool repeats}
  10. +
) +
+ + +
+

Instantiates new ReminderTime with all possible parameters.

+

Used for cases where the caller doesn't care about the ReminderTimeType, +such as a UI reminder builder.

+
+ + + +
+

Implementation

+
factory ReminderTime.fromType({
+	required ReminderTimeType type,
+	required String? dayName,
+	required String? period,
+	required String? name,
+	required bool repeats,
+}) {
+	switch (type) {
+		case ReminderTimeType.period: return PeriodReminderTime(
+			period: period!,
+			dayName: dayName!,
+			repeats: repeats,
+		); case ReminderTimeType.subject: return SubjectReminderTime(
+			name: name!,
+			repeats: repeats,
+		); default: throw ArgumentError.notNull("type");
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/ReminderTime.html b/docs/data/ReminderTime/ReminderTime.html new file mode 100644 index 000000000..aa8ca4e8c --- /dev/null +++ b/docs/data/ReminderTime/ReminderTime.html @@ -0,0 +1,148 @@ + + + + + + + + ReminderTime constructor - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ReminderTime
+ +
+ +
+ + + + +
+
+ +

ReminderTime constructor + Null safety +

+ +
const + ReminderTime(
  1. {required bool repeats,
  2. +
  3. required ReminderTimeType type}
  4. +
) +
+ + +
+

Allows its subclasses to be const.

+
+ + + +
+

Implementation

+
const ReminderTime({
+	required this.repeats,
+	required this.type
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/doesApply.html b/docs/data/ReminderTime/doesApply.html new file mode 100644 index 000000000..9a0f1c3de --- /dev/null +++ b/docs/data/ReminderTime/doesApply.html @@ -0,0 +1,156 @@ + + + + + + + + doesApply method - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
doesApply
+ +
+ +
+ + + + +
+
+ +

doesApply method + Null safety +

+ +
+ + +bool +doesApply(
  1. {required String? dayName,
  2. +
  3. required String? subject,
  4. +
  5. required String? period}
  6. +
) + + + +
+ +
+

Checks if the reminder should be displayed.

+

All possible parameters are required.

+
+ + + +
+

Implementation

+
bool doesApply({
+	required String? dayName,
+	required String? subject,
+	required String? period,
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/hash.html b/docs/data/ReminderTime/hash.html new file mode 100644 index 000000000..70af70668 --- /dev/null +++ b/docs/data/ReminderTime/hash.html @@ -0,0 +1,148 @@ + + + + + + + + hash property - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hash
+ +
+ +
+ + + + +
+
+ +

hash property + Null safety +

+ + + +
+ +
+ String + hash + + +
+ + + + +
+

Implementation

+
String get hash;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/hashCode.html b/docs/data/ReminderTime/hashCode.html new file mode 100644 index 000000000..7a2c36d1d --- /dev/null +++ b/docs/data/ReminderTime/hashCode.html @@ -0,0 +1,175 @@ + + + + + + + + hashCode property - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/noSuchMethod.html b/docs/data/ReminderTime/noSuchMethod.html new file mode 100644 index 000000000..e91538e1a --- /dev/null +++ b/docs/data/ReminderTime/noSuchMethod.html @@ -0,0 +1,183 @@ + + + + + + + + noSuchMethod method - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/operator_equals.html b/docs/data/ReminderTime/operator_equals.html new file mode 100644 index 000000000..d84a24d70 --- /dev/null +++ b/docs/data/ReminderTime/operator_equals.html @@ -0,0 +1,174 @@ + + + + + + + + operator == method - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/repeats.html b/docs/data/ReminderTime/repeats.html new file mode 100644 index 000000000..fb5a3458c --- /dev/null +++ b/docs/data/ReminderTime/repeats.html @@ -0,0 +1,146 @@ + + + + + + + + repeats property - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
repeats
+ +
+ +
+ + + + +
+
+ +

repeats property + Null safety +

+ +
+ bool + repeats +
final
+ +
+ +
+

Whether the reminder should repeat.

+
+ + +
+

Implementation

+
final bool repeats;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/runtimeType.html b/docs/data/ReminderTime/runtimeType.html new file mode 100644 index 000000000..6b8bef0f9 --- /dev/null +++ b/docs/data/ReminderTime/runtimeType.html @@ -0,0 +1,150 @@ + + + + + + + + runtimeType property - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/toJson.html b/docs/data/ReminderTime/toJson.html new file mode 100644 index 000000000..3b90a92fe --- /dev/null +++ b/docs/data/ReminderTime/toJson.html @@ -0,0 +1,148 @@ + + + + + + + + toJson method - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ +
+

Returns this ReminderTime as JSON.

+
+ + + +
+

Implementation

+
Map toJson();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/toString.html b/docs/data/ReminderTime/toString.html new file mode 100644 index 000000000..eb2555f39 --- /dev/null +++ b/docs/data/ReminderTime/toString.html @@ -0,0 +1,155 @@ + + + + + + + + toString method - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

Returns a String representation of this ReminderTime.

+

Used for debugging and throughout the UI.

+
+ + + +
+

Implementation

+
@override
+String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTime/type.html b/docs/data/ReminderTime/type.html new file mode 100644 index 000000000..afa56cf5c --- /dev/null +++ b/docs/data/ReminderTime/type.html @@ -0,0 +1,147 @@ + + + + + + + + type property - ReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
type
+ +
+ +
+ + + + +
+
+ +

type property + Null safety +

+ +
+ ReminderTimeType + type +
final
+ +
+ +
+

The type of reminder.

+

This field is here for other objects to use.

+
+ + +
+

Implementation

+
final ReminderTimeType type;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTimeType-class.html b/docs/data/ReminderTimeType-class.html new file mode 100644 index 000000000..da2fc1455 --- /dev/null +++ b/docs/data/ReminderTimeType-class.html @@ -0,0 +1,323 @@ + + + + + + + + ReminderTimeType enum - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ReminderTimeType
+ +
+ +
+ + + + +
+
+ +

ReminderTimeType enum + Null safety + +

+ + +
+

An enum to decide when the reminder should appear.

+

period means the reminder needs a Day name and a period (as String) +subject means the reminder needs a name of a class.

+
+ + + +
+

Constants

+ +
+
+ period + → const ReminderTimeType + + +
+
+

Whether the reminder should be displayed on a specific period.

+ + +
+ const ReminderTimeType(0) +
+
+ +
+ subject + → const ReminderTimeType + + +
+
+

Whether the reminder should be displayed on a specific subject.

+ + +
+ const ReminderTimeType(1) +
+
+ +
+ values + → const List<ReminderTimeType> + + +
+
+

A constant List of the values in this enum, in order of their declaration.

+ + +
+ const List<ReminderTimeType> +
+
+ +
+
+ + +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ index + → int + +
+
+

The integer index of this enum.

+
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTimeType/hashCode.html b/docs/data/ReminderTimeType/hashCode.html new file mode 100644 index 000000000..7056f9d72 --- /dev/null +++ b/docs/data/ReminderTimeType/hashCode.html @@ -0,0 +1,169 @@ + + + + + + + + hashCode property - ReminderTimeType extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTimeType/noSuchMethod.html b/docs/data/ReminderTimeType/noSuchMethod.html new file mode 100644 index 000000000..3fb2b41f0 --- /dev/null +++ b/docs/data/ReminderTimeType/noSuchMethod.html @@ -0,0 +1,177 @@ + + + + + + + + noSuchMethod method - ReminderTimeType extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTimeType/operator_equals.html b/docs/data/ReminderTimeType/operator_equals.html new file mode 100644 index 000000000..29d26619b --- /dev/null +++ b/docs/data/ReminderTimeType/operator_equals.html @@ -0,0 +1,168 @@ + + + + + + + + operator == method - ReminderTimeType extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTimeType/runtimeType.html b/docs/data/ReminderTimeType/runtimeType.html new file mode 100644 index 000000000..6d138e4de --- /dev/null +++ b/docs/data/ReminderTimeType/runtimeType.html @@ -0,0 +1,144 @@ + + + + + + + + runtimeType property - ReminderTimeType extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/ReminderTimeType/toString.html b/docs/data/ReminderTimeType/toString.html new file mode 100644 index 000000000..96b02b2d9 --- /dev/null +++ b/docs/data/ReminderTimeType/toString.html @@ -0,0 +1,147 @@ + + + + + + + + toString method - ReminderTimeType extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ + +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule-class.html b/docs/data/Schedule-class.html new file mode 100644 index 000000000..be4d346db --- /dev/null +++ b/docs/data/Schedule-class.html @@ -0,0 +1,539 @@ + + + + + + + + Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Schedule
+ +
+ +
+ + + + +
+
+ +

Schedule class + Null safety + +

+ + +
+

A description of the time allotment for a day.

+

Some days require different time periods, or even periods that +are skipped altogether, as well as homeroom and Mincha movements. +This class helps facilitate that.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ Schedule({required String name, required List<Period> periods}) +
+
+ A const constructor. +
const
+
+
+ Schedule.fromJson(Map json) +
+
+ Returns a new Schedule from a JSON value. [...] +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only
+ +
+ +
+ name + → String + +
+
+ The name of this schedule. +
final
+ +
+ +
+ periods + → List<Period> + +
+
+ The time allotments for the periods. +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ Returns a JSON representation of this schedule. + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(dynamic other) + → bool + + + +
+
+ The equality operator. [...] + + +
+ +
+
+ +
+

Static Properties

+ +
+
+ schedules + ↔ List<Schedule> + +
+
+ The list of schedules defined in the calendar. [...] +
read / write
+ +
+ +
+
+ +
+

Static Methods

+
+
+ getWinterFriday([DateTime? today]) + Schedule + + + +
+
+ Determines whether to use a Winter Friday or regular Friday schedule. [...] + + +
+ +
+
+ +
+

Constants

+ +
+
+ amAssembly + → const Schedule + + +
+
+ The schedule for when there is an assembly during Homeroom. + + +
+ Schedule(name: "AM Assembly", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 50))), Period.raw(name: "2", time: Range(Time(8, 55), Time(9, 30))), Period.… +
+
+ +
+ covid + → const Schedule + + +
+
+ The shorter schedule for the COVID-19 pandemic. + + +
+ Schedule(name: "COVID-19", periods: [Period.raw(name: "1", time: Range(Time(8, 30), Time(9, 15))), Period.raw(name: "Tefilla", time: Range(Time(9, 20), Time(9, 55))), Per… +
+
+ +
+ early + → const Schedule + + +
+
+ The schedule for an early dismissal. + + +
+ Schedule(name: "Early Dismissal", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 45))), Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 25))), Per… +
+
+ +
+ fastDay + → const Schedule + + +
+
+ The schedule for fast days. + + +
+ Schedule(name: "Tzom", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 55))), Period.raw(name: "2", time: Range(Time(9, 0), Time(9, 35))), Period.raw(name… +
+
+ +
+ friday + → const Schedule + + +
+
+ The schedule for Fridays. + + +
+ Schedule(name: "Friday", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 45))), Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 30))), Period.raw(n… +
+
+ +
+ fridayRoshChodesh + → const Schedule + + +
+
+ The schedule for when Rosh Chodesh falls on a Friday. + + +
+ Schedule(name: "Friday Rosh Chodesh", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(9, 5))), Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 45))), … +
+
+ +
+ pmAssembly + → const Schedule + + +
+
+ The schedule for when there is an assembly during Mincha. + + +
+ Schedule(name: "PM Assembly", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 50))), Period.raw(name: "2", time: Range(Time(8, 55), Time(9, 30))), Period.… +
+
+ +
+ roshChodesh + → const Schedule + + +
+
+ The schedule for Rosh Chodesh. + + +
+ Schedule(name: "Rosh Chodesh", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(9, 5))), Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 50))), Period.… +
+
+ +
+ winterFriday + → const Schedule + + +
+
+ The schedule for a winter Friday. See Schedule.getWinterFriday. + + +
+ Schedule(name: "Winter Friday", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 45))), Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 25))), Perio… +
+
+ +
+ winterFridayRoshChodesh + → const Schedule + + +
+
+ The schedule for when a Rosh Chodesh falls on a Winter Friday. + + +
+ Schedule(name: "Winter Friday Rosh Chodesh", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(9, 5))), Period.raw(name: "2", time: Range(Time(9, 10), Time(9, … +
+
+ +
+
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/Schedule.fromJson.html b/docs/data/Schedule/Schedule.fromJson.html new file mode 100644 index 000000000..3fecf452c --- /dev/null +++ b/docs/data/Schedule/Schedule.fromJson.html @@ -0,0 +1,166 @@ + + + + + + + + Schedule.fromJson constructor - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Schedule.fromJson
+ +
+ +
+ + + + +
+
+ +

Schedule.fromJson constructor + Null safety +

+ +
+ Schedule.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Returns a new Schedule from a JSON value.

+

The JSON must have:

+
    +
  • a "name" field, which should be a string. See name.
  • +
  • a "periods" field, which should be a list of Period JSON objects.
  • +
+
+ + + +
+

Implementation

+
Schedule.fromJson(Map json) :
+	name = json ["name"],  // name
+	periods = [  // list of periods
+		for (final dynamic jsonElement in json ["periods"])
+			Period.fromJson(jsonElement)
+	];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/Schedule.html b/docs/data/Schedule/Schedule.html new file mode 100644 index 000000000..378d0cf72 --- /dev/null +++ b/docs/data/Schedule/Schedule.html @@ -0,0 +1,160 @@ + + + + + + + + Schedule constructor - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Schedule
+ +
+ +
+ + + + +
+
+ +

Schedule constructor + Null safety +

+ +
const + Schedule(
  1. {required String name,
  2. +
  3. required List<Period> periods}
  4. +
) +
+ + +
+

A const constructor.

+
+ + + +
+

Implementation

+
const Schedule({
+	required this.name,
+	required this.periods,
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/amAssembly-constant.html b/docs/data/Schedule/amAssembly-constant.html new file mode 100644 index 000000000..5f8e10fbb --- /dev/null +++ b/docs/data/Schedule/amAssembly-constant.html @@ -0,0 +1,175 @@ + + + + + + + + amAssembly constant - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
amAssembly
+ +
+ +
+ + + + +
+
+ +

amAssembly constant + Null safety +

+ +
+ Schedule + const amAssembly + + +
+ +
+

The schedule for when there is an assembly during Homeroom.

+
+ + +
+

Implementation

+
static const Schedule amAssembly = Schedule(
+	name: "AM Assembly",
+	periods: [
+		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 50))),
+		Period.raw(name: "2", time: Range(Time(8, 55), Time(9, 30))),
+		Period.raw(name: "3", time: Range(Time(9, 35), Time(10, 10))),
+		Period.raw(name: "Homeroom", time: Range(Time(10, 10), Time(11, 10))),
+		Period.raw(name: "4", time: Range(Time(11, 10), Time(11, 45))),
+		Period.raw(name: "5", time: Range(Time(11, 50), Time(12, 25))),
+		Period.raw(name: "6", time: Range(Time(12, 30), Time(13, 05))),
+		Period.raw(name: "7", time: Range(Time(13, 10), Time(13, 45))),
+		Period.raw(name: "8", time: Range(Time(13, 50), Time(14, 25))),
+		Period.raw(name: "9", time: Range(Time(14, 30), Time(15, 05))),
+		Period.raw(name: "Mincha", time: Range(Time(15, 05), Time(15, 25))),
+		Period.raw(name: "10", time: Range(Time(15, 25), Time(16, 00))),
+		Period.raw(name: "11", time: Range(Time(16, 05), Time(16, 45))),
+	],
+);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/covid-constant.html b/docs/data/Schedule/covid-constant.html new file mode 100644 index 000000000..3bb07adab --- /dev/null +++ b/docs/data/Schedule/covid-constant.html @@ -0,0 +1,172 @@ + + + + + + + + covid constant - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
covid
+ +
+ +
+ + + + +
+
+ +

covid constant + Null safety +

+ +
+ Schedule + const covid + + +
+ +
+

The shorter schedule for the COVID-19 pandemic.

+
+ + +
+

Implementation

+
static const Schedule covid = Schedule(
+	name: "COVID-19",
+	periods: [
+		Period.raw(name: "1", time: Range(Time(8, 30), Time(9, 15))),
+		Period.raw(name: "Tefilla", time: Range(Time(9, 20), Time(9, 55))),
+		Period.raw(name: "2", time: Range(Time(10, 00), Time(10, 45))),
+		Period.raw(name: "3", time: Range(Time(10, 55), Time(11, 40))),
+		Period.raw(name: "4", time: Range(Time(11, 50), Time(12, 35))),
+		Period.raw(name: "Lunch", time: Range(Time(12, 35), Time(13, 05))),
+		Period.raw(name: "5", time: Range(Time(13, 15), Time(14, 00))),
+		Period.raw(name: "Mincha", time: Range(Time(14, 00), Time(14, 10))),
+		Period.raw(name: "6", time: Range(Time(14, 20), Time(15, 05))),
+		Period.raw(name: "7", time: Range(Time(15, 15), Time(16, 00))),
+	],
+);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/early-constant.html b/docs/data/Schedule/early-constant.html new file mode 100644 index 000000000..f37aa6078 --- /dev/null +++ b/docs/data/Schedule/early-constant.html @@ -0,0 +1,175 @@ + + + + + + + + early constant - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
early
+ +
+ +
+ + + + +
+
+ +

early constant + Null safety +

+ +
+ Schedule + const early + + +
+ +
+

The schedule for an early dismissal.

+
+ + +
+

Implementation

+
static const Schedule early = Schedule(
+	name: "Early Dismissal",
+	periods: [
+		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 45))),
+		Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 25))),
+		Period.raw(name: "3", time: Range(Time(9, 30), Time(10, 05))),
+		Period.raw(name: "Homeroom", time: Range(Time(10, 05), Time(10, 20))),
+		Period.raw(name: "4", time: Range(Time(10, 20), Time(10, 55))),
+		Period.raw(name: "5", time: Range(Time(11, 00), Time(11, 35))),
+		Period.raw(name: "6", time: Range(Time(11, 40), Time(12, 15))),
+		Period.raw(name: "7", time: Range(Time(12, 20), Time(12, 55))),
+		Period.raw(name: "8", time: Range(Time(13, 00), Time(13, 35))),
+		Period.raw(name: "9", time: Range(Time(13, 40), Time(14, 15))),
+		Period.raw(name: "Mincha", time: Range(Time(14, 15), Time(14, 35))),
+		Period.raw(name: "10", time: Range(Time(14, 35), Time(15, 10))),
+		Period.raw(name: "11", time: Range(Time(15, 15), Time(15, 50))),
+	],
+);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/fastDay-constant.html b/docs/data/Schedule/fastDay-constant.html new file mode 100644 index 000000000..0ea80bb71 --- /dev/null +++ b/docs/data/Schedule/fastDay-constant.html @@ -0,0 +1,171 @@ + + + + + + + + fastDay constant - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
fastDay
+ +
+ +
+ + + + +
+
+ +

fastDay constant + Null safety +

+ +
+ Schedule + const fastDay + + +
+ +
+

The schedule for fast days.

+
+ + +
+

Implementation

+
static const Schedule fastDay = Schedule(
+	name: "Tzom",
+	periods: [
+		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 55))),
+		Period.raw(name: "2", time: Range(Time(9, 00), Time(9, 35))),
+		Period.raw(name: "3", time: Range(Time(9, 40), Time(10, 15))),
+		Period.raw(name: "4", time: Range(Time(10, 20), Time(10, 55))),
+		Period.raw(name: "5", time: Range(Time(11, 00), Time(11, 35))),
+		Period.raw(name: "9", time: Range(Time(11, 40), Time(12, 15))),
+		Period.raw(name: "10", time: Range(Time(12, 20), Time(12, 55))),
+		Period.raw(name: "11", time: Range(Time(13, 00), Time(13, 35))),
+		Period.raw(name: "Mincha", time: Range(Time(13, 35), Time(14, 05))),
+	],
+);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/friday-constant.html b/docs/data/Schedule/friday-constant.html new file mode 100644 index 000000000..ac30689ed --- /dev/null +++ b/docs/data/Schedule/friday-constant.html @@ -0,0 +1,170 @@ + + + + + + + + friday constant - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
friday
+ +
+ +
+ + + + +
+
+ +

friday constant + Null safety +

+ +
+ Schedule + const friday + + +
+ +
+

The schedule for Fridays.

+
+ + +
+

Implementation

+
static const Schedule friday = Schedule(
+	name: "Friday",
+	periods: [
+		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 45))),
+		Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 30))),
+		Period.raw(name: "3", time: Range(Time(9, 35), Time(10, 15))),
+		Period.raw(name: "4", time: Range(Time(10, 20), Time(11, 00))),
+		Period.raw(name: "Homeroom", time: Range(Time(11, 00), Time(11, 20))),
+		Period.raw(name: "5", time: Range(Time(11, 20), Time(12, 00))),
+		Period.raw(name: "6", time: Range(Time(12, 05), Time(12, 45))),
+		Period.raw(name: "7", time: Range(Time(12, 50), Time(13, 30))),
+	],
+);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/fridayRoshChodesh-constant.html b/docs/data/Schedule/fridayRoshChodesh-constant.html new file mode 100644 index 000000000..c00508972 --- /dev/null +++ b/docs/data/Schedule/fridayRoshChodesh-constant.html @@ -0,0 +1,170 @@ + + + + + + + + fridayRoshChodesh constant - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
fridayRoshChodesh
+ +
+ +
+ + + + +
+
+ +

fridayRoshChodesh constant + Null safety +

+ +
+ Schedule + const fridayRoshChodesh + + +
+ +
+

The schedule for when Rosh Chodesh falls on a Friday.

+
+ + +
+

Implementation

+
static const Schedule fridayRoshChodesh = Schedule(
+	name: "Friday Rosh Chodesh",
+	periods: [
+		Period.raw(name: "1", time: Range(Time(8, 00), Time(9, 05))),
+		Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 45))),
+		Period.raw(name: "3", time: Range(Time(9, 50), Time(10, 25))),
+		Period.raw(name: "4", time: Range(Time(10, 30), Time(11, 05))),
+		Period.raw(name: "Homeroom", time: Range(Time(11, 05), Time(11, 25))),
+		Period.raw(name: "5", time: Range(Time(11, 25), Time(12, 00))),
+		Period.raw(name: "6", time: Range(Time(12, 05), Time(12, 40))),
+		Period.raw(name: "7", time: Range(Time(12, 45), Time(13, 20))),
+	],
+);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/getWinterFriday.html b/docs/data/Schedule/getWinterFriday.html new file mode 100644 index 000000000..f9735b8f9 --- /dev/null +++ b/docs/data/Schedule/getWinterFriday.html @@ -0,0 +1,184 @@ + + + + + + + + getWinterFriday method - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getWinterFriday
+ +
+ +
+ + + + +
+
+ +

getWinterFriday method + Null safety +

+ +
+ + +Schedule +getWinterFriday(
  1. [DateTime? today]
  2. +
) + + + +
+ +
+

Determines whether to use a Winter Friday or regular Friday schedule.

+

Winter Fridays mean shorter periods, with an ultimately shorter dismissal.

+
+ + + +
+

Implementation

+
static Schedule getWinterFriday([DateTime? today]) {
+	final DateTime date = today ?? DateTime.now();
+	final int month = date.month, day = date.day;
+	if (month >= Times.schoolStart && month < Times.winterFridayMonthStart) {
+		return friday;
+	} else if (
+		month > Times.winterFridayMonthStart ||
+		month < Times.winterFridayMonthEnd
+	) {
+		return winterFriday;
+	} else if (
+		month > Times.winterFridayMonthEnd &&
+		month <= Times.schoolEnd
+	) {
+		return friday;
+	} else if (month == Times.winterFridayMonthStart) {
+		return day < Times.winterFridayDayStart ? friday : winterFriday;
+	} else if (month == Times.winterFridayMonthEnd) {
+		return day < Times.winterFridayDayEnd ? winterFriday : friday;
+	} else {
+		return friday;
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/hashCode.html b/docs/data/Schedule/hashCode.html new file mode 100644 index 000000000..e0ea86496 --- /dev/null +++ b/docs/data/Schedule/hashCode.html @@ -0,0 +1,189 @@ + + + + + + + + hashCode property - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+ +

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode + + +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
@override
+int get hashCode => name.hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/name.html b/docs/data/Schedule/name.html new file mode 100644 index 000000000..f9465b0b6 --- /dev/null +++ b/docs/data/Schedule/name.html @@ -0,0 +1,158 @@ + + + + + + + + name property - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
name
+ +
+ +
+ + + + +
+
+ +

name property + Null safety +

+ +
+ String + name +
final
+ +
+ +
+

The name of this schedule.

+
+ + +
+

Implementation

+
final String name;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/noSuchMethod.html b/docs/data/Schedule/noSuchMethod.html new file mode 100644 index 000000000..9ef3fe7ba --- /dev/null +++ b/docs/data/Schedule/noSuchMethod.html @@ -0,0 +1,195 @@ + + + + + + + + noSuchMethod method - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/operator_equals.html b/docs/data/Schedule/operator_equals.html new file mode 100644 index 000000000..6e22e39fb --- /dev/null +++ b/docs/data/Schedule/operator_equals.html @@ -0,0 +1,194 @@ + + + + + + + + operator == method - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+ +

operator == method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +bool +operator ==(
  1. dynamic other
  2. +
) + + + +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
@override
+bool operator == (dynamic other) => other is Schedule &&
+	other.name == name;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/periods.html b/docs/data/Schedule/periods.html new file mode 100644 index 000000000..06d4df62b --- /dev/null +++ b/docs/data/Schedule/periods.html @@ -0,0 +1,158 @@ + + + + + + + + periods property - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
periods
+ +
+ +
+ + + + +
+
+ +

periods property + Null safety +

+ +
+ List<Period> + periods +
final
+ +
+ +
+

The time allotments for the periods.

+
+ + +
+

Implementation

+
final List<Period> periods;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/pmAssembly-constant.html b/docs/data/Schedule/pmAssembly-constant.html new file mode 100644 index 000000000..23a35edeb --- /dev/null +++ b/docs/data/Schedule/pmAssembly-constant.html @@ -0,0 +1,174 @@ + + + + + + + + pmAssembly constant - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
pmAssembly
+ +
+ +
+ + + + +
+
+ +

pmAssembly constant + Null safety +

+ +
+ Schedule + const pmAssembly + + +
+ +
+

The schedule for when there is an assembly during Mincha.

+
+ + +
+

Implementation

+
static const Schedule pmAssembly = Schedule(
+	name: "PM Assembly",
+	periods: [
+		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 50))),
+		Period.raw(name: "2", time: Range(Time(8, 55), Time(9, 30))),
+		Period.raw(name: "3", time: Range(Time(9, 35), Time(10, 10))),
+		Period.raw(name: "4", time: Range(Time(10, 15), Time(10, 50))),
+		Period.raw(name: "5", time: Range(Time(10, 55), Time(11, 30))),
+		Period.raw(name: "6", time: Range(Time(11, 35), Time(12, 10))),
+		Period.raw(name: "7", time: Range(Time(12, 15), Time(12, 50))),
+		Period.raw(name: "8", time: Range(Time(12, 55), Time(13, 30))),
+		Period.raw(name: "9", time: Range(Time(13, 35), Time(14, 10))),
+		Period.raw(name: "Mincha", time: Range(Time(14, 10), Time(15, 30))),
+		Period.raw(name: "10", time: Range(Time(15, 30), Time(16, 05))),
+		Period.raw(name: "11", time: Range(Time(16, 10), Time(16, 45))),
+	],
+);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/roshChodesh-constant.html b/docs/data/Schedule/roshChodesh-constant.html new file mode 100644 index 000000000..a101c5110 --- /dev/null +++ b/docs/data/Schedule/roshChodesh-constant.html @@ -0,0 +1,175 @@ + + + + + + + + roshChodesh constant - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
roshChodesh
+ +
+ +
+ + + + +
+
+ +

roshChodesh constant + Null safety +

+ +
+ Schedule + const roshChodesh + + +
+ +
+

The schedule for Rosh Chodesh.

+
+ + +
+

Implementation

+
static const Schedule roshChodesh = Schedule(
+	name: "Rosh Chodesh",
+	periods: [
+		Period.raw(name: "1", time: Range(Time(8, 00), Time(9, 05))),
+		Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 50))),
+		Period.raw(name: "3", time: Range(Time(9, 55), Time(10, 35))),
+		Period.raw(name: "Homeroom", time: Range(Time(10, 35), Time(10, 50))),
+		Period.raw(name: "4", time: Range(Time(10, 50), Time(11, 30))),
+		Period.raw(name: "5", time: Range(Time(11, 35), Time(12, 15))),
+		Period.raw(name: "6", time: Range(Time(12, 20), Time(12, 55))),
+		Period.raw(name: "7", time: Range(Time(13, 00), Time(13, 35))),
+		Period.raw(name: "8", time: Range(Time(13, 40), Time(14, 15))),
+		Period.raw(name: "9", time: Range(Time(14, 30), Time(15, 00))),
+		Period.raw(name: "Mincha", time: Range(Time(15, 00), Time(15, 20))),
+		Period.raw(name: "10", time: Range(Time(15, 20), Time(16, 00))),
+		Period.raw(name: "11", time: Range(Time(16, 05), Time(16, 45))),
+	],
+);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/runtimeType.html b/docs/data/Schedule/runtimeType.html new file mode 100644 index 000000000..586447f3f --- /dev/null +++ b/docs/data/Schedule/runtimeType.html @@ -0,0 +1,162 @@ + + + + + + + + runtimeType property - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/schedules.html b/docs/data/Schedule/schedules.html new file mode 100644 index 000000000..69a2df85b --- /dev/null +++ b/docs/data/Schedule/schedules.html @@ -0,0 +1,167 @@ + + + + + + + + schedules property - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schedules
+ +
+ +
+ + + + +
+
+ +

schedules property + Null safety +

+ +
+ List<Schedule> + schedules +
read / write
+ +
+ +
+

The list of schedules defined in the calendar.

+

This is a rare exception where the database and data layers intermingle. +Schedules are defined by their name, but their values exist elsewhere in +the database. So, the data layer needs some lookup method in order to be +useful. Specifically, Day.fromJson() needs to work somehow.

+

late means that this value is initialized after startup, but the value +cannot be used until it is. This means that we need to be careful not to +access this value until we can be sure that the database values were +synced. Dart will throw a runtime error otherwise, so it should be fairly +simple to catch problems during testing.

+
+ + +
+

Implementation

+
static late List<Schedule> schedules;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/toJson.html b/docs/data/Schedule/toJson.html new file mode 100644 index 000000000..853c02929 --- /dev/null +++ b/docs/data/Schedule/toJson.html @@ -0,0 +1,166 @@ + + + + + + + + toJson method - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ +
+

Returns a JSON representation of this schedule.

+
+ + + +
+

Implementation

+
Map toJson() => {
+	"name": name,
+	"periods": [
+		for (final Period period in periods)
+			period.toJson(),
+	],
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/toString.html b/docs/data/Schedule/toString.html new file mode 100644 index 000000000..719f7fb39 --- /dev/null +++ b/docs/data/Schedule/toString.html @@ -0,0 +1,175 @@ + + + + + + + + toString method - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
@override
+String toString() => name;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/winterFriday-constant.html b/docs/data/Schedule/winterFriday-constant.html new file mode 100644 index 000000000..afe44e17c --- /dev/null +++ b/docs/data/Schedule/winterFriday-constant.html @@ -0,0 +1,170 @@ + + + + + + + + winterFriday constant - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
winterFriday
+ +
+ +
+ + + + +
+
+ +

winterFriday constant + Null safety +

+ +
+ Schedule + const winterFriday + + +
+ +
+

The schedule for a winter Friday. See Schedule.getWinterFriday.

+
+ + +
+

Implementation

+
static const Schedule winterFriday = Schedule(
+	name: "Winter Friday",
+	periods: [
+		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 45))),
+		Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 25))),
+		Period.raw(name: "3", time: Range(Time(9, 30), Time(10, 05))),
+		Period.raw(name: "4", time: Range(Time(10, 10), Time(10, 45))),
+		Period.raw(name: "Homeroom", time: Range(Time(10, 45), Time(11, 05))),
+		Period.raw(name: "5", time: Range(Time(11, 05), Time(11, 40))),
+		Period.raw(name: "6", time: Range(Time(11, 45), Time(12, 20))),
+		Period.raw(name: "7", time: Range(Time(12, 25), Time(13, 00))),
+	],
+);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Schedule/winterFridayRoshChodesh-constant.html b/docs/data/Schedule/winterFridayRoshChodesh-constant.html new file mode 100644 index 000000000..1b950ad57 --- /dev/null +++ b/docs/data/Schedule/winterFridayRoshChodesh-constant.html @@ -0,0 +1,170 @@ + + + + + + + + winterFridayRoshChodesh constant - Schedule class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
winterFridayRoshChodesh
+ +
+ +
+ + + + +
+
+ +

winterFridayRoshChodesh constant + Null safety +

+ +
+ Schedule + const winterFridayRoshChodesh + + +
+ +
+

The schedule for when a Rosh Chodesh falls on a Winter Friday.

+
+ + +
+

Implementation

+
static const Schedule winterFridayRoshChodesh = Schedule(
+	name: "Winter Friday Rosh Chodesh",
+	periods: [
+		Period.raw(name: "1", time: Range(Time(8, 00), Time(9, 05))),
+		Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 40))),
+		Period.raw(name: "3", time: Range(Time(9, 45), Time(10, 15))),
+		Period.raw(name: "4", time: Range(Time(10, 20), Time(10, 50))),
+		Period.raw(name: "Homeroom", time: Range(Time(10, 50), Time(11, 10))),
+		Period.raw(name: "5", time: Range(Time(11, 10), Time(11, 40))),
+		Period.raw(name: "6", time: Range(Time(11, 45), Time(12, 15))),
+		Period.raw(name: "7", time: Range(Time(12, 20), Time(12, 50))),
+	],
+);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores-class.html b/docs/data/Scores-class.html new file mode 100644 index 000000000..eb8cff473 --- /dev/null +++ b/docs/data/Scores-class.html @@ -0,0 +1,381 @@ + + + + + + + + Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Scores
+ +
+ +
+ + + + +
+
+ +

Scores class + Null safety + +

+ + +
+

The scores for a SportsGame.

+

This class provides helper functions that will simplify higher-level logic.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ Scores({required int ramazScore, required int otherScore, required bool isHome}) +
+
+ Holds the scores for a SportsGame. +
const
+
+
+ Scores.fromJson(Map json) +
+
+ Creates a Scores object from a JSON entry. [...] +
+
+
+ +
+

Properties

+ +
+
+ didDraw + → bool + +
+
+ If the game ended in a tie. +
read-only
+ +
+ +
+ didWin + → bool + +
+
+ If Ramaz won the game. +
read-only
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ isHome + → bool + +
+
+ Whether the game is being played at home. [...] +
final
+ +
+ +
+ otherScore + → int + +
+
+ The score for the other team. +
final
+ +
+ +
+ ramazScore + → int + +
+
+ The score for Ramaz. +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ getScore({required bool home}) + → int + + + +
+
+ Gets the score for either the home team or the away team. + + +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ Converts this object to JSON. [...] + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/Scores.fromJson.html b/docs/data/Scores/Scores.fromJson.html new file mode 100644 index 000000000..97d7f51fa --- /dev/null +++ b/docs/data/Scores/Scores.fromJson.html @@ -0,0 +1,157 @@ + + + + + + + + Scores.fromJson constructor - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Scores.fromJson
+ +
+ +
+ + + + +
+
+ +

Scores.fromJson constructor + Null safety +

+ +
+ Scores.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Creates a Scores object from a JSON entry.

+

The entry must have:

+
    +
  • an "isHome" field, which should be a bool. See isHome.
  • +
  • an "otherScore" field, which should be an integer. See otherScore.
  • +
  • a "ramazScore" field, which should be an integer. See ramazScore.
  • +
+
+ + + +
+

Implementation

+
/// - an "isHome" field, which should be a bool. See [isHome].
+	/// - an "otherScore" field, which should be an integer. See [otherScore].
+	/// - a "ramazScore" field, which should be an integer. See [ramazScore].
+Scores.fromJson(Map json) :
+	isHome = json ["isHome"],
+	ramazScore = json ["ramaz"],
+	otherScore = json ["other"];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/Scores.html b/docs/data/Scores/Scores.html new file mode 100644 index 000000000..4e854f59a --- /dev/null +++ b/docs/data/Scores/Scores.html @@ -0,0 +1,151 @@ + + + + + + + + Scores constructor - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Scores
+ +
+ +
+ + + + +
+
+ +

Scores constructor + Null safety +

+ +
const + Scores(
  1. {required int ramazScore,
  2. +
  3. required int otherScore,
  4. +
  5. required bool isHome}
  6. +
) +
+ + +
+

Holds the scores for a SportsGame.

+
+ + + +
+

Implementation

+
const Scores({
+	required this.ramazScore,
+	required this.otherScore,
+	required this.isHome
+	});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/didDraw.html b/docs/data/Scores/didDraw.html new file mode 100644 index 000000000..d2f41ad6e --- /dev/null +++ b/docs/data/Scores/didDraw.html @@ -0,0 +1,152 @@ + + + + + + + + didDraw property - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
didDraw
+ +
+ +
+ + + + +
+
+ +

didDraw property + Null safety +

+ + + +
+ +
+ bool + didDraw + + +
+ + +
+

If the game ended in a tie.

+
+ + +
+

Implementation

+
bool get didDraw => ramazScore == otherScore;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/didWin.html b/docs/data/Scores/didWin.html new file mode 100644 index 000000000..f2c62ca54 --- /dev/null +++ b/docs/data/Scores/didWin.html @@ -0,0 +1,152 @@ + + + + + + + + didWin property - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
didWin
+ +
+ +
+ + + + +
+
+ +

didWin property + Null safety +

+ + + +
+ +
+ bool + didWin + + +
+ + +
+

If Ramaz won the game.

+
+ + +
+

Implementation

+
bool get didWin => ramazScore > otherScore;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/getScore.html b/docs/data/Scores/getScore.html new file mode 100644 index 000000000..48425c682 --- /dev/null +++ b/docs/data/Scores/getScore.html @@ -0,0 +1,151 @@ + + + + + + + + getScore method - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getScore
+ +
+ +
+ + + + +
+
+ +

getScore method + Null safety +

+ +
+ + +int +getScore(
  1. {required bool home}
  2. +
) + + + +
+ +
+

Gets the score for either the home team or the away team.

+
+ + + +
+

Implementation

+
int getScore({required bool home}) => home == isHome
+	  ? ramazScore : otherScore;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/hashCode.html b/docs/data/Scores/hashCode.html new file mode 100644 index 000000000..d45f2b95a --- /dev/null +++ b/docs/data/Scores/hashCode.html @@ -0,0 +1,176 @@ + + + + + + + + hashCode property - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/isHome.html b/docs/data/Scores/isHome.html new file mode 100644 index 000000000..89172618e --- /dev/null +++ b/docs/data/Scores/isHome.html @@ -0,0 +1,148 @@ + + + + + + + + isHome property - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
isHome
+ +
+ +
+ + + + +
+
+ +

isHome property + Null safety +

+ +
+ bool + isHome +
final
+ +
+ +
+

Whether the game is being played at home.

+

This dictates which score is returned for getScore.

+
+ + +
+

Implementation

+
final bool isHome;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/noSuchMethod.html b/docs/data/Scores/noSuchMethod.html new file mode 100644 index 000000000..337034eec --- /dev/null +++ b/docs/data/Scores/noSuchMethod.html @@ -0,0 +1,184 @@ + + + + + + + + noSuchMethod method - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/operator_equals.html b/docs/data/Scores/operator_equals.html new file mode 100644 index 000000000..72ea92c21 --- /dev/null +++ b/docs/data/Scores/operator_equals.html @@ -0,0 +1,175 @@ + + + + + + + + operator == method - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/otherScore.html b/docs/data/Scores/otherScore.html new file mode 100644 index 000000000..cbc4bf1ec --- /dev/null +++ b/docs/data/Scores/otherScore.html @@ -0,0 +1,147 @@ + + + + + + + + otherScore property - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
otherScore
+ +
+ +
+ + + + +
+
+ +

otherScore property + Null safety +

+ +
+ int + otherScore +
final
+ +
+ +
+

The score for the other team.

+
+ + +
+

Implementation

+
final int otherScore;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/ramazScore.html b/docs/data/Scores/ramazScore.html new file mode 100644 index 000000000..6d87812d3 --- /dev/null +++ b/docs/data/Scores/ramazScore.html @@ -0,0 +1,147 @@ + + + + + + + + ramazScore property - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ramazScore
+ +
+ +
+ + + + +
+
+ +

ramazScore property + Null safety +

+ +
+ int + ramazScore +
final
+ +
+ +
+

The score for Ramaz.

+
+ + +
+

Implementation

+
final int ramazScore;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/runtimeType.html b/docs/data/Scores/runtimeType.html new file mode 100644 index 000000000..079e14da3 --- /dev/null +++ b/docs/data/Scores/runtimeType.html @@ -0,0 +1,151 @@ + + + + + + + + runtimeType property - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/toJson.html b/docs/data/Scores/toJson.html new file mode 100644 index 000000000..898eda4c0 --- /dev/null +++ b/docs/data/Scores/toJson.html @@ -0,0 +1,155 @@ + + + + + + + + toJson method - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ +
+

Converts this object to JSON.

+

Passing the result of this function to Scores.fromJson() should +return an equivalent object.

+
+ + + +
+

Implementation

+
Map toJson() => {
+  	"isHome": isHome,
+  	"ramaz": ramazScore,
+  	"other": otherScore,
+  };
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Scores/toString.html b/docs/data/Scores/toString.html new file mode 100644 index 000000000..331c1fcb6 --- /dev/null +++ b/docs/data/Scores/toString.html @@ -0,0 +1,164 @@ + + + + + + + + toString method - Scores class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
@override
+String toString() => "Ramaz: $ramazScore, Other: $otherScore";
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Sport-class.html b/docs/data/Sport-class.html new file mode 100644 index 000000000..9c9f6465d --- /dev/null +++ b/docs/data/Sport-class.html @@ -0,0 +1,385 @@ + + + + + + + + Sport enum - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Sport
+ +
+ +
+ + + + +
+
+ +

Sport enum + Null safety + +

+ + +
+

All the different sports that can be played.

+
+ + + +
+

Constants

+ +
+
+ baseball + → const Sport + + +
+
+

Baseball.

+ + +
+ const Sport(0) +
+
+ +
+ basketball + → const Sport + + +
+
+

Basketball.

+ + +
+ const Sport(1) +
+
+ +
+ hockey + → const Sport + + +
+
+

Hockey.

+ + +
+ const Sport(2) +
+
+ +
+ soccer + → const Sport + + +
+
+

Soccer.

+ + +
+ const Sport(5) +
+
+ +
+ tennis + → const Sport + + +
+
+

Tennis.

+ + +
+ const Sport(3) +
+
+ +
+ values + → const List<Sport> + + +
+
+

A constant List of the values in this enum, in order of their declaration.

+ + +
+ const List<Sport> +
+
+ +
+ volleyball + → const Sport + + +
+
+

Volleyball.

+ + +
+ const Sport(4) +
+
+ +
+
+ + +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ index + → int + +
+
+

The integer index of this enum.

+
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Sport/hashCode.html b/docs/data/Sport/hashCode.html new file mode 100644 index 000000000..4fedd2a81 --- /dev/null +++ b/docs/data/Sport/hashCode.html @@ -0,0 +1,173 @@ + + + + + + + + hashCode property - Sport extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Sport/noSuchMethod.html b/docs/data/Sport/noSuchMethod.html new file mode 100644 index 000000000..7b32e3058 --- /dev/null +++ b/docs/data/Sport/noSuchMethod.html @@ -0,0 +1,181 @@ + + + + + + + + noSuchMethod method - Sport extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Sport/operator_equals.html b/docs/data/Sport/operator_equals.html new file mode 100644 index 000000000..ecbfd854e --- /dev/null +++ b/docs/data/Sport/operator_equals.html @@ -0,0 +1,172 @@ + + + + + + + + operator == method - Sport extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Sport/runtimeType.html b/docs/data/Sport/runtimeType.html new file mode 100644 index 000000000..61b256eab --- /dev/null +++ b/docs/data/Sport/runtimeType.html @@ -0,0 +1,148 @@ + + + + + + + + runtimeType property - Sport extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Sport/toString.html b/docs/data/Sport/toString.html new file mode 100644 index 000000000..300ff371c --- /dev/null +++ b/docs/data/Sport/toString.html @@ -0,0 +1,151 @@ + + + + + + + + toString method - Sport extension - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ + +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame-class.html b/docs/data/SportsGame-class.html new file mode 100644 index 000000000..3dc6eeab7 --- /dev/null +++ b/docs/data/SportsGame-class.html @@ -0,0 +1,500 @@ + + + + + + + + SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
SportsGame
+ +
+ +
+ + + + +
+
+ +

SportsGame class + Null safety + +

+ + +
+

A sports game.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ SportsGame({required Sport sport, required DateTime date, required Range times, required String team, required String opponent, required bool isHome, Scores? scores}) +
+
+ Creates a game dataclass. +
const
+
+
+ SportsGame.fromJson(Map json) +
+
+ Converts a JSON entry to a SportsGame. [...] +
+
+
+ +
+

Properties

+ +
+
+ awayTeam + → String + +
+
+ The name of the away team. +
read-only
+ +
+ +
+ date + → DateTime + +
+
+ The date of the game. [...] +
final
+ +
+ +
+ dateTime + → DateTime + +
+
+ The end of the match. [...] +
read-only
+ +
+ +
+ description + → String + +
+
+ Specifies which team is away and which team is home. +
read-only
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only
+ +
+ +
+ homeTeam + → String + +
+
+ The name of the home team. +
read-only
+ +
+ +
+ isHome + → bool + +
+
+ Whether the game is being played at home or somewhere else. [...] +
final
+ +
+ +
+ opponent + → String + +
+
+ The opponent school being played. +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ scores + Scores? + +
+
+ The scores for this game. [...] +
final
+ +
+ +
+ sport + Sport + +
+
+ The type of sport being played. +
final
+ +
+ +
+ team + → String + +
+
+ The team playing the game. +
final
+ +
+ +
+ times + Range + +
+
+ The start and end times for this game. [...] +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ replaceScores(Scores? newScores) + SportsGame + + + +
+
+ Returns a new SportsGame with the scores switched out. [...] + + +
+ +
+ toJson() + → Map + + + +
+
+ Converts this game to JSON. [...] + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(dynamic other) + → bool + + + +
+
+ The equality operator. [...] + + +
+ +
+
+ + +
+

Static Methods

+
+
+ capitalize(Sport sport) + → String + + + +
+
+ Capitalizes a word. [...] + + +
+ +
+ fromList(List<Map> listJson) + → List<SportsGame> + + + +
+
+ Converts a list of JSON entries into a list of SportsGames. [...] + + +
+ +
+ getJsonList(List<SportsGame> games) + → List<Map> + + + +
+
+ Converts a list of SportsGames into a list of JSON entries. + + +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/SportsGame.fromJson.html b/docs/data/SportsGame/SportsGame.fromJson.html new file mode 100644 index 000000000..d2475b737 --- /dev/null +++ b/docs/data/SportsGame/SportsGame.fromJson.html @@ -0,0 +1,174 @@ + + + + + + + + SportsGame.fromJson constructor - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
SportsGame.fromJson
+ +
+ +
+ + + + +
+
+ +

SportsGame.fromJson constructor + Null safety +

+ +
+ SportsGame.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Converts a JSON entry to a SportsGame.

+

The JSON should have:

+
    +
  • a "sport" field (String)
  • +
  • a "date" field (String acceptable to DateTime.parse. Eg, "2012-02-27")
  • +
  • a "times" field. See Range.fromJson for format.
  • +
  • a "team" field (String)
  • +
  • a "home" field (bool)
  • +
  • an "opponent" field (String)
  • +
  • a "scores" field. See Scores.fromJson for format.
  • +
+
+ + + +
+

Implementation

+
SportsGame.fromJson(Map json) :
+	sport = stringToSport [json ["sport"]]!,
+	date = DateTime.parse(json ["date"]),
+	times = Range.fromJson(json ["times"]),
+	team = json ["team"],
+	isHome = json ["isHome"],
+	opponent = json ["opponent"],
+	scores = json ["scores"] == null ? null : Scores.fromJson(
+		Map.from(json ["scores"])
+	);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/SportsGame.html b/docs/data/SportsGame/SportsGame.html new file mode 100644 index 000000000..ece588f4b --- /dev/null +++ b/docs/data/SportsGame/SportsGame.html @@ -0,0 +1,169 @@ + + + + + + + + SportsGame constructor - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
SportsGame
+ +
+ +
+ + + + +
+
+ +

SportsGame constructor + Null safety +

+ +
const + SportsGame(
  1. {required Sport sport,
  2. +
  3. required DateTime date,
  4. +
  5. required Range times,
  6. +
  7. required String team,
  8. +
  9. required String opponent,
  10. +
  11. required bool isHome,
  12. +
  13. Scores? scores}
  14. +
) +
+ + +
+

Creates a game dataclass.

+
+ + + +
+

Implementation

+
const SportsGame({
+	required this.sport,
+	required this.date,
+	required this.times,
+	required this.team,
+	required this.opponent,
+	required this.isHome,
+	this.scores,
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/awayTeam.html b/docs/data/SportsGame/awayTeam.html new file mode 100644 index 000000000..d8b6ee157 --- /dev/null +++ b/docs/data/SportsGame/awayTeam.html @@ -0,0 +1,162 @@ + + + + + + + + awayTeam property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
awayTeam
+ +
+ +
+ + + + +
+
+ +

awayTeam property + Null safety +

+ + + +
+ +
+ String + awayTeam + + +
+ + +
+

The name of the away team.

+
+ + +
+

Implementation

+
String get awayTeam => isHome ? opponent : "Ramaz";
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/capitalize.html b/docs/data/SportsGame/capitalize.html new file mode 100644 index 000000000..0f71b2d47 --- /dev/null +++ b/docs/data/SportsGame/capitalize.html @@ -0,0 +1,163 @@ + + + + + + + + capitalize method - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
capitalize
+ +
+ +
+ + + + +
+
+ +

capitalize method + Null safety +

+ +
+ + +String +capitalize(
  1. Sport sport
  2. +
) + + + +
+ +
+

Capitalizes a word.

+

Useful for the Sport enum.

+
+ + + +
+

Implementation

+
static String capitalize(Sport sport) =>
+	sportToString [sport]! [0].toUpperCase()
+	+ sportToString [sport]!.substring(1);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/date.html b/docs/data/SportsGame/date.html new file mode 100644 index 000000000..79e9a1e82 --- /dev/null +++ b/docs/data/SportsGame/date.html @@ -0,0 +1,158 @@ + + + + + + + + date property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
date
+ +
+ +
+ + + + +
+
+ +

date property + Null safety +

+ +
+ DateTime + date +
final
+ +
+ +
+

The date of the game.

+

The time can be ignored since it is represented in times.

+
+ + +
+

Implementation

+
final DateTime date;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/dateTime.html b/docs/data/SportsGame/dateTime.html new file mode 100644 index 000000000..4aa44ad66 --- /dev/null +++ b/docs/data/SportsGame/dateTime.html @@ -0,0 +1,169 @@ + + + + + + + + dateTime property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
dateTime
+ +
+ +
+ + + + +
+
+ +

dateTime property + Null safety +

+ + + +
+ +
+ DateTime + dateTime + + +
+ + +
+

The end of the match.

+

This is convenient for checking if the game already passed.

+
+ + +
+

Implementation

+
DateTime get dateTime => DateTime(
+	date.year,
+	date.month,
+	date.day,
+	times.end.hour,
+	times.end.minutes,
+);
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/description.html b/docs/data/SportsGame/description.html new file mode 100644 index 000000000..37f8ad45e --- /dev/null +++ b/docs/data/SportsGame/description.html @@ -0,0 +1,162 @@ + + + + + + + + description property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
description
+ +
+ +
+ + + + +
+
+ +

description property + Null safety +

+ + + +
+ +
+ String + description + + +
+ + +
+

Specifies which team is away and which team is home.

+
+ + +
+

Implementation

+
String get description => "$awayTeam @ $homeTeam";
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/fromList.html b/docs/data/SportsGame/fromList.html new file mode 100644 index 000000000..6370b3a1f --- /dev/null +++ b/docs/data/SportsGame/fromList.html @@ -0,0 +1,166 @@ + + + + + + + + fromList method - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
fromList
+ +
+ +
+ + + + +
+
+ +

fromList method + Null safety +

+ +
+ + +List<SportsGame> +fromList(
  1. List<Map> listJson
  2. +
) + + + +
+ +
+

Converts a list of JSON entries into a list of SportsGames.

+

This method is needed since it casts each dynamic entry to a +Map, and then passes those values to +SportsGame.fromJson.

+
+ + + +
+

Implementation

+
static List<SportsGame> fromList(List<Map> listJson) => [
+	for (final Map json in listJson)
+		SportsGame.fromJson(json)
+];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/getJsonList.html b/docs/data/SportsGame/getJsonList.html new file mode 100644 index 000000000..2e151e7ab --- /dev/null +++ b/docs/data/SportsGame/getJsonList.html @@ -0,0 +1,163 @@ + + + + + + + + getJsonList method - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getJsonList
+ +
+ +
+ + + + +
+
+ +

getJsonList method + Null safety +

+ +
+ + +List<Map> +getJsonList(
  1. List<SportsGame> games
  2. +
) + + + +
+ +
+

Converts a list of SportsGames into a list of JSON entries.

+
+ + + +
+

Implementation

+
static List<Map> getJsonList(List<SportsGame> games) => [
+	for (final SportsGame game in games)
+		game.toJson()
+];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/hashCode.html b/docs/data/SportsGame/hashCode.html new file mode 100644 index 000000000..9244edf8f --- /dev/null +++ b/docs/data/SportsGame/hashCode.html @@ -0,0 +1,188 @@ + + + + + + + + hashCode property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+ +

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode + + +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
@override
+int get hashCode => "$isHome-$opponent-$sport-$team-$date-$times".hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/homeTeam.html b/docs/data/SportsGame/homeTeam.html new file mode 100644 index 000000000..8f4bb959f --- /dev/null +++ b/docs/data/SportsGame/homeTeam.html @@ -0,0 +1,162 @@ + + + + + + + + homeTeam property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
homeTeam
+ +
+ +
+ + + + +
+
+ +

homeTeam property + Null safety +

+ + + +
+ +
+ String + homeTeam + + +
+ + +
+

The name of the home team.

+
+ + +
+

Implementation

+
String get homeTeam => isHome ? "Ramaz" : opponent;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/isHome.html b/docs/data/SportsGame/isHome.html new file mode 100644 index 000000000..385efcce4 --- /dev/null +++ b/docs/data/SportsGame/isHome.html @@ -0,0 +1,158 @@ + + + + + + + + isHome property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
isHome
+ +
+ +
+ + + + +
+
+ +

isHome property + Null safety +

+ +
+ bool + isHome +
final
+ +
+ +
+

Whether the game is being played at home or somewhere else.

+

This affects the UI representation of the game, as well as Scores.isHome.

+
+ + +
+

Implementation

+
final bool isHome;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/noSuchMethod.html b/docs/data/SportsGame/noSuchMethod.html new file mode 100644 index 000000000..b4b066b98 --- /dev/null +++ b/docs/data/SportsGame/noSuchMethod.html @@ -0,0 +1,194 @@ + + + + + + + + noSuchMethod method - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/operator_equals.html b/docs/data/SportsGame/operator_equals.html new file mode 100644 index 000000000..e06fe7fad --- /dev/null +++ b/docs/data/SportsGame/operator_equals.html @@ -0,0 +1,198 @@ + + + + + + + + operator == method - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+ +

operator == method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +bool +operator ==(
  1. dynamic other
  2. +
) + + + +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
@override
+bool operator == (dynamic other) => other is SportsGame &&
+	other.sport == sport &&
+	other.opponent == opponent &&
+	other.isHome == isHome &&
+	other.team == team &&
+	other.date.isSameDay(date) &&
+	other.times == times;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/opponent.html b/docs/data/SportsGame/opponent.html new file mode 100644 index 000000000..5b1b31091 --- /dev/null +++ b/docs/data/SportsGame/opponent.html @@ -0,0 +1,157 @@ + + + + + + + + opponent property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
opponent
+ +
+ +
+ + + + +
+
+ +

opponent property + Null safety +

+ +
+ String + opponent +
final
+ +
+ +
+

The opponent school being played.

+
+ + +
+

Implementation

+
final String opponent;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/replaceScores.html b/docs/data/SportsGame/replaceScores.html new file mode 100644 index 000000000..97d364f9a --- /dev/null +++ b/docs/data/SportsGame/replaceScores.html @@ -0,0 +1,169 @@ + + + + + + + + replaceScores method - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
replaceScores
+ +
+ +
+ + + + +
+
+ +

replaceScores method + Null safety +

+ +
+ + +SportsGame +replaceScores(
  1. Scores? newScores
  2. +
) + + + +
+ +
+

Returns a new SportsGame with the scores switched out.

+

This method allows SportsGames to stay immutable.

+
+ + + +
+

Implementation

+
SportsGame replaceScores(Scores? newScores) => SportsGame(
+	sport: sport,
+	team: team,
+	isHome: isHome,
+	date: date,
+	opponent: opponent,
+	times: times,
+	scores: newScores,
+);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/runtimeType.html b/docs/data/SportsGame/runtimeType.html new file mode 100644 index 000000000..e68c81210 --- /dev/null +++ b/docs/data/SportsGame/runtimeType.html @@ -0,0 +1,161 @@ + + + + + + + + runtimeType property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/scores.html b/docs/data/SportsGame/scores.html new file mode 100644 index 000000000..65803d78e --- /dev/null +++ b/docs/data/SportsGame/scores.html @@ -0,0 +1,159 @@ + + + + + + + + scores property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
scores
+ +
+ +
+ + + + +
+
+ +

scores property + Null safety +

+ +
+ Scores? + scores +
final
+ +
+ +
+

The scores for this game.

+

The Scores dataclass holds helper methods to simplify logic about who +won, and which score to get depending on isHome.

+
+ + +
+

Implementation

+
final Scores? scores;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/sport.html b/docs/data/SportsGame/sport.html new file mode 100644 index 000000000..eb2d116a0 --- /dev/null +++ b/docs/data/SportsGame/sport.html @@ -0,0 +1,157 @@ + + + + + + + + sport property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
sport
+ +
+ +
+ + + + +
+
+ +

sport property + Null safety +

+ +
+ Sport + sport +
final
+ +
+ +
+

The type of sport being played.

+
+ + +
+

Implementation

+
final Sport sport;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/team.html b/docs/data/SportsGame/team.html new file mode 100644 index 000000000..e4871c1b8 --- /dev/null +++ b/docs/data/SportsGame/team.html @@ -0,0 +1,158 @@ + + + + + + + + team property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
team
+ +
+ +
+ + + + +
+
+ +

team property + Null safety +

+ +
+ String + team +
final
+ +
+ +
+

The team playing the game.

+
+ + +
+

Implementation

+
// TODO(Levi): make sure this data is downloaded properly, #2
+final String team;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/times.html b/docs/data/SportsGame/times.html new file mode 100644 index 000000000..8d6c06fda --- /dev/null +++ b/docs/data/SportsGame/times.html @@ -0,0 +1,158 @@ + + + + + + + + times property - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
times
+ +
+ +
+ + + + +
+
+ +

times property + Null safety +

+ +
+ Range + times +
final
+ +
+ +
+

The start and end times for this game.

+

The date can be ignored since it is represented in date.

+
+ + +
+

Implementation

+
final Range times;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/toJson.html b/docs/data/SportsGame/toJson.html new file mode 100644 index 000000000..193692486 --- /dev/null +++ b/docs/data/SportsGame/toJson.html @@ -0,0 +1,169 @@ + + + + + + + + toJson method - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ +
+

Converts this game to JSON.

+

Passing the result of this function to SportsGame.fromJson() should +return an equivalent object.

+
+ + + +
+

Implementation

+
Map toJson() => {
+	"sport": sportToString [sport],
+	"date": date.toString(),
+	"times": times.toJson(),
+	"team": team,
+	"isHome": isHome,
+	"opponent": opponent,
+	"scores": scores?.toJson(),
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SportsGame/toString.html b/docs/data/SportsGame/toString.html new file mode 100644 index 000000000..7ef366426 --- /dev/null +++ b/docs/data/SportsGame/toString.html @@ -0,0 +1,167 @@ + + + + + + + + toString method - SportsGame class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+

toString method + Null safety +

+ +
+ + +String +toString() + +
inherited
+ +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
external String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject-class.html b/docs/data/Subject-class.html new file mode 100644 index 000000000..5fa4dc68e --- /dev/null +++ b/docs/data/Subject-class.html @@ -0,0 +1,352 @@ + + + + + + + + Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Subject
+ +
+ +
+ + + + +
+
+ +

Subject class + Null safety + +

+ + +
+

A subject, or class, that a student can take.

+

Since one's schedule contains multiple instances of the same subject, +subjects are represented externally by an ID, which is used to look up +a canonicalized Subject instance. This saves space and simplifies +compatibility with existing school databases.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ Subject({required String name, required String teacher, String? virtualLink}) +
+
+ A const constructor for a Subject. +
const
+
+
+ Subject.fromJson(Map json) +
+
+ Returns a Subject instance from a JSON object. [...] +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only
+ +
+ +
+ name + → String + +
+
+ The name of this subject. +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ teacher + → String + +
+
+ The teacher who teaches this subject. +
final
+ +
+ + +
+ A link to a virtual class, like Zoom. +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(dynamic other) + → bool + + + +
+
+ The equality operator. [...] + + +
+ +
+
+ + +
+

Static Methods

+
+
+ getSubjects(Map<String, Map> data) + → Map<String, Subject> + + + +
+
+ Returns a map of Subjects from a list of JSON objects. [...] + + +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/Subject.fromJson.html b/docs/data/Subject/Subject.fromJson.html new file mode 100644 index 000000000..6f9321773 --- /dev/null +++ b/docs/data/Subject/Subject.fromJson.html @@ -0,0 +1,147 @@ + + + + + + + + Subject.fromJson constructor - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Subject.fromJson
+ +
+ +
+ + + + +
+
+ +

Subject.fromJson constructor + Null safety +

+ +
+ Subject.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Returns a Subject instance from a JSON object.

+

The JSON map must have a teacher and name field.

+
+ + + +
+

Implementation

+
Subject.fromJson(Map json) :
+	name = json ["name"],
+	teacher = json ["teacher"],
+	virtualLink = json ["virtualLink"];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/Subject.html b/docs/data/Subject/Subject.html new file mode 100644 index 000000000..2460a5b75 --- /dev/null +++ b/docs/data/Subject/Subject.html @@ -0,0 +1,149 @@ + + + + + + + + Subject constructor - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Subject
+ +
+ +
+ + + + +
+
+ +

Subject constructor + Null safety +

+ +
const + Subject(
  1. {required String name,
  2. +
  3. required String teacher,
  4. +
  5. String? virtualLink}
  6. +
) +
+ + +
+

A const constructor for a Subject.

+
+ + + +
+

Implementation

+
const Subject ({
+	required this.name,
+	required this.teacher,
+	this.virtualLink,
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/getSubjects.html b/docs/data/Subject/getSubjects.html new file mode 100644 index 000000000..3d7437914 --- /dev/null +++ b/docs/data/Subject/getSubjects.html @@ -0,0 +1,158 @@ + + + + + + + + getSubjects method - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getSubjects
+ +
+ +
+ + + + +
+
+ +

getSubjects method + Null safety +

+ +
+ + +Map<String, Subject> +getSubjects(
  1. Map<String, Map> data
  2. +
) + + + +
+ +
+

Returns a map of Subjects from a list of JSON objects.

+

The keys are IDs to the subject, and the values are the +corresponding Subject instances. +See Subject.fromJson for more details.

+
+ + + +
+

Implementation

+
static Map<String, Subject> getSubjects(
+	Map<String, Map> data
+) => data.map (
+	(String id, Map json) => MapEntry (
+		id,
+		Subject.fromJson(json)
+	)
+);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/hashCode.html b/docs/data/Subject/hashCode.html new file mode 100644 index 000000000..da1d7df16 --- /dev/null +++ b/docs/data/Subject/hashCode.html @@ -0,0 +1,176 @@ + + + + + + + + hashCode property - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+ +

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode + + +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
@override
+int get hashCode => "$name-$teacher".hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/name.html b/docs/data/Subject/name.html new file mode 100644 index 000000000..65d2182b6 --- /dev/null +++ b/docs/data/Subject/name.html @@ -0,0 +1,145 @@ + + + + + + + + name property - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
name
+ +
+ +
+ + + + +
+
+ +

name property + Null safety +

+ +
+ String + name +
final
+ +
+ +
+

The name of this subject.

+
+ + +
+

Implementation

+
final String name;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/noSuchMethod.html b/docs/data/Subject/noSuchMethod.html new file mode 100644 index 000000000..b7b39d2af --- /dev/null +++ b/docs/data/Subject/noSuchMethod.html @@ -0,0 +1,182 @@ + + + + + + + + noSuchMethod method - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/operator_equals.html b/docs/data/Subject/operator_equals.html new file mode 100644 index 000000000..c12cc3aa5 --- /dev/null +++ b/docs/data/Subject/operator_equals.html @@ -0,0 +1,182 @@ + + + + + + + + operator == method - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+ +

operator == method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +bool +operator ==(
  1. dynamic other
  2. +
) + + + +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
@override
+bool operator == (dynamic other) => other is Subject &&
+	other.name == name &&
+	other.teacher == teacher;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/runtimeType.html b/docs/data/Subject/runtimeType.html new file mode 100644 index 000000000..13736285f --- /dev/null +++ b/docs/data/Subject/runtimeType.html @@ -0,0 +1,149 @@ + + + + + + + + runtimeType property - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/teacher.html b/docs/data/Subject/teacher.html new file mode 100644 index 000000000..38327928a --- /dev/null +++ b/docs/data/Subject/teacher.html @@ -0,0 +1,145 @@ + + + + + + + + teacher property - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
teacher
+ +
+ +
+ + + + +
+
+ +

teacher property + Null safety +

+ +
+ String + teacher +
final
+ +
+ +
+

The teacher who teaches this subject.

+
+ + +
+

Implementation

+
final String teacher;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/toString.html b/docs/data/Subject/toString.html new file mode 100644 index 000000000..e7970119a --- /dev/null +++ b/docs/data/Subject/toString.html @@ -0,0 +1,162 @@ + + + + + + + + toString method - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
@override
+String toString() => "$name ($teacher)";
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Subject/virtualLink.html b/docs/data/Subject/virtualLink.html new file mode 100644 index 000000000..b001aa077 --- /dev/null +++ b/docs/data/Subject/virtualLink.html @@ -0,0 +1,145 @@ + + + + + + + + virtualLink property - Subject class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
virtualLink
+ +
+ +
+ + + + +
+
+ +

virtualLink property + Null safety +

+ +
+ String? + virtualLink +
final
+ +
+ +
+

A link to a virtual class, like Zoom.

+
+ + +
+

Implementation

+
final String? virtualLink;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SubjectReminderTime-class.html b/docs/data/SubjectReminderTime-class.html new file mode 100644 index 000000000..3154b2bb5 --- /dev/null +++ b/docs/data/SubjectReminderTime-class.html @@ -0,0 +1,371 @@ + + + + + + + + SubjectReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
SubjectReminderTime
+ +
+ +
+ + + + +
+
+ +

SubjectReminderTime class + Null safety + +

+ + +
+

A ReminderTime that depends on a subject.

+
+ + +
+
+
Inheritance
+
+ + + + + +
+
+ +
+

Constructors

+ +
+
+ SubjectReminderTime({required String name, required bool repeats}) +
+
+ Returns a new SubjectReminderTime. All parameters must be non-null. +
const
+
+
+ SubjectReminderTime.fromJson(Map json) +
+
+ Returns a new SubjectReminderTime from a JSON object. [...] +
+
+
+ +
+

Properties

+ +
+
+ hash + → String + +
+
+ +
read-only, override
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ name + → String + +
+
+ The name of the subject this ReminderTime depends on. +
final
+ +
+ +
+ repeats + → bool + +
+
+ Whether the reminder should repeat. +
final, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ type + ReminderTimeType + +
+
+ The type of reminder. [...] +
final, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ doesApply({required String? dayName, required String? subject, required String? period}) + → bool + + + +
+
+ Returns true if this instance's subject field +matches the subject parameter. +
override
+ +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ Returns this ReminderTime as JSON. +
override
+ +
+ +
+ toString() + → String + + + +
+
+ Returns a String representation of this ReminderTime. [...] +
override
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SubjectReminderTime/SubjectReminderTime.fromJson.html b/docs/data/SubjectReminderTime/SubjectReminderTime.fromJson.html new file mode 100644 index 000000000..8ed8b6e9b --- /dev/null +++ b/docs/data/SubjectReminderTime/SubjectReminderTime.fromJson.html @@ -0,0 +1,147 @@ + + + + + + + + SubjectReminderTime.fromJson constructor - SubjectReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
SubjectReminderTime.fromJson
+ +
+ +
+ + + + +
+
+ +

SubjectReminderTime.fromJson constructor + Null safety +

+ +
+ SubjectReminderTime.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Returns a new SubjectReminderTime from a JSON object.

+

The fields repeats and name must not be null.

+
+ + + +
+

Implementation

+
SubjectReminderTime.fromJson(Map json) :
+	name = json ["name"],
+	super (repeats: json ["repeats"], type: ReminderTimeType.subject);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SubjectReminderTime/SubjectReminderTime.html b/docs/data/SubjectReminderTime/SubjectReminderTime.html new file mode 100644 index 000000000..c5234db8a --- /dev/null +++ b/docs/data/SubjectReminderTime/SubjectReminderTime.html @@ -0,0 +1,148 @@ + + + + + + + + SubjectReminderTime constructor - SubjectReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
SubjectReminderTime
+ +
+ +
+ + + + +
+
+ +

SubjectReminderTime constructor + Null safety +

+ +
const + SubjectReminderTime(
  1. {required String name,
  2. +
  3. required bool repeats}
  4. +
) +
+ + +
+

Returns a new SubjectReminderTime. All parameters must be non-null.

+
+ + + +
+

Implementation

+
const SubjectReminderTime({
+	required this.name,
+	required bool repeats,
+}) : super (repeats: repeats, type: ReminderTimeType.subject);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SubjectReminderTime/doesApply.html b/docs/data/SubjectReminderTime/doesApply.html new file mode 100644 index 000000000..6402449c2 --- /dev/null +++ b/docs/data/SubjectReminderTime/doesApply.html @@ -0,0 +1,162 @@ + + + + + + + + doesApply method - SubjectReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
doesApply
+ +
+ +
+ + + + +
+
+ +

doesApply method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +bool +doesApply(
  1. {required String? dayName,
  2. +
  3. required String? subject,
  4. +
  5. required String? period}
  6. +
) + +
override
+ +
+ +
+

Returns true if this instance's subject field +matches the subject parameter.

+
+ + + +
+

Implementation

+
@override
+bool doesApply({
+	required String? dayName,
+	required String? subject,
+	required String? period,
+}) => subject == name;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SubjectReminderTime/hash.html b/docs/data/SubjectReminderTime/hash.html new file mode 100644 index 000000000..2bb80281e --- /dev/null +++ b/docs/data/SubjectReminderTime/hash.html @@ -0,0 +1,149 @@ + + + + + + + + hash property - SubjectReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hash
+ +
+ +
+ + + + +
+
+ +

hash property + Null safety +

+ + + +
+ +
+ String + hash +
override
+ +
+ + + + +
+

Implementation

+
@override
+String get hash => "$name-$repeats";
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SubjectReminderTime/name.html b/docs/data/SubjectReminderTime/name.html new file mode 100644 index 000000000..ce2ee45e0 --- /dev/null +++ b/docs/data/SubjectReminderTime/name.html @@ -0,0 +1,146 @@ + + + + + + + + name property - SubjectReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
name
+ +
+ +
+ + + + +
+
+ +

name property + Null safety +

+ +
+ String + name +
final
+ +
+ +
+

The name of the subject this ReminderTime depends on.

+
+ + +
+

Implementation

+
final String name;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SubjectReminderTime/toJson.html b/docs/data/SubjectReminderTime/toJson.html new file mode 100644 index 000000000..b46ea814b --- /dev/null +++ b/docs/data/SubjectReminderTime/toJson.html @@ -0,0 +1,158 @@ + + + + + + + + toJson method - SubjectReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +Map +toJson() + +
override
+ +
+ +
+

Returns this ReminderTime as JSON.

+
+ + + +
+

Implementation

+
@override
+Map toJson() => {
+	"name": name,
+	"repeats": repeats,
+	"type": reminderTimeToString [type],
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/SubjectReminderTime/toString.html b/docs/data/SubjectReminderTime/toString.html new file mode 100644 index 000000000..80a7579eb --- /dev/null +++ b/docs/data/SubjectReminderTime/toString.html @@ -0,0 +1,155 @@ + + + + + + + + toString method - SubjectReminderTime class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + +
override
+ +
+ +
+

Returns a String representation of this ReminderTime.

+

Used for debugging and throughout the UI.

+
+ + + +
+

Implementation

+
@override
+String toString() => (repeats ? "Repeats every " : "") + name;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time-class.html b/docs/data/Time-class.html new file mode 100644 index 000000000..adee3dbc7 --- /dev/null +++ b/docs/data/Time-class.html @@ -0,0 +1,399 @@ + + + + + + + + Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Time
+ +
+ +
+ + + + +
+
+ +

Time class + Null safety + +

+ + +
+

The hour and minute representation of a time.

+

This is used instead of Flutter's TimeOfDay +to provide the > and < operators.

+
+ + +
+
+ + + + +
Available Extensions
+
+ +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ Time(int hour, int minutes) +
+
+ A const constructor. +
const
+
+
+ Time.fromDateTime(DateTime date) +
+
+ Simplifies a DateTime object to a Time. +
+
+ Time.fromJson(Map json) +
+
+ Returns a new Time object from JSON data. [...] +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only
+ +
+ +
+ hour + → int + +
+
+ The hour in 24-hour format. +
final
+ +
+ +
+ minutes + → int + +
+
+ The minutes. +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toJson() + → Map + + + +
+
+ Returns this obect in JSON form + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator <(Time other) + → bool + + + +
+
+ Returns whether this Time is before another Time. + + +
+ +
+ operator <=(Time other) + → bool + + + +
+
+ Returns whether this Time is at or before another Time. + + +
+ +
+ operator ==(dynamic other) + → bool + + + +
+
+ The equality operator. [...] + + +
+ +
+ operator >(Time other) + → bool + + + +
+
+ Returns whether this Time is after another Time. + + +
+ +
+ operator >=(Time other) + → bool + + + +
+
+ Returns whether this Time is at or after another Time. + + +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/Time.fromDateTime.html b/docs/data/Time/Time.fromDateTime.html new file mode 100644 index 000000000..6381245d3 --- /dev/null +++ b/docs/data/Time/Time.fromDateTime.html @@ -0,0 +1,148 @@ + + + + + + + + Time.fromDateTime constructor - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Time.fromDateTime
+ +
+ +
+ + + + +
+
+ +

Time.fromDateTime constructor + Null safety +

+ +
+ Time.fromDateTime(
  1. DateTime date
  2. +
) +
+ + +
+

Simplifies a DateTime object to a Time.

+
+ + + +
+

Implementation

+
Time.fromDateTime (DateTime date) :
+	hour = date.hour,
+	minutes = date.minute;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/Time.fromJson.html b/docs/data/Time/Time.fromJson.html new file mode 100644 index 000000000..10f258df5 --- /dev/null +++ b/docs/data/Time/Time.fromJson.html @@ -0,0 +1,149 @@ + + + + + + + + Time.fromJson constructor - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Time.fromJson
+ +
+ +
+ + + + +
+
+ +

Time.fromJson constructor + Null safety +

+ +
+ Time.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Returns a new Time object from JSON data.

+

The json must have hour and minutes fields that map to integers.

+
+ + + +
+

Implementation

+
Time.fromJson(Map json) :
+	hour = json ["hour"],
+	minutes = json ["minutes"];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/Time.html b/docs/data/Time/Time.html new file mode 100644 index 000000000..b4fcd89de --- /dev/null +++ b/docs/data/Time/Time.html @@ -0,0 +1,147 @@ + + + + + + + + Time constructor - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Time
+ +
+ +
+ + + + +
+
+ +

Time constructor + Null safety +

+ +
const + Time(
  1. int hour,
  2. +
  3. int minutes
  4. +
) +
+ + +
+

A const constructor.

+
+ + + +
+

Implementation

+
const Time(this.hour, this.minutes);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/hashCode.html b/docs/data/Time/hashCode.html new file mode 100644 index 000000000..e922e7f50 --- /dev/null +++ b/docs/data/Time/hashCode.html @@ -0,0 +1,179 @@ + + + + + + + + hashCode property - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+ +

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode + + +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
@override
+int get hashCode => toString().hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/hour.html b/docs/data/Time/hour.html new file mode 100644 index 000000000..09b1ae571 --- /dev/null +++ b/docs/data/Time/hour.html @@ -0,0 +1,148 @@ + + + + + + + + hour property - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hour
+ +
+ +
+ + + + +
+
+ +

hour property + Null safety +

+ +
+ int + hour +
final
+ +
+ +
+

The hour in 24-hour format.

+
+ + +
+

Implementation

+
final int hour;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/minutes.html b/docs/data/Time/minutes.html new file mode 100644 index 000000000..cee99d2af --- /dev/null +++ b/docs/data/Time/minutes.html @@ -0,0 +1,148 @@ + + + + + + + + minutes property - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
minutes
+ +
+ +
+ + + + +
+
+ +

minutes property + Null safety +

+ +
+ int + minutes +
final
+ +
+ +
+

The minutes.

+
+ + +
+

Implementation

+
final int minutes;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/noSuchMethod.html b/docs/data/Time/noSuchMethod.html new file mode 100644 index 000000000..d864a02af --- /dev/null +++ b/docs/data/Time/noSuchMethod.html @@ -0,0 +1,185 @@ + + + + + + + + noSuchMethod method - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/operator_equals.html b/docs/data/Time/operator_equals.html new file mode 100644 index 000000000..9fbe6b6f3 --- /dev/null +++ b/docs/data/Time/operator_equals.html @@ -0,0 +1,185 @@ + + + + + + + + operator == method - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+ +

operator == method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +bool +operator ==(
  1. dynamic other
  2. +
) + + + +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
@override
+bool operator == (dynamic other) => other.runtimeType == Time &&
+	other.hour == hour &&
+	other.minutes == minutes;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/operator_greater.html b/docs/data/Time/operator_greater.html new file mode 100644 index 000000000..fb34a8d22 --- /dev/null +++ b/docs/data/Time/operator_greater.html @@ -0,0 +1,152 @@ + + + + + + + + operator > method - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator >
+ +
+ +
+ + + + +
+
+ +

operator > method + Null safety +

+ +
+ + +bool +operator >(
  1. Time other
  2. +
) + + + +
+ +
+

Returns whether this Time is after another Time.

+
+ + + +
+

Implementation

+
bool operator > (Time other) => hour > other.hour ||
+	(hour == other.hour && minutes > other.minutes);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/operator_greater_equal.html b/docs/data/Time/operator_greater_equal.html new file mode 100644 index 000000000..d786f7cc3 --- /dev/null +++ b/docs/data/Time/operator_greater_equal.html @@ -0,0 +1,151 @@ + + + + + + + + operator >= method - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator >=
+ +
+ +
+ + + + +
+
+ +

operator >= method + Null safety +

+ +
+ + +bool +operator >=(
  1. Time other
  2. +
) + + + +
+ +
+

Returns whether this Time is at or after another Time.

+
+ + + +
+

Implementation

+
bool operator >= (Time other) => this > other || this == other;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/operator_less.html b/docs/data/Time/operator_less.html new file mode 100644 index 000000000..71bc549e1 --- /dev/null +++ b/docs/data/Time/operator_less.html @@ -0,0 +1,152 @@ + + + + + + + + operator < method - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator <
+ +
+ +
+ + + + +
+
+ +

operator < method + Null safety +

+ +
+ + +bool +operator <(
  1. Time other
  2. +
) + + + +
+ +
+

Returns whether this Time is before another Time.

+
+ + + +
+

Implementation

+
bool operator < (Time other) => hour < other.hour ||
+	(hour == other.hour && minutes < other.minutes);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/operator_less_equal.html b/docs/data/Time/operator_less_equal.html new file mode 100644 index 000000000..8505c418d --- /dev/null +++ b/docs/data/Time/operator_less_equal.html @@ -0,0 +1,151 @@ + + + + + + + + operator <= method - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator <=
+ +
+ +
+ + + + +
+
+ +

operator <= method + Null safety +

+ +
+ + +bool +operator <=(
  1. Time other
  2. +
) + + + +
+ +
+

Returns whether this Time is at or before another Time.

+
+ + + +
+

Implementation

+
bool operator <= (Time other) => this < other || this == other;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/runtimeType.html b/docs/data/Time/runtimeType.html new file mode 100644 index 000000000..630e51cf3 --- /dev/null +++ b/docs/data/Time/runtimeType.html @@ -0,0 +1,152 @@ + + + + + + + + runtimeType property - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/toJson.html b/docs/data/Time/toJson.html new file mode 100644 index 000000000..019452af2 --- /dev/null +++ b/docs/data/Time/toJson.html @@ -0,0 +1,153 @@ + + + + + + + + toJson method - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toJson
+ +
+ +
+ + + + +
+
+ +

toJson method + Null safety +

+ +
+ + +Map +toJson() + + + +
+ +
+

Returns this obect in JSON form

+
+ + + +
+

Implementation

+
Map toJson() => {
+	"hour": hour,
+	"minutes": minutes,
+};
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/Time/toString.html b/docs/data/Time/toString.html new file mode 100644 index 000000000..2f8d7cbbf --- /dev/null +++ b/docs/data/Time/toString.html @@ -0,0 +1,166 @@ + + + + + + + + toString method - Time class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+ +

toString method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +String +toString() + + + +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
@override
+String toString() =>
+	"${hour > 12 ? hour - 12 : hour}:${minutes.toString().padLeft(2, '0')}";
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User-class.html b/docs/data/User-class.html new file mode 100644 index 000000000..0ea9a2bc1 --- /dev/null +++ b/docs/data/User-class.html @@ -0,0 +1,412 @@ + + + + + + + + User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
User
+ +
+ +
+ + + + +
+
+ +

User class + Null safety + +

+ + +
+

Represents a user and all their data.

+

This objects includes data like the user's schedule, grade, list of clubs, +and more.

+
+ + +
+
+ + + + + +
Annotations
+
+
+
+ +
+

Constructors

+ +
+
+ User({required Map<String, List<PeriodData?>> schedule, required ContactInfo contactInfo, required List<String> registeredClubs, required Iterable<String> dayNames, Grade? grade, Advisory? advisory}) +
+
+ Creates a new user. +
const
+
+
+ User.fromJson(Map json) +
+
+ Creates a new user from JSON. +
+
+
+ +
+

Properties

+ +
+
+ advisory + Advisory? + +
+
+ The advisory for this user. +
final
+ +
+ +
+ contactInfo + → ContactInfo + +
+
+ This user's contact information. +
final
+ +
+ +
+ dayNames + → Iterable<String> + +
+
+ The possible day names for this user's schedule. [...] +
final
+ +
+ +
+ grade + Grade? + +
+
+ The grade this user is in. [...] +
final
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ registeredClubs + → List<String> + +
+
+ The IDs of the clubs this user attends. [...] +
final
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ schedule + → Map<String, List<PeriodData?>> + +
+
+ The user's schedule. [...] +
final
+ +
+ +
+ sectionIDs + → Set<String> + +
+
+ Gets the unique section IDs for the courses this user is enrolled in. [...] +
read-only
+ +
+ +
+
+ +
+

Methods

+
+
+ getPeriods(Day day) + → List<Period> + + + +
+
+ Computes the periods, in order, for a given day. [...] + + +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + +
+

Static Methods

+
+
+ safeJson(Map json, String key) + → dynamic + + + +
+
+ Gets a value from JSON, throwing if null. [...] + + +
+ +
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/User.fromJson.html b/docs/data/User/User.fromJson.html new file mode 100644 index 000000000..6e2fb5b37 --- /dev/null +++ b/docs/data/User/User.fromJson.html @@ -0,0 +1,161 @@ + + + + + + + + User.fromJson constructor - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
User.fromJson
+ +
+ +
+ + + + +
+
+ +

User.fromJson constructor + Null safety +

+ +
+ User.fromJson(
  1. Map json
  2. +
) +
+ + +
+

Creates a new user from JSON.

+
+ + + +
+

Implementation

+
User.fromJson(Map json) :
+	dayNames = List<String>.from(safeJson(json, "dayNames")),
+	schedule = {
+		for (final String dayName in safeJson(json, "dayNames"))
+			dayName: PeriodData.getList(json [dayName])
+	},
+	advisory = json ["advisory"] == null ? null : Advisory.fromJson(
+		Map.from(safeJson(json, "advisory"))
+	),
+	contactInfo = ContactInfo.fromJson(
+		Map.from(safeJson(json, "contactInfo"))
+	),
+	grade = json ["grade"] == null ? null : intToGrade [safeJson(json, "grade")],
+	registeredClubs = List<String>.from(json ["registeredClubs"] ?? []);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/User.html b/docs/data/User/User.html new file mode 100644 index 000000000..109389ebc --- /dev/null +++ b/docs/data/User/User.html @@ -0,0 +1,160 @@ + + + + + + + + User constructor - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
User
+ +
+ +
+ + + + +
+
+ +

User constructor + Null safety +

+ +
const + User(
  1. {required Map<String, List<PeriodData?>> schedule,
  2. +
  3. required ContactInfo contactInfo,
  4. +
  5. required List<String> registeredClubs,
  6. +
  7. required Iterable<String> dayNames,
  8. +
  9. Grade? grade,
  10. +
  11. Advisory? advisory}
  12. +
) +
+ + +
+

Creates a new user.

+
+ + + +
+

Implementation

+
const User({
+	required this.schedule,
+	required this.contactInfo,
+	required this.registeredClubs,
+	required this.dayNames,
+	this.grade,
+	this.advisory,
+});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/advisory.html b/docs/data/User/advisory.html new file mode 100644 index 000000000..1896982e6 --- /dev/null +++ b/docs/data/User/advisory.html @@ -0,0 +1,150 @@ + + + + + + + + advisory property - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
advisory
+ +
+ +
+ + + + +
+
+ +

advisory property + Null safety +

+ +
+ Advisory? + advisory +
final
+ +
+ +
+

The advisory for this user.

+
+ + +
+

Implementation

+
final Advisory? advisory;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/contactInfo.html b/docs/data/User/contactInfo.html new file mode 100644 index 000000000..80217f02c --- /dev/null +++ b/docs/data/User/contactInfo.html @@ -0,0 +1,150 @@ + + + + + + + + contactInfo property - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
contactInfo
+ +
+ +
+ + + + +
+
+ +

contactInfo property + Null safety +

+ +
+ ContactInfo + contactInfo +
final
+ +
+ +
+

This user's contact information.

+
+ + +
+

Implementation

+
final ContactInfo contactInfo;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/dayNames.html b/docs/data/User/dayNames.html new file mode 100644 index 000000000..255307098 --- /dev/null +++ b/docs/data/User/dayNames.html @@ -0,0 +1,151 @@ + + + + + + + + dayNames property - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
dayNames
+ +
+ +
+ + + + +
+
+ +

dayNames property + Null safety +

+ +
+ Iterable<String> + dayNames +
final
+ +
+ +
+

The possible day names for this user's schedule.

+

These will be used as the keys for schedule.

+
+ + +
+

Implementation

+
final Iterable<String> dayNames;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/getPeriods.html b/docs/data/User/getPeriods.html new file mode 100644 index 000000000..a12875cf9 --- /dev/null +++ b/docs/data/User/getPeriods.html @@ -0,0 +1,161 @@ + + + + + + + + getPeriods method - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getPeriods
+ +
+ +
+ + + + +
+
+ +

getPeriods method + Null safety +

+ +
+ + +List<Period> +getPeriods(
  1. Day day
  2. +
) + + + +
+ +
+

Computes the periods, in order, for a given day.

+

This method converts the PeriodDatas in schedule into Periods using +Day.schedule. PeriodData objects are specific to the user's schedule, +whereas the times of the day Ranges are specific to the calendar.

+
+ + + +
+

Implementation

+
List<Period> getPeriods(Day day) => [
+	for (final Period period in day.schedule.periods) period.copyWith(
+		int.tryParse(period.name) == null ? null
+			: schedule [day.name]! [int.parse(period.name) - 1]
+	)
+];
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/grade.html b/docs/data/User/grade.html new file mode 100644 index 000000000..787d17f9d --- /dev/null +++ b/docs/data/User/grade.html @@ -0,0 +1,151 @@ + + + + + + + + grade property - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
grade
+ +
+ +
+ + + + +
+
+ +

grade property + Null safety +

+ +
+ Grade? + grade +
final
+ +
+ +
+

The grade this user is in.

+

This property is null for faculty.

+
+ + +
+

Implementation

+
final Grade? grade;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/hashCode.html b/docs/data/User/hashCode.html new file mode 100644 index 000000000..ff57058cc --- /dev/null +++ b/docs/data/User/hashCode.html @@ -0,0 +1,179 @@ + + + + + + + + hashCode property - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/noSuchMethod.html b/docs/data/User/noSuchMethod.html new file mode 100644 index 000000000..b84ed60bd --- /dev/null +++ b/docs/data/User/noSuchMethod.html @@ -0,0 +1,187 @@ + + + + + + + + noSuchMethod method - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/operator_equals.html b/docs/data/User/operator_equals.html new file mode 100644 index 000000000..38807f1fe --- /dev/null +++ b/docs/data/User/operator_equals.html @@ -0,0 +1,178 @@ + + + + + + + + operator == method - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/registeredClubs.html b/docs/data/User/registeredClubs.html new file mode 100644 index 000000000..76622e36d --- /dev/null +++ b/docs/data/User/registeredClubs.html @@ -0,0 +1,151 @@ + + + + + + + + registeredClubs property - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
registeredClubs
+ +
+ +
+ + + + +
+
+ +

registeredClubs property + Null safety +

+ +
+ List<String> + registeredClubs +
final
+ +
+ +
+

The IDs of the clubs this user attends.

+

TODO: decide if this is relevant for captains.

+
+ + +
+

Implementation

+
final List<String> registeredClubs;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/runtimeType.html b/docs/data/User/runtimeType.html new file mode 100644 index 000000000..edd921803 --- /dev/null +++ b/docs/data/User/runtimeType.html @@ -0,0 +1,154 @@ + + + + + + + + runtimeType property - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/safeJson.html b/docs/data/User/safeJson.html new file mode 100644 index 000000000..33803a1e8 --- /dev/null +++ b/docs/data/User/safeJson.html @@ -0,0 +1,162 @@ + + + + + + + + safeJson method - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
safeJson
+ +
+ +
+ + + + +
+
+ +

safeJson method + Null safety +

+ +
+ + +dynamic +safeJson(
  1. Map json,
  2. +
  3. String key
  4. +
) + + + +
+ +
+

Gets a value from JSON, throwing if null.

+

This function is needed since null checks don't run on dynamic values.

+
+ + + +
+

Implementation

+
static dynamic safeJson(Map json, String key) {
+	final dynamic value = json [key];
+	if (value == null) {
+		throw ArgumentError.notNull(key);
+	} else {
+		return value;
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/schedule.html b/docs/data/User/schedule.html new file mode 100644 index 000000000..e511eb07e --- /dev/null +++ b/docs/data/User/schedule.html @@ -0,0 +1,154 @@ + + + + + + + + schedule property - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schedule
+ +
+ +
+ + + + +
+
+ +

schedule property + Null safety +

+ +
+ Map<String, List<PeriodData?>> + schedule +
final
+ +
+ +
+

The user's schedule.

+

Each key is a different day, and the values are list of periods in that
+day. Possible key values are defined by dayNames.

+

Periods may be null to indicate free periods (or, in the case of faculty, +periods where they don't teach).

+
+ + +
+

Implementation

+
final Map<String, List<PeriodData?>> schedule;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/sectionIDs.html b/docs/data/User/sectionIDs.html new file mode 100644 index 000000000..13f3fa47b --- /dev/null +++ b/docs/data/User/sectionIDs.html @@ -0,0 +1,161 @@ + + + + + + + + sectionIDs property - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
sectionIDs
+ +
+ +
+ + + + +
+
+ +

sectionIDs property + Null safety +

+ + + +
+ +
+ Set<String> + sectionIDs + + +
+ + +
+

Gets the unique section IDs for the courses this user is enrolled in.

+

For teachers, these will be the courses they teach.

+
+ + +
+

Implementation

+
Set<String> get sectionIDs => {
+	for (final List<PeriodData?> daySchedule in schedule.values)
+		for (final PeriodData? period in daySchedule)
+			if (period != null)
+				period.id
+};
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/User/toString.html b/docs/data/User/toString.html new file mode 100644 index 000000000..6cf83c704 --- /dev/null +++ b/docs/data/User/toString.html @@ -0,0 +1,160 @@ + + + + + + + + toString method - User class - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+

toString method + Null safety +

+ +
+ + +String +toString() + +
inherited
+ +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
external String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/activityTypeToString.html b/docs/data/activityTypeToString.html new file mode 100644 index 000000000..92f10a17c --- /dev/null +++ b/docs/data/activityTypeToString.html @@ -0,0 +1,172 @@ + + + + + + + + activityTypeToString function - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
activityTypeToString
+ +
+ +
+ + + + +
+
+ +

activityTypeToString function + Null safety + +

+ +
+ + +String +activityTypeToString(
  1. ActivityType type
  2. +
) + +
+ +
+

Maps ActivityType values to their string counterparts.

+
+ + + +
+

Implementation

+
String activityTypeToString(ActivityType type) {
+	switch (type) {
+		case ActivityType.advisory: return "advisory";
+		case ActivityType.room: return "room";
+		case ActivityType.grade: return "grade";
+		case ActivityType.misc: return "misc";
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/adminScopeToString.html b/docs/data/adminScopeToString.html new file mode 100644 index 000000000..2e62cdde4 --- /dev/null +++ b/docs/data/adminScopeToString.html @@ -0,0 +1,171 @@ + + + + + + + + adminScopeToString function - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
adminScopeToString
+ +
+ +
+ + + + +
+
+ +

adminScopeToString function + Null safety + +

+ +
+ + +String +adminScopeToString(
  1. AdminScope scope
  2. +
) + +
+ +
+

Maps AdminScopes to Strings.

+
+ + + +
+

Implementation

+
String adminScopeToString(AdminScope scope) {
+	switch (scope) {
+		case AdminScope.calendar: return "calendar";
+		case AdminScope.schedule: return "schedule";
+		case AdminScope.sports: return "sports";
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/data-library.html b/docs/data/data-library.html new file mode 100644 index 000000000..1a6848d0b --- /dev/null +++ b/docs/data/data-library.html @@ -0,0 +1,525 @@ + + + + + + + + data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
data
+ +
+ +
+ + + + +
+
+ +

data library + Null safety + +

+ + +
+

This library handles storing all the data in the app.

+

This library contains dataclasses to store and serialize data. +The dataclasses have logical properties and methods in order +to abstract business logic from the rest of the application.

+

In other words, any logic that separates this app from any +other app should be implemented in this library.

+
+ + +
+

Classes

+ +
+
+ Activity + +
+
+ An activity during a period. [...] +
+ +
+ Advisory + +
+
+ Bundles data relevant to advisory. [...] +
+ +
+ Club + +
+
+ +
+ +
+ Day + +
+
+ A day at Ramaz. [...] +
+ +
+ Feedback + +
+
+ Feedback from the user. +
+ +
+ GradeActivity + +
+
+ An activity for each grade. +
+ +
+ Message + +
+
+ +
+ +
+ Period + +
+
+ A representation of a period, including the time it takes place. [...] +
+ +
+ PeriodData + +
+
+ A representation of a period, independent of the time. [...] +
+ +
+ PeriodReminderTime + +
+
+ A ReminderTime that depends on a name and period. +
+ +
+ Range + +
+
+ A range of times. +
+ +
+ Reminder + +
+
+ A user-generated reminder. +
+ +
+ ReminderTime + +
+
+ A time that a reminder should show. +
+ +
+ Schedule + +
+
+ A description of the time allotment for a day. [...] +
+ +
+ Scores + +
+
+ The scores for a SportsGame. [...] +
+ +
+ SportsGame + +
+
+ A sports game. +
+ +
+ Subject + +
+
+ A subject, or class, that a student can take. [...] +
+ +
+ SubjectReminderTime + +
+
+ A ReminderTime that depends on a subject. +
+ +
+ Time + +
+
+ The hour and minute representation of a time. [...] +
+ +
+ User + +
+
+ Represents a user and all their data. [...] +
+ +
+
+ + + +
+

Constants

+ +
+
+ reminderTimeToString + → const Map<ReminderTimeType, String> + + +
+
+ Used to convert ReminderTimeType to JSON. + + +
+ {ReminderTimeType.period : "period", ReminderTimeType.subject : "subject"} +
+
+ +
+ stringToReminderTime + → const Map<String, ReminderTimeType> + + +
+
+ Used to convert JSON to ReminderTimeType. + + +
+ {"period" : ReminderTimeType.period, "subject" : ReminderTimeType.subject} +
+
+ +
+ stringToSport + → const Map<String, Sport> + + +
+
+ Converts Strings to Sport values. [...] + + +
+ {"baseball" : Sport.baseball, "basketball" : Sport.basketball, "hockey" : Sport.hockey, "tennis" : Sport.tennis, "volleyball" : Sport.volleyball, &quo… +
+
+ +
+
+ +
+

Properties

+ +
+
+ intToGrade + ↔ Map<int, Grade> + +
+
+ Maps grade numbers to a Grade type. +
read / write
+ +
+ +
+ sportToString + → Map<Sport, String> + +
+
+ Converts Sport values to Strings. [...] +
final
+ +
+ +
+
+ +
+

Functions

+ +
+
+ activityTypeToString(ActivityType type) + → String + + + +
+
+ Maps ActivityType values to their string counterparts. + + +
+ +
+ adminScopeToString(AdminScope scope) + → String + + + +
+
+ Maps AdminScopes to Strings. + + +
+ +
+ parseActivityType(String type) + ActivityType + + + +
+
+ Maps JSON string values to ActivityTypes. + + +
+ +
+ parseAdminScope(String scope) + AdminScope + + + +
+
+ Maps Strings to AdminScopes. + + +
+ +
+
+ +
+

Enums

+ +
+
+ ActivityType + +
+
+ A type of activity during the day. +
+ +
+ AdminScope + +
+
+ Scopes for administrative privileges. [...] +
+ +
+ Grade + +
+
+ What grade the user is in. [...] +
+ +
+ ReminderTimeType + +
+
+ An enum to decide when the reminder should appear. [...] +
+ +
+ Sport + +
+
+ All the different sports that can be played. +
+ +
+
+ + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/intToGrade.html b/docs/data/intToGrade.html new file mode 100644 index 000000000..9ba11b070 --- /dev/null +++ b/docs/data/intToGrade.html @@ -0,0 +1,168 @@ + + + + + + + + intToGrade property - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
intToGrade
+ +
+ +
+ + + + +
+
+ +

intToGrade top-level property + Null safety + +

+ +
+ Map<int, Grade> + intToGrade +
read / write
+ +
+ +
+

Maps grade numbers to a Grade type.

+
+ + +
+

Implementation

+
Map<int, Grade> intToGrade = {
+	9: Grade.freshman,
+	10: Grade.sophomore,
+	11: Grade.junior,
+	12: Grade.senior,
+};
+
+ + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/parseActivityType.html b/docs/data/parseActivityType.html new file mode 100644 index 000000000..bbd64224a --- /dev/null +++ b/docs/data/parseActivityType.html @@ -0,0 +1,173 @@ + + + + + + + + parseActivityType function - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
parseActivityType
+ +
+ +
+ + + + +
+
+ +

parseActivityType function + Null safety + +

+ +
+ + +ActivityType +parseActivityType(
  1. String type
  2. +
) + +
+ +
+

Maps JSON string values to ActivityTypes.

+
+ + + +
+

Implementation

+
ActivityType parseActivityType(String type) {
+	switch (type) {
+		case "advisory": return ActivityType.advisory;
+		case "room": return ActivityType.room;
+		case "grade": return ActivityType.grade;
+		case "misc": return ActivityType.misc;
+		default: throw ArgumentError("Invalid activity type: $type");
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/parseAdminScope.html b/docs/data/parseAdminScope.html new file mode 100644 index 000000000..2c5df24aa --- /dev/null +++ b/docs/data/parseAdminScope.html @@ -0,0 +1,172 @@ + + + + + + + + parseAdminScope function - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
parseAdminScope
+ +
+ +
+ + + + +
+
+ +

parseAdminScope function + Null safety + +

+ +
+ + +AdminScope +parseAdminScope(
  1. String scope
  2. +
) + +
+ +
+

Maps Strings to AdminScopes.

+
+ + + +
+

Implementation

+
AdminScope parseAdminScope(String scope) {
+	switch (scope) {
+		case "calendar": return AdminScope.calendar;
+		case "schedule": return AdminScope.schedule;
+		case "sports": return AdminScope.sports;
+		default: throw ArgumentError("Invalid admin scope: $scope");
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/reminderTimeToString-constant.html b/docs/data/reminderTimeToString-constant.html new file mode 100644 index 000000000..20e3e4c3a --- /dev/null +++ b/docs/data/reminderTimeToString-constant.html @@ -0,0 +1,166 @@ + + + + + + + + reminderTimeToString constant - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
reminderTimeToString
+ +
+ +
+ + + + +
+
+ +

reminderTimeToString top-level constant + Null safety + +

+ +
+ Map<ReminderTimeType, String> + const reminderTimeToString + + +
+ +
+

Used to convert ReminderTimeType to JSON.

+
+ + +
+

Implementation

+
const Map<ReminderTimeType, String> reminderTimeToString = {
+	ReminderTimeType.period: "period",
+	ReminderTimeType.subject: "subject",
+};
+
+ + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/sportToString.html b/docs/data/sportToString.html new file mode 100644 index 000000000..867498c9f --- /dev/null +++ b/docs/data/sportToString.html @@ -0,0 +1,168 @@ + + + + + + + + sportToString property - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
sportToString
+ +
+ +
+ + + + +
+
+ +

sportToString top-level property + Null safety + +

+ +
+ Map<Sport, String> + sportToString +
final
+ +
+ +
+

Converts Sport values to Strings.

+

Use this to convert to JSON, since they can only use Strings.

+
+ + +
+

Implementation

+
final Map<Sport, String> sportToString = Map.fromEntries(
+	stringToSport.entries.map(
+		(MapEntry<String, Sport> entry) => MapEntry(entry.value, entry.key)
+	)
+);
+
+ + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/stringToReminderTime-constant.html b/docs/data/stringToReminderTime-constant.html new file mode 100644 index 000000000..891d04910 --- /dev/null +++ b/docs/data/stringToReminderTime-constant.html @@ -0,0 +1,166 @@ + + + + + + + + stringToReminderTime constant - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
stringToReminderTime
+ +
+ +
+ + + + +
+
+ +

stringToReminderTime top-level constant + Null safety + +

+ +
+ Map<String, ReminderTimeType> + const stringToReminderTime + + +
+ +
+

Used to convert JSON to ReminderTimeType.

+
+ + +
+

Implementation

+
const Map<String, ReminderTimeType> stringToReminderTime = {
+	"period": ReminderTimeType.period,
+	"subject": ReminderTimeType.subject,
+};
+
+ + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/data/stringToSport-constant.html b/docs/data/stringToSport-constant.html new file mode 100644 index 000000000..842dc8b0a --- /dev/null +++ b/docs/data/stringToSport-constant.html @@ -0,0 +1,171 @@ + + + + + + + + stringToSport constant - data library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
stringToSport
+ +
+ +
+ + + + +
+
+ +

stringToSport top-level constant + Null safety + +

+ +
+ Map<String, Sport> + const stringToSport + + +
+ +
+

Converts Strings to Sport values.

+

Use this on JSON values, since they can only use Strings.

+
+ + +
+

Implementation

+
const Map<String, Sport> stringToSport = {
+	"baseball": Sport.baseball,
+	"basketball": Sport.basketball,
+	"hockey": Sport.hockey,
+	"tennis": Sport.tennis,
+	"volleyball": Sport.volleyball,
+	"soccer": Sport.soccer,
+};
+
+ + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/generated_plugin_registrant/generated_plugin_registrant-library.html b/docs/generated_plugin_registrant/generated_plugin_registrant-library.html new file mode 100644 index 000000000..ef9fee752 --- /dev/null +++ b/docs/generated_plugin_registrant/generated_plugin_registrant-library.html @@ -0,0 +1,150 @@ + + + + + + + + generated_plugin_registrant library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
generated_plugin_registrant
+ +
+ +
+ + + + +
+
+ +

generated_plugin_registrant library + Null safety + +

+ + + + + + + + + +
+

Functions

+ +
+
+ registerPlugins(Registrar registrar) + → void + + + +
+
+ + + +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/generated_plugin_registrant/registerPlugins.html b/docs/generated_plugin_registrant/registerPlugins.html new file mode 100644 index 000000000..984067196 --- /dev/null +++ b/docs/generated_plugin_registrant/registerPlugins.html @@ -0,0 +1,134 @@ + + + + + + + + registerPlugins function - generated_plugin_registrant library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
registerPlugins
+ +
+ +
+ + + + +
+
+ +

registerPlugins function + Null safety + +

+ +
+ + +void +registerPlugins(
  1. Registrar registrar
  2. +
) + +
+ + + + +
+

Implementation

+
void registerPlugins(Registrar registrar) {
+  FirebaseFirestoreWeb.registerWith(registrar);
+  FirebaseAuthWeb.registerWith(registrar);
+  FirebaseCoreWeb.registerWith(registrar);
+  FirebaseMessagingWeb.registerWith(registrar);
+  GoogleSignInPlugin.registerWith(registrar);
+  SharedPreferencesPlugin.registerWith(registrar);
+  UrlLauncherPlugin.registerWith(registrar);
+  registrar.registerMessageHandler();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..bbf6408ae --- /dev/null +++ b/docs/index.html @@ -0,0 +1,271 @@ + + + + + + + + + ramaz - Dart API docs + + + + + + + + + + + + + + + + +
+ +
+ + +
ramaz
+ +
+ +
+ + + + +
+ +
+

Ramaz Student Life

+

This is an app to help Ramaz students navigate their student life. +It tells you what classes you have when, the latest sports news, lost and found information, and more.

+

Complete list of features:

+
    +
  • +

    Ramaz login

    You can login with your Ramaz email to get your schedule sent directly to the app!
  • +
  • +

    Schedule explorer

    A complete schedule built-in to your phone. It can tell you what you have now, later, or you can specify a letter and schedule (eg, Rosh Chodesh) to explore your schedule.
  • +
  • +

    Notes

    You can now schedule reminders for individual classes or periods, such as every B-4 or a reminder to bring your textbook to history class.
  • +
+

Your feedback is appreciated

+

We want to hear what you have to say, so please use the "Send Feedback" button in the app to tell us what you do -- or don't -- like, and we'll work on it.

+

Contributing

+

This repo is to be modified only by the Ramaz Coding Club. It follows a simple yet sophisticated structure, in addition to the standard Flutter folders. Here is a rundown of everything you need to know:

+
    +
  • +

    The android folder:

    +

    This folder contains Android-specific implementation details. The only notable files in it are the gradle configurations: gradle.properties, build.gradle, and app\build.gradle (which have been changed to configured Firebase). An adjustment was made to gradle\wrapper\gradle-wrapper.properties to upgrade to the latest version of Gradle. Android-specific assets are stored under app\src\main\res, and modifications have been made to AndroidManifest.xml accordingly.

    +
  • +
  • +

    The data folder:

    +

    This folder is not meant to be public. It is basically a collection of .csv versions of the Ramaz database. The naming convention here is simple: make everything lowercase, remove RG_, and make abbreviations into the full word. For example, RG_SECT_SCHED should be saved as data\section_schedule.csv. This is essential for the data processing (in the firebase folder) to work. Also included is the calendar.csv file needed for calendar parsing.

    +
  • +
  • +

    The doc folder:

    +

    OK, so this folder is also absent from GitHub. But it's super simple to generate. Just run dartdoc in this repo and the full documentation will be saved here.

    +
  • +
  • +

    The firebase folder:

    +

    This folder contains scripts whose sole purpose is to configure Google Firebase. This basically means configuring the database and authentication services based on data from the Ramaz database. It contains two more folders, data and database whose jobs are to handle data modeling and database configuration, respectively. Another notable file here is auth.py, which manages the FirebaseAuth API.

    +
  • +
  • +

    The images folder:

    +

    This folder contains image assets for the project. They are imported in the pubspec.yaml file. There are two child folders:

    +
      +
    • +

      The icons folder:

      +

      This folder contains basic icons used throughout the app

      +
    • +
    • +

      The logos folder:

      +

      This folder contains logos used for various services throughout the app. Note that despite the use of this iconography, excluding Ramaz, we do not claim any ownership whatsoever of these brands. The ramaz folder contains Ramaz-specific branding.

      +
    • +
    +
  • +
  • +

    The ios folder:

    +

    This folder contains iOS-specific modifications, including Firebase configuration and asset bundling.

    +
  • +
  • +

    The lib folder:

    +

    This is, where the main Dart code lies. This will be discussed in detail next section.

    +
  • +
+ +

Inside lib\, there are five libraries, each of which define a different part of the structure of the app. Each library two sections -- a folder under lib\src, containing all the code, and a file under lib\, which declares the library (sort of like a header file).

+
    +
  • +

    The data library:

    +

    This library contains data models for everything in the app, separated into files by topic. Here, all the business logic is implemented either as complex factories or methods.

    +
  • +
  • +

    The services library:

    +

    This library contains abstractions over many different APIs (data sources), separated into files by API.

    +
  • +
  • +

    The services_collection library:

    +

    This library contains logic for initializing the services. It can act as a wrapper around all the services, so function and constructor signatures can remain the same even after services are added or removed.

    +
  • +
  • +

    The models library:

    +

    This library contains two types of models:

    +
      +
    1. Data models. Data models control the state of the data across the lifespan of the app. The user profile is a good example of a data model, since it needs to be accessible to all code.
    2. +
    3. View models. view models control the state of data in an element of UI, such as a page. View models can interact with data models to get their data, and should generally have a field for every label, and a method for every input action in the UI.
    4. +
    +
  • +
  • +

    The widgets library:

    +

    This folder contains UI elements ("widgets") that are independent enough from the rest of the screen to be able to be imported and used reliably anywhere in the app (even if they in reality aren't). There are a few categories of widgets:

    +
      +
    1. Ambient widgets are widgets that are exposed to the whole app (usually via InheritedWidgets).
    2. +
    3. Atomic widgets are widgets that represent individual pieces of data. They should be used throughout the app exclusively to represent those data types.
    4. +
    5. Generic widgets are miscellaneous widgets that help compose the UI.
    6. +
    7. Other helper widgets to display images and iconography throughout the UI.
    8. +
    +
  • +
  • +

    The pages library:

    +

    This library contains all the screens of the app, separated into files. These files may import data templates (from data), APIs (from services), page states (from models), or other UI elements (from widgets).

    +
  • +
+

Running the app:

+

To run the app, make sure you have Flutter installed, and run these commands: +

		git clone https://github.com/Levi-Lesches/Ramaz-Student-Life.git
+		cd ramaz
+	

+

To be able to run and debug the app, run flutter run. To simply download it, run flutter build apk or flutter build ios, plug in your phone and run flutter install.

+
+ + +
+

Libraries

+
+
+ app + +
+
+
+ +
+ constants + +
+
+
+ +
+ data + +
+
This library handles storing all the data in the app. [...] +
+ +
+ generated_plugin_registrant + +
+
+
+ +
+ main + +
+
+
+ +
+ models + +
+
An abstraction over data handling. [...] +
+ +
+ pages + +
+
+
+ +
+ ramaz_services + +
+
An abstraction over device services and data sources. [...] +
+ +
+ widgets + +
+
A collection of widgets to use. [...] +
+ +
+
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/index.json b/docs/index.json new file mode 100644 index 000000000..3aad33884 --- /dev/null +++ b/docs/index.json @@ -0,0 +1 @@ +[{"name":"app","qualifiedName":"app","href":"app/app-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"RamLife","qualifiedName":"app.RamLife","href":"app/RamLife-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"app","type":"library"}},{"name":"RamLife","qualifiedName":"app.RamLife.RamLife","href":"app/RamLife/RamLife.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamLife","type":"class"}},{"name":"build","qualifiedName":"app.RamLife.build","href":"app/RamLife/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"RamLife","type":"class"}},{"name":"hasAdminScope","qualifiedName":"app.RamLife.hasAdminScope","href":"app/RamLife/hasAdminScope.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamLife","type":"class"}},{"name":"routes","qualifiedName":"app.RamLife.routes","href":"app/RamLife/routes.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamLife","type":"class"}},{"name":"constants","qualifiedName":"constants","href":"constants/constants-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"DayComparison","qualifiedName":"constants.DayComparison","href":"constants/DayComparison.html","type":"extension","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"isSameDay","qualifiedName":"constants.DayComparison.isSameDay","href":"constants/DayComparison/isSameDay.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayComparison","type":"extension"}},{"name":"RamazColors","qualifiedName":"constants.RamazColors","href":"constants/RamazColors-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"operator ==","qualifiedName":"constants.RamazColors.==","href":"constants/RamazColors/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"RamazColors","qualifiedName":"constants.RamazColors.RamazColors","href":"constants/RamazColors/RamazColors.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"blue","qualifiedName":"constants.RamazColors.blue","href":"constants/RamazColors/blue-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"blueDark","qualifiedName":"constants.RamazColors.blueDark","href":"constants/RamazColors/blueDark-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"blueLight","qualifiedName":"constants.RamazColors.blueLight","href":"constants/RamazColors/blueLight-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"gold","qualifiedName":"constants.RamazColors.gold","href":"constants/RamazColors/gold-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"goldDark","qualifiedName":"constants.RamazColors.goldDark","href":"constants/RamazColors/goldDark-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"goldLight","qualifiedName":"constants.RamazColors.goldLight","href":"constants/RamazColors/goldLight-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"hashCode","qualifiedName":"constants.RamazColors.hashCode","href":"constants/RamazColors/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"noSuchMethod","qualifiedName":"constants.RamazColors.noSuchMethod","href":"constants/RamazColors/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"runtimeType","qualifiedName":"constants.RamazColors.runtimeType","href":"constants/RamazColors/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"toString","qualifiedName":"constants.RamazColors.toString","href":"constants/RamazColors/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"TimeConverter","qualifiedName":"constants.TimeConverter","href":"constants/TimeConverter.html","type":"extension","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"asTime","qualifiedName":"constants.TimeConverter.asTime","href":"constants/TimeConverter/asTime.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"TimeConverter","type":"extension"}},{"name":"TimeOfDayConverter","qualifiedName":"constants.TimeOfDayConverter","href":"constants/TimeOfDayConverter.html","type":"extension","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"asTimeOfDay","qualifiedName":"constants.TimeOfDayConverter.asTimeOfDay","href":"constants/TimeOfDayConverter/asTimeOfDay.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"TimeOfDayConverter","type":"extension"}},{"name":"Times","qualifiedName":"constants.Times","href":"constants/Times-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"operator ==","qualifiedName":"constants.Times.==","href":"constants/Times/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"Times","qualifiedName":"constants.Times.Times","href":"constants/Times/Times.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"hashCode","qualifiedName":"constants.Times.hashCode","href":"constants/Times/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"noSuchMethod","qualifiedName":"constants.Times.noSuchMethod","href":"constants/Times/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"runtimeType","qualifiedName":"constants.Times.runtimeType","href":"constants/Times/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"schoolEnd","qualifiedName":"constants.Times.schoolEnd","href":"constants/Times/schoolEnd-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"schoolStart","qualifiedName":"constants.Times.schoolStart","href":"constants/Times/schoolStart-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"toString","qualifiedName":"constants.Times.toString","href":"constants/Times/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"winterFridayDayEnd","qualifiedName":"constants.Times.winterFridayDayEnd","href":"constants/Times/winterFridayDayEnd-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"winterFridayDayStart","qualifiedName":"constants.Times.winterFridayDayStart","href":"constants/Times/winterFridayDayStart-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"winterFridayMonthEnd","qualifiedName":"constants.Times.winterFridayMonthEnd","href":"constants/Times/winterFridayMonthEnd-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"winterFridayMonthStart","qualifiedName":"constants.Times.winterFridayMonthStart","href":"constants/Times/winterFridayMonthStart-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"Urls","qualifiedName":"constants.Urls","href":"constants/Urls-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"operator ==","qualifiedName":"constants.Urls.==","href":"constants/Urls/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"Urls","qualifiedName":"constants.Urls.Urls","href":"constants/Urls/Urls.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"email","qualifiedName":"constants.Urls.email","href":"constants/Urls/email-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"googleDrive","qualifiedName":"constants.Urls.googleDrive","href":"constants/Urls/googleDrive-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"hashCode","qualifiedName":"constants.Urls.hashCode","href":"constants/Urls/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"noSuchMethod","qualifiedName":"constants.Urls.noSuchMethod","href":"constants/Urls/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"ramaz","qualifiedName":"constants.Urls.ramaz","href":"constants/Urls/ramaz-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"runtimeType","qualifiedName":"constants.Urls.runtimeType","href":"constants/Urls/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"schoology","qualifiedName":"constants.Urls.schoology","href":"constants/Urls/schoology-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"seniorSystems","qualifiedName":"constants.Urls.seniorSystems","href":"constants/Urls/seniorSystems-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"sportsLivestream","qualifiedName":"constants.Urls.sportsLivestream","href":"constants/Urls/sportsLivestream-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"toString","qualifiedName":"constants.Urls.toString","href":"constants/Urls/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"data","qualifiedName":"data","href":"data/data-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"Activity","qualifiedName":"data.Activity","href":"data/Activity-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Activity.==","href":"data/Activity/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"Activity","qualifiedName":"data.Activity.Activity","href":"data/Activity/Activity.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"Activity.fromJson","qualifiedName":"data.Activity.fromJson","href":"data/Activity/Activity.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"getActivities","qualifiedName":"data.Activity.getActivities","href":"data/Activity/getActivities.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"Activity.grade","qualifiedName":"data.Activity.grade","href":"data/Activity/Activity.grade.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"hashCode","qualifiedName":"data.Activity.hashCode","href":"data/Activity/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"message","qualifiedName":"data.Activity.message","href":"data/Activity/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Activity.noSuchMethod","href":"data/Activity/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Activity.runtimeType","href":"data/Activity/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"toJson","qualifiedName":"data.Activity.toJson","href":"data/Activity/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"toString","qualifiedName":"data.Activity.toString","href":"data/Activity/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"type","qualifiedName":"data.Activity.type","href":"data/Activity/type.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"ActivityType","qualifiedName":"data.ActivityType","href":"data/ActivityType-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.ActivityType.==","href":"data/ActivityType/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityType","type":"enum"}},{"name":"hashCode","qualifiedName":"data.ActivityType.hashCode","href":"data/ActivityType/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityType","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"data.ActivityType.noSuchMethod","href":"data/ActivityType/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityType","type":"enum"}},{"name":"runtimeType","qualifiedName":"data.ActivityType.runtimeType","href":"data/ActivityType/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityType","type":"enum"}},{"name":"toString","qualifiedName":"data.ActivityType.toString","href":"data/ActivityType/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ActivityType","type":"enum"}},{"name":"AdminScope","qualifiedName":"data.AdminScope","href":"data/AdminScope-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.AdminScope.==","href":"data/AdminScope/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScope","type":"enum"}},{"name":"hashCode","qualifiedName":"data.AdminScope.hashCode","href":"data/AdminScope/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScope","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"data.AdminScope.noSuchMethod","href":"data/AdminScope/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScope","type":"enum"}},{"name":"runtimeType","qualifiedName":"data.AdminScope.runtimeType","href":"data/AdminScope/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScope","type":"enum"}},{"name":"toString","qualifiedName":"data.AdminScope.toString","href":"data/AdminScope/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminScope","type":"enum"}},{"name":"Advisory","qualifiedName":"data.Advisory","href":"data/Advisory-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Advisory.==","href":"data/Advisory/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"Advisory","qualifiedName":"data.Advisory.Advisory","href":"data/Advisory/Advisory.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"Advisory.fromJson","qualifiedName":"data.Advisory.fromJson","href":"data/Advisory/Advisory.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"hashCode","qualifiedName":"data.Advisory.hashCode","href":"data/Advisory/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"id","qualifiedName":"data.Advisory.id","href":"data/Advisory/id.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Advisory.noSuchMethod","href":"data/Advisory/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"room","qualifiedName":"data.Advisory.room","href":"data/Advisory/room.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Advisory.runtimeType","href":"data/Advisory/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"toString","qualifiedName":"data.Advisory.toString","href":"data/Advisory/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"Club","qualifiedName":"data.Club","href":"data/Club-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Club.==","href":"data/Club/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"Club","qualifiedName":"data.Club.Club","href":"data/Club/Club.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"attendance","qualifiedName":"data.Club.attendance","href":"data/Club/attendance.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"captains","qualifiedName":"data.Club.captains","href":"data/Club/captains.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"description","qualifiedName":"data.Club.description","href":"data/Club/description.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"facultyAdvisor","qualifiedName":"data.Club.facultyAdvisor","href":"data/Club/facultyAdvisor.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"formUrl","qualifiedName":"data.Club.formUrl","href":"data/Club/formUrl.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"hashCode","qualifiedName":"data.Club.hashCode","href":"data/Club/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"image","qualifiedName":"data.Club.image","href":"data/Club/image.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"members","qualifiedName":"data.Club.members","href":"data/Club/members.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"messages","qualifiedName":"data.Club.messages","href":"data/Club/messages.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"name","qualifiedName":"data.Club.name","href":"data/Club/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Club.noSuchMethod","href":"data/Club/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"phoneNumberRequested","qualifiedName":"data.Club.phoneNumberRequested","href":"data/Club/phoneNumberRequested.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Club.runtimeType","href":"data/Club/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"shortDescription","qualifiedName":"data.Club.shortDescription","href":"data/Club/shortDescription.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"toString","qualifiedName":"data.Club.toString","href":"data/Club/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"Day","qualifiedName":"data.Day","href":"data/Day-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Day.==","href":"data/Day/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"Day","qualifiedName":"data.Day.Day","href":"data/Day/Day.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"displayName","qualifiedName":"data.Day.displayName","href":"data/Day/displayName.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"Day.fromJson","qualifiedName":"data.Day.fromJson","href":"data/Day/Day.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"getCalendar","qualifiedName":"data.Day.getCalendar","href":"data/Day/getCalendar.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"getCurrentPeriod","qualifiedName":"data.Day.getCurrentPeriod","href":"data/Day/getCurrentPeriod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"getDate","qualifiedName":"data.Day.getDate","href":"data/Day/getDate.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"hashCode","qualifiedName":"data.Day.hashCode","href":"data/Day/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"n","qualifiedName":"data.Day.n","href":"data/Day/n.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"name","qualifiedName":"data.Day.name","href":"data/Day/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Day.noSuchMethod","href":"data/Day/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Day.runtimeType","href":"data/Day/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"schedule","qualifiedName":"data.Day.schedule","href":"data/Day/schedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"toJson","qualifiedName":"data.Day.toJson","href":"data/Day/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"toString","qualifiedName":"data.Day.toString","href":"data/Day/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"Feedback","qualifiedName":"data.Feedback","href":"data/Feedback-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Feedback.==","href":"data/Feedback/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"Feedback","qualifiedName":"data.Feedback.Feedback","href":"data/Feedback/Feedback.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"anonymous","qualifiedName":"data.Feedback.anonymous","href":"data/Feedback/anonymous.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"email","qualifiedName":"data.Feedback.email","href":"data/Feedback/email.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"hashCode","qualifiedName":"data.Feedback.hashCode","href":"data/Feedback/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"message","qualifiedName":"data.Feedback.message","href":"data/Feedback/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"name","qualifiedName":"data.Feedback.name","href":"data/Feedback/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Feedback.noSuchMethod","href":"data/Feedback/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Feedback.runtimeType","href":"data/Feedback/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"timestamp","qualifiedName":"data.Feedback.timestamp","href":"data/Feedback/timestamp.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"toJson","qualifiedName":"data.Feedback.toJson","href":"data/Feedback/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"toString","qualifiedName":"data.Feedback.toString","href":"data/Feedback/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"Grade","qualifiedName":"data.Grade","href":"data/Grade-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Grade.==","href":"data/Grade/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Grade","type":"enum"}},{"name":"hashCode","qualifiedName":"data.Grade.hashCode","href":"data/Grade/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Grade","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"data.Grade.noSuchMethod","href":"data/Grade/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Grade","type":"enum"}},{"name":"runtimeType","qualifiedName":"data.Grade.runtimeType","href":"data/Grade/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Grade","type":"enum"}},{"name":"toString","qualifiedName":"data.Grade.toString","href":"data/Grade/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Grade","type":"enum"}},{"name":"GradeActivity","qualifiedName":"data.GradeActivity","href":"data/GradeActivity-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.GradeActivity.==","href":"data/GradeActivity/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"GradeActivity","qualifiedName":"data.GradeActivity.GradeActivity","href":"data/GradeActivity/GradeActivity.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"freshmen","qualifiedName":"data.GradeActivity.freshmen","href":"data/GradeActivity/freshmen.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"GradeActivity.fromJson","qualifiedName":"data.GradeActivity.fromJson","href":"data/GradeActivity/GradeActivity.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"hashCode","qualifiedName":"data.GradeActivity.hashCode","href":"data/GradeActivity/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"juniors","qualifiedName":"data.GradeActivity.juniors","href":"data/GradeActivity/juniors.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.GradeActivity.noSuchMethod","href":"data/GradeActivity/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"runtimeType","qualifiedName":"data.GradeActivity.runtimeType","href":"data/GradeActivity/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"seniors","qualifiedName":"data.GradeActivity.seniors","href":"data/GradeActivity/seniors.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"sophomores","qualifiedName":"data.GradeActivity.sophomores","href":"data/GradeActivity/sophomores.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"toString","qualifiedName":"data.GradeActivity.toString","href":"data/GradeActivity/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"Message","qualifiedName":"data.Message","href":"data/Message-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Message.==","href":"data/Message/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"Message","qualifiedName":"data.Message.Message","href":"data/Message/Message.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"body","qualifiedName":"data.Message.body","href":"data/Message/body.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"hashCode","qualifiedName":"data.Message.hashCode","href":"data/Message/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Message.noSuchMethod","href":"data/Message/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Message.runtimeType","href":"data/Message/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"sender","qualifiedName":"data.Message.sender","href":"data/Message/sender.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"timestamp","qualifiedName":"data.Message.timestamp","href":"data/Message/timestamp.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"toString","qualifiedName":"data.Message.toString","href":"data/Message/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"Period","qualifiedName":"data.Period","href":"data/Period-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Period.==","href":"data/Period/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"Period","qualifiedName":"data.Period.Period","href":"data/Period/Period.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"activity","qualifiedName":"data.Period.activity","href":"data/Period/activity.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"copyWith","qualifiedName":"data.Period.copyWith","href":"data/Period/copyWith.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"data","qualifiedName":"data.Period.data","href":"data/Period/data.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"Period.fromJson","qualifiedName":"data.Period.fromJson","href":"data/Period/Period.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"getInfo","qualifiedName":"data.Period.getInfo","href":"data/Period/getInfo.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"getName","qualifiedName":"data.Period.getName","href":"data/Period/getName.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"hashCode","qualifiedName":"data.Period.hashCode","href":"data/Period/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"id","qualifiedName":"data.Period.id","href":"data/Period/id.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"isFree","qualifiedName":"data.Period.isFree","href":"data/Period/isFree.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"name","qualifiedName":"data.Period.name","href":"data/Period/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Period.noSuchMethod","href":"data/Period/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"Period.raw","qualifiedName":"data.Period.raw","href":"data/Period/Period.raw.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Period.runtimeType","href":"data/Period/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"time","qualifiedName":"data.Period.time","href":"data/Period/time.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"toJson","qualifiedName":"data.Period.toJson","href":"data/Period/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"toString","qualifiedName":"data.Period.toString","href":"data/Period/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"PeriodData","qualifiedName":"data.PeriodData","href":"data/PeriodData-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.PeriodData.==","href":"data/PeriodData/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"PeriodData","qualifiedName":"data.PeriodData.PeriodData","href":"data/PeriodData/PeriodData.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"PeriodData.fromJson","qualifiedName":"data.PeriodData.fromJson","href":"data/PeriodData/PeriodData.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"getList","qualifiedName":"data.PeriodData.getList","href":"data/PeriodData/getList.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"hashCode","qualifiedName":"data.PeriodData.hashCode","href":"data/PeriodData/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"id","qualifiedName":"data.PeriodData.id","href":"data/PeriodData/id.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.PeriodData.noSuchMethod","href":"data/PeriodData/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"room","qualifiedName":"data.PeriodData.room","href":"data/PeriodData/room.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"runtimeType","qualifiedName":"data.PeriodData.runtimeType","href":"data/PeriodData/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"toString","qualifiedName":"data.PeriodData.toString","href":"data/PeriodData/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"PeriodReminderTime","qualifiedName":"data.PeriodReminderTime","href":"data/PeriodReminderTime-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"PeriodReminderTime","qualifiedName":"data.PeriodReminderTime.PeriodReminderTime","href":"data/PeriodReminderTime/PeriodReminderTime.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"dayName","qualifiedName":"data.PeriodReminderTime.dayName","href":"data/PeriodReminderTime/dayName.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"doesApply","qualifiedName":"data.PeriodReminderTime.doesApply","href":"data/PeriodReminderTime/doesApply.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"PeriodReminderTime.fromJson","qualifiedName":"data.PeriodReminderTime.fromJson","href":"data/PeriodReminderTime/PeriodReminderTime.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"hash","qualifiedName":"data.PeriodReminderTime.hash","href":"data/PeriodReminderTime/hash.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"period","qualifiedName":"data.PeriodReminderTime.period","href":"data/PeriodReminderTime/period.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"toJson","qualifiedName":"data.PeriodReminderTime.toJson","href":"data/PeriodReminderTime/toJson.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"toString","qualifiedName":"data.PeriodReminderTime.toString","href":"data/PeriodReminderTime/toString.html","type":"method","overriddenDepth":2,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"Range","qualifiedName":"data.Range","href":"data/Range-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator <","qualifiedName":"data.Range.<","href":"data/Range/operator_less.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"operator ==","qualifiedName":"data.Range.==","href":"data/Range/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"operator >","qualifiedName":"data.Range.>","href":"data/Range/operator_greater.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"Range","qualifiedName":"data.Range.Range","href":"data/Range/Range.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"contains","qualifiedName":"data.Range.contains","href":"data/Range/contains.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"end","qualifiedName":"data.Range.end","href":"data/Range/end.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"Range.fromJson","qualifiedName":"data.Range.fromJson","href":"data/Range/Range.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"hashCode","qualifiedName":"data.Range.hashCode","href":"data/Range/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Range.noSuchMethod","href":"data/Range/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"Range.nums","qualifiedName":"data.Range.nums","href":"data/Range/Range.nums.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Range.runtimeType","href":"data/Range/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"start","qualifiedName":"data.Range.start","href":"data/Range/start.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"toJson","qualifiedName":"data.Range.toJson","href":"data/Range/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"toString","qualifiedName":"data.Range.toString","href":"data/Range/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"Reminder","qualifiedName":"data.Reminder","href":"data/Reminder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Reminder.==","href":"data/Reminder/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"Reminder","qualifiedName":"data.Reminder.Reminder","href":"data/Reminder/Reminder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"Reminder.fromJson","qualifiedName":"data.Reminder.fromJson","href":"data/Reminder/Reminder.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"fromList","qualifiedName":"data.Reminder.fromList","href":"data/Reminder/fromList.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"getReminders","qualifiedName":"data.Reminder.getReminders","href":"data/Reminder/getReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"hash","qualifiedName":"data.Reminder.hash","href":"data/Reminder/hash.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"hashCode","qualifiedName":"data.Reminder.hashCode","href":"data/Reminder/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"message","qualifiedName":"data.Reminder.message","href":"data/Reminder/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Reminder.noSuchMethod","href":"data/Reminder/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Reminder.runtimeType","href":"data/Reminder/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"time","qualifiedName":"data.Reminder.time","href":"data/Reminder/time.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"toJson","qualifiedName":"data.Reminder.toJson","href":"data/Reminder/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"toString","qualifiedName":"data.Reminder.toString","href":"data/Reminder/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"ReminderTime","qualifiedName":"data.ReminderTime","href":"data/ReminderTime-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.ReminderTime.==","href":"data/ReminderTime/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"ReminderTime","qualifiedName":"data.ReminderTime.ReminderTime","href":"data/ReminderTime/ReminderTime.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"doesApply","qualifiedName":"data.ReminderTime.doesApply","href":"data/ReminderTime/doesApply.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"ReminderTime.fromJson","qualifiedName":"data.ReminderTime.fromJson","href":"data/ReminderTime/ReminderTime.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"ReminderTime.fromType","qualifiedName":"data.ReminderTime.fromType","href":"data/ReminderTime/ReminderTime.fromType.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"hash","qualifiedName":"data.ReminderTime.hash","href":"data/ReminderTime/hash.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"hashCode","qualifiedName":"data.ReminderTime.hashCode","href":"data/ReminderTime/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.ReminderTime.noSuchMethod","href":"data/ReminderTime/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"repeats","qualifiedName":"data.ReminderTime.repeats","href":"data/ReminderTime/repeats.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"runtimeType","qualifiedName":"data.ReminderTime.runtimeType","href":"data/ReminderTime/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"toJson","qualifiedName":"data.ReminderTime.toJson","href":"data/ReminderTime/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"toString","qualifiedName":"data.ReminderTime.toString","href":"data/ReminderTime/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"type","qualifiedName":"data.ReminderTime.type","href":"data/ReminderTime/type.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"ReminderTimeType","qualifiedName":"data.ReminderTimeType","href":"data/ReminderTimeType-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.ReminderTimeType.==","href":"data/ReminderTimeType/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTimeType","type":"enum"}},{"name":"hashCode","qualifiedName":"data.ReminderTimeType.hashCode","href":"data/ReminderTimeType/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTimeType","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"data.ReminderTimeType.noSuchMethod","href":"data/ReminderTimeType/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTimeType","type":"enum"}},{"name":"runtimeType","qualifiedName":"data.ReminderTimeType.runtimeType","href":"data/ReminderTimeType/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTimeType","type":"enum"}},{"name":"toString","qualifiedName":"data.ReminderTimeType.toString","href":"data/ReminderTimeType/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderTimeType","type":"enum"}},{"name":"Schedule","qualifiedName":"data.Schedule","href":"data/Schedule-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Schedule.==","href":"data/Schedule/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"Schedule","qualifiedName":"data.Schedule.Schedule","href":"data/Schedule/Schedule.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"amAssembly","qualifiedName":"data.Schedule.amAssembly","href":"data/Schedule/amAssembly-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"covid","qualifiedName":"data.Schedule.covid","href":"data/Schedule/covid-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"early","qualifiedName":"data.Schedule.early","href":"data/Schedule/early-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"fastDay","qualifiedName":"data.Schedule.fastDay","href":"data/Schedule/fastDay-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"friday","qualifiedName":"data.Schedule.friday","href":"data/Schedule/friday-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"fridayRoshChodesh","qualifiedName":"data.Schedule.fridayRoshChodesh","href":"data/Schedule/fridayRoshChodesh-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"Schedule.fromJson","qualifiedName":"data.Schedule.fromJson","href":"data/Schedule/Schedule.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"getWinterFriday","qualifiedName":"data.Schedule.getWinterFriday","href":"data/Schedule/getWinterFriday.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"hashCode","qualifiedName":"data.Schedule.hashCode","href":"data/Schedule/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"name","qualifiedName":"data.Schedule.name","href":"data/Schedule/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Schedule.noSuchMethod","href":"data/Schedule/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"periods","qualifiedName":"data.Schedule.periods","href":"data/Schedule/periods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"pmAssembly","qualifiedName":"data.Schedule.pmAssembly","href":"data/Schedule/pmAssembly-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"roshChodesh","qualifiedName":"data.Schedule.roshChodesh","href":"data/Schedule/roshChodesh-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Schedule.runtimeType","href":"data/Schedule/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"schedules","qualifiedName":"data.Schedule.schedules","href":"data/Schedule/schedules.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"toJson","qualifiedName":"data.Schedule.toJson","href":"data/Schedule/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"toString","qualifiedName":"data.Schedule.toString","href":"data/Schedule/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"winterFriday","qualifiedName":"data.Schedule.winterFriday","href":"data/Schedule/winterFriday-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"winterFridayRoshChodesh","qualifiedName":"data.Schedule.winterFridayRoshChodesh","href":"data/Schedule/winterFridayRoshChodesh-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"Scores","qualifiedName":"data.Scores","href":"data/Scores-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Scores.==","href":"data/Scores/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"Scores","qualifiedName":"data.Scores.Scores","href":"data/Scores/Scores.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"didDraw","qualifiedName":"data.Scores.didDraw","href":"data/Scores/didDraw.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"didWin","qualifiedName":"data.Scores.didWin","href":"data/Scores/didWin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"Scores.fromJson","qualifiedName":"data.Scores.fromJson","href":"data/Scores/Scores.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"getScore","qualifiedName":"data.Scores.getScore","href":"data/Scores/getScore.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"hashCode","qualifiedName":"data.Scores.hashCode","href":"data/Scores/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"isHome","qualifiedName":"data.Scores.isHome","href":"data/Scores/isHome.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Scores.noSuchMethod","href":"data/Scores/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"otherScore","qualifiedName":"data.Scores.otherScore","href":"data/Scores/otherScore.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"ramazScore","qualifiedName":"data.Scores.ramazScore","href":"data/Scores/ramazScore.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Scores.runtimeType","href":"data/Scores/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"toJson","qualifiedName":"data.Scores.toJson","href":"data/Scores/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"toString","qualifiedName":"data.Scores.toString","href":"data/Scores/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"Sport","qualifiedName":"data.Sport","href":"data/Sport-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Sport.==","href":"data/Sport/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sport","type":"enum"}},{"name":"hashCode","qualifiedName":"data.Sport.hashCode","href":"data/Sport/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sport","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"data.Sport.noSuchMethod","href":"data/Sport/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sport","type":"enum"}},{"name":"runtimeType","qualifiedName":"data.Sport.runtimeType","href":"data/Sport/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sport","type":"enum"}},{"name":"toString","qualifiedName":"data.Sport.toString","href":"data/Sport/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Sport","type":"enum"}},{"name":"SportsGame","qualifiedName":"data.SportsGame","href":"data/SportsGame-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.SportsGame.==","href":"data/SportsGame/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"SportsGame","qualifiedName":"data.SportsGame.SportsGame","href":"data/SportsGame/SportsGame.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"awayTeam","qualifiedName":"data.SportsGame.awayTeam","href":"data/SportsGame/awayTeam.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"capitalize","qualifiedName":"data.SportsGame.capitalize","href":"data/SportsGame/capitalize.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"date","qualifiedName":"data.SportsGame.date","href":"data/SportsGame/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"dateTime","qualifiedName":"data.SportsGame.dateTime","href":"data/SportsGame/dateTime.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"description","qualifiedName":"data.SportsGame.description","href":"data/SportsGame/description.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"SportsGame.fromJson","qualifiedName":"data.SportsGame.fromJson","href":"data/SportsGame/SportsGame.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"fromList","qualifiedName":"data.SportsGame.fromList","href":"data/SportsGame/fromList.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"getJsonList","qualifiedName":"data.SportsGame.getJsonList","href":"data/SportsGame/getJsonList.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"hashCode","qualifiedName":"data.SportsGame.hashCode","href":"data/SportsGame/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"homeTeam","qualifiedName":"data.SportsGame.homeTeam","href":"data/SportsGame/homeTeam.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"isHome","qualifiedName":"data.SportsGame.isHome","href":"data/SportsGame/isHome.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.SportsGame.noSuchMethod","href":"data/SportsGame/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"opponent","qualifiedName":"data.SportsGame.opponent","href":"data/SportsGame/opponent.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"replaceScores","qualifiedName":"data.SportsGame.replaceScores","href":"data/SportsGame/replaceScores.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"runtimeType","qualifiedName":"data.SportsGame.runtimeType","href":"data/SportsGame/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"scores","qualifiedName":"data.SportsGame.scores","href":"data/SportsGame/scores.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"sport","qualifiedName":"data.SportsGame.sport","href":"data/SportsGame/sport.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"team","qualifiedName":"data.SportsGame.team","href":"data/SportsGame/team.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"times","qualifiedName":"data.SportsGame.times","href":"data/SportsGame/times.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"toJson","qualifiedName":"data.SportsGame.toJson","href":"data/SportsGame/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"toString","qualifiedName":"data.SportsGame.toString","href":"data/SportsGame/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"Subject","qualifiedName":"data.Subject","href":"data/Subject-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Subject.==","href":"data/Subject/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"Subject","qualifiedName":"data.Subject.Subject","href":"data/Subject/Subject.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"Subject.fromJson","qualifiedName":"data.Subject.fromJson","href":"data/Subject/Subject.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"getSubjects","qualifiedName":"data.Subject.getSubjects","href":"data/Subject/getSubjects.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"hashCode","qualifiedName":"data.Subject.hashCode","href":"data/Subject/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"name","qualifiedName":"data.Subject.name","href":"data/Subject/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Subject.noSuchMethod","href":"data/Subject/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Subject.runtimeType","href":"data/Subject/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"teacher","qualifiedName":"data.Subject.teacher","href":"data/Subject/teacher.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"toString","qualifiedName":"data.Subject.toString","href":"data/Subject/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"virtualLink","qualifiedName":"data.Subject.virtualLink","href":"data/Subject/virtualLink.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"SubjectReminderTime","qualifiedName":"data.SubjectReminderTime","href":"data/SubjectReminderTime-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"SubjectReminderTime","qualifiedName":"data.SubjectReminderTime.SubjectReminderTime","href":"data/SubjectReminderTime/SubjectReminderTime.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"doesApply","qualifiedName":"data.SubjectReminderTime.doesApply","href":"data/SubjectReminderTime/doesApply.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"SubjectReminderTime.fromJson","qualifiedName":"data.SubjectReminderTime.fromJson","href":"data/SubjectReminderTime/SubjectReminderTime.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"hash","qualifiedName":"data.SubjectReminderTime.hash","href":"data/SubjectReminderTime/hash.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"name","qualifiedName":"data.SubjectReminderTime.name","href":"data/SubjectReminderTime/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"toJson","qualifiedName":"data.SubjectReminderTime.toJson","href":"data/SubjectReminderTime/toJson.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"toString","qualifiedName":"data.SubjectReminderTime.toString","href":"data/SubjectReminderTime/toString.html","type":"method","overriddenDepth":2,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"Time","qualifiedName":"data.Time","href":"data/Time-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator <","qualifiedName":"data.Time.<","href":"data/Time/operator_less.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"operator <=","qualifiedName":"data.Time.<=","href":"data/Time/operator_less_equal.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"operator ==","qualifiedName":"data.Time.==","href":"data/Time/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"operator >","qualifiedName":"data.Time.>","href":"data/Time/operator_greater.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"operator >=","qualifiedName":"data.Time.>=","href":"data/Time/operator_greater_equal.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"Time","qualifiedName":"data.Time.Time","href":"data/Time/Time.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"Time.fromDateTime","qualifiedName":"data.Time.fromDateTime","href":"data/Time/Time.fromDateTime.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"Time.fromJson","qualifiedName":"data.Time.fromJson","href":"data/Time/Time.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"hashCode","qualifiedName":"data.Time.hashCode","href":"data/Time/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"hour","qualifiedName":"data.Time.hour","href":"data/Time/hour.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"minutes","qualifiedName":"data.Time.minutes","href":"data/Time/minutes.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Time.noSuchMethod","href":"data/Time/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Time.runtimeType","href":"data/Time/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"toJson","qualifiedName":"data.Time.toJson","href":"data/Time/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"toString","qualifiedName":"data.Time.toString","href":"data/Time/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"User","qualifiedName":"data.User","href":"data/User-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.User.==","href":"data/User/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"User","qualifiedName":"data.User.User","href":"data/User/User.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"advisory","qualifiedName":"data.User.advisory","href":"data/User/advisory.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"contactInfo","qualifiedName":"data.User.contactInfo","href":"data/User/contactInfo.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"dayNames","qualifiedName":"data.User.dayNames","href":"data/User/dayNames.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"User.fromJson","qualifiedName":"data.User.fromJson","href":"data/User/User.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"getPeriods","qualifiedName":"data.User.getPeriods","href":"data/User/getPeriods.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"grade","qualifiedName":"data.User.grade","href":"data/User/grade.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"hashCode","qualifiedName":"data.User.hashCode","href":"data/User/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.User.noSuchMethod","href":"data/User/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"registeredClubs","qualifiedName":"data.User.registeredClubs","href":"data/User/registeredClubs.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"runtimeType","qualifiedName":"data.User.runtimeType","href":"data/User/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"safeJson","qualifiedName":"data.User.safeJson","href":"data/User/safeJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"schedule","qualifiedName":"data.User.schedule","href":"data/User/schedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"sectionIDs","qualifiedName":"data.User.sectionIDs","href":"data/User/sectionIDs.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"toString","qualifiedName":"data.User.toString","href":"data/User/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"activityTypeToString","qualifiedName":"data.activityTypeToString","href":"data/activityTypeToString.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"adminScopeToString","qualifiedName":"data.adminScopeToString","href":"data/adminScopeToString.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"intToGrade","qualifiedName":"data.intToGrade","href":"data/intToGrade.html","type":"top-level property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"parseActivityType","qualifiedName":"data.parseActivityType","href":"data/parseActivityType.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"parseAdminScope","qualifiedName":"data.parseAdminScope","href":"data/parseAdminScope.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"reminderTimeToString","qualifiedName":"data.reminderTimeToString","href":"data/reminderTimeToString-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"sportToString","qualifiedName":"data.sportToString","href":"data/sportToString.html","type":"top-level property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"stringToReminderTime","qualifiedName":"data.stringToReminderTime","href":"data/stringToReminderTime-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"stringToSport","qualifiedName":"data.stringToSport","href":"data/stringToSport-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"generated_plugin_registrant","qualifiedName":"generated_plugin_registrant","href":"generated_plugin_registrant/generated_plugin_registrant-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"registerPlugins","qualifiedName":"generated_plugin_registrant.registerPlugins","href":"generated_plugin_registrant/registerPlugins.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"generated_plugin_registrant","type":"library"}},{"name":"main","qualifiedName":"main","href":"main/main-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"main","qualifiedName":"main.main","href":"main/main.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"main","type":"library"}},{"name":"models","qualifiedName":"models","href":"models/models-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"AdminScheduleModel","qualifiedName":"models.AdminScheduleModel","href":"models/AdminScheduleModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"AdminScheduleModel","qualifiedName":"models.AdminScheduleModel.AdminScheduleModel","href":"models/AdminScheduleModel/AdminScheduleModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"createSchedule","qualifiedName":"models.AdminScheduleModel.createSchedule","href":"models/AdminScheduleModel/createSchedule.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"deleteSchedule","qualifiedName":"models.AdminScheduleModel.deleteSchedule","href":"models/AdminScheduleModel/deleteSchedule.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"jsonSchedules","qualifiedName":"models.AdminScheduleModel.jsonSchedules","href":"models/AdminScheduleModel/jsonSchedules.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"saveSchedules","qualifiedName":"models.AdminScheduleModel.saveSchedules","href":"models/AdminScheduleModel/saveSchedules.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"schedules","qualifiedName":"models.AdminScheduleModel.schedules","href":"models/AdminScheduleModel/schedules.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"CalendarDay","qualifiedName":"models.CalendarDay","href":"models/CalendarDay-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"operator ==","qualifiedName":"models.CalendarDay.==","href":"models/CalendarDay/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"CalendarDay","qualifiedName":"models.CalendarDay.CalendarDay","href":"models/CalendarDay/CalendarDay.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"date","qualifiedName":"models.CalendarDay.date","href":"models/CalendarDay/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"hashCode","qualifiedName":"models.CalendarDay.hashCode","href":"models/CalendarDay/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"noSuchMethod","qualifiedName":"models.CalendarDay.noSuchMethod","href":"models/CalendarDay/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"runtimeType","qualifiedName":"models.CalendarDay.runtimeType","href":"models/CalendarDay/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"schoolDay","qualifiedName":"models.CalendarDay.schoolDay","href":"models/CalendarDay/schoolDay.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"toString","qualifiedName":"models.CalendarDay.toString","href":"models/CalendarDay/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"CalendarEditor","qualifiedName":"models.CalendarEditor","href":"models/CalendarEditor-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"CalendarEditor","qualifiedName":"models.CalendarEditor.CalendarEditor","href":"models/CalendarEditor/CalendarEditor.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"calendar","qualifiedName":"models.CalendarEditor.calendar","href":"models/CalendarEditor/calendar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"currentMonth","qualifiedName":"models.CalendarEditor.currentMonth","href":"models/CalendarEditor/currentMonth.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"currentYear","qualifiedName":"models.CalendarEditor.currentYear","href":"models/CalendarEditor/currentYear.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"daysInMonth","qualifiedName":"models.CalendarEditor.daysInMonth","href":"models/CalendarEditor/daysInMonth.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"dispose","qualifiedName":"models.CalendarEditor.dispose","href":"models/CalendarEditor/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"layoutMonth","qualifiedName":"models.CalendarEditor.layoutMonth","href":"models/CalendarEditor/layoutMonth.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"loadMonth","qualifiedName":"models.CalendarEditor.loadMonth","href":"models/CalendarEditor/loadMonth.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"now","qualifiedName":"models.CalendarEditor.now","href":"models/CalendarEditor/now.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"subscriptions","qualifiedName":"models.CalendarEditor.subscriptions","href":"models/CalendarEditor/subscriptions.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"updateDay","qualifiedName":"models.CalendarEditor.updateDay","href":"models/CalendarEditor/updateDay.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"years","qualifiedName":"models.CalendarEditor.years","href":"models/CalendarEditor/years.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"DayBuilderModel","qualifiedName":"models.DayBuilderModel","href":"models/DayBuilderModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"DayBuilderModel","qualifiedName":"models.DayBuilderModel.DayBuilderModel","href":"models/DayBuilderModel/DayBuilderModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"date","qualifiedName":"models.DayBuilderModel.date","href":"models/DayBuilderModel/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"day","qualifiedName":"models.DayBuilderModel.day","href":"models/DayBuilderModel/day.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"hasSchool","qualifiedName":"models.DayBuilderModel.hasSchool","href":"models/DayBuilderModel/hasSchool.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"name","qualifiedName":"models.DayBuilderModel.name","href":"models/DayBuilderModel/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"ready","qualifiedName":"models.DayBuilderModel.ready","href":"models/DayBuilderModel/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"schedule","qualifiedName":"models.DayBuilderModel.schedule","href":"models/DayBuilderModel/schedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"FeedbackModel","qualifiedName":"models.FeedbackModel","href":"models/FeedbackModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"FeedbackModel","qualifiedName":"models.FeedbackModel.FeedbackModel","href":"models/FeedbackModel/FeedbackModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackModel","type":"class"}},{"name":"anonymous","qualifiedName":"models.FeedbackModel.anonymous","href":"models/FeedbackModel/anonymous.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackModel","type":"class"}},{"name":"message","qualifiedName":"models.FeedbackModel.message","href":"models/FeedbackModel/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackModel","type":"class"}},{"name":"ready","qualifiedName":"models.FeedbackModel.ready","href":"models/FeedbackModel/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackModel","type":"class"}},{"name":"send","qualifiedName":"models.FeedbackModel.send","href":"models/FeedbackModel/send.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackModel","type":"class"}},{"name":"HomeModel","qualifiedName":"models.HomeModel","href":"models/HomeModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"HomeModel","qualifiedName":"models.HomeModel.HomeModel","href":"models/HomeModel/HomeModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomeModel","type":"class"}},{"name":"dispose","qualifiedName":"models.HomeModel.dispose","href":"models/HomeModel/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"HomeModel","type":"class"}},{"name":"refresh","qualifiedName":"models.HomeModel.refresh","href":"models/HomeModel/refresh.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomeModel","type":"class"}},{"name":"Models","qualifiedName":"models.Models","href":"models/Models-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"Models","qualifiedName":"models.Models.Models","href":"models/Models/Models.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"dispose","qualifiedName":"models.Models.dispose","href":"models/Models/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"init","qualifiedName":"models.Models.init","href":"models/Models/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"instance","qualifiedName":"models.Models.instance","href":"models/Models/instance.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"isReady","qualifiedName":"models.Models.isReady","href":"models/Models/isReady.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"reminders","qualifiedName":"models.Models.reminders","href":"models/Models/reminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"schedule","qualifiedName":"models.Models.schedule","href":"models/Models/schedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"sports","qualifiedName":"models.Models.sports","href":"models/Models/sports.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"user","qualifiedName":"models.Models.user","href":"models/Models/user.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"Reminders","qualifiedName":"models.Reminders","href":"models/Reminders-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"Reminders","qualifiedName":"models.Reminders.Reminders","href":"models/Reminders/Reminders.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"addReminder","qualifiedName":"models.Reminders.addReminder","href":"models/Reminders/addReminder.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"cleanReminders","qualifiedName":"models.Reminders.cleanReminders","href":"models/Reminders/cleanReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"currentReminders","qualifiedName":"models.Reminders.currentReminders","href":"models/Reminders/currentReminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"deleteReminder","qualifiedName":"models.Reminders.deleteReminder","href":"models/Reminders/deleteReminder.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"getReminders","qualifiedName":"models.Reminders.getReminders","href":"models/Reminders/getReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"hasNextReminder","qualifiedName":"models.Reminders.hasNextReminder","href":"models/Reminders/hasNextReminder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"hasReminder","qualifiedName":"models.Reminders.hasReminder","href":"models/Reminders/hasReminder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"init","qualifiedName":"models.Reminders.init","href":"models/Reminders/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"markShown","qualifiedName":"models.Reminders.markShown","href":"models/Reminders/markShown.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"nextReminders","qualifiedName":"models.Reminders.nextReminders","href":"models/Reminders/nextReminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"readReminders","qualifiedName":"models.Reminders.readReminders","href":"models/Reminders/readReminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"reminders","qualifiedName":"models.Reminders.reminders","href":"models/Reminders/reminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"replaceReminder","qualifiedName":"models.Reminders.replaceReminder","href":"models/Reminders/replaceReminder.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"verifyReminders","qualifiedName":"models.Reminders.verifyReminders","href":"models/Reminders/verifyReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"RemindersBuilderModel","qualifiedName":"models.RemindersBuilderModel","href":"models/RemindersBuilderModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"RemindersBuilderModel","qualifiedName":"models.RemindersBuilderModel.RemindersBuilderModel","href":"models/RemindersBuilderModel/RemindersBuilderModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"build","qualifiedName":"models.RemindersBuilderModel.build","href":"models/RemindersBuilderModel/build.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"changeCourse","qualifiedName":"models.RemindersBuilderModel.changeCourse","href":"models/RemindersBuilderModel/changeCourse.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"changeDay","qualifiedName":"models.RemindersBuilderModel.changeDay","href":"models/RemindersBuilderModel/changeDay.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"changePeriod","qualifiedName":"models.RemindersBuilderModel.changePeriod","href":"models/RemindersBuilderModel/changePeriod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"course","qualifiedName":"models.RemindersBuilderModel.course","href":"models/RemindersBuilderModel/course.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"courses","qualifiedName":"models.RemindersBuilderModel.courses","href":"models/RemindersBuilderModel/courses.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"dayName","qualifiedName":"models.RemindersBuilderModel.dayName","href":"models/RemindersBuilderModel/dayName.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"message","qualifiedName":"models.RemindersBuilderModel.message","href":"models/RemindersBuilderModel/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"onMessageChanged","qualifiedName":"models.RemindersBuilderModel.onMessageChanged","href":"models/RemindersBuilderModel/onMessageChanged.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"period","qualifiedName":"models.RemindersBuilderModel.period","href":"models/RemindersBuilderModel/period.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"periods","qualifiedName":"models.RemindersBuilderModel.periods","href":"models/RemindersBuilderModel/periods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"ready","qualifiedName":"models.RemindersBuilderModel.ready","href":"models/RemindersBuilderModel/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"shouldRepeat","qualifiedName":"models.RemindersBuilderModel.shouldRepeat","href":"models/RemindersBuilderModel/shouldRepeat.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"time","qualifiedName":"models.RemindersBuilderModel.time","href":"models/RemindersBuilderModel/time.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"toggleRepeat","qualifiedName":"models.RemindersBuilderModel.toggleRepeat","href":"models/RemindersBuilderModel/toggleRepeat.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"toggleRepeatType","qualifiedName":"models.RemindersBuilderModel.toggleRepeatType","href":"models/RemindersBuilderModel/toggleRepeatType.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"type","qualifiedName":"models.RemindersBuilderModel.type","href":"models/RemindersBuilderModel/type.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"ScheduleBuilderModel","qualifiedName":"models.ScheduleBuilderModel","href":"models/ScheduleBuilderModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"ScheduleBuilderModel","qualifiedName":"models.ScheduleBuilderModel.ScheduleBuilderModel","href":"models/ScheduleBuilderModel/ScheduleBuilderModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"name","qualifiedName":"models.ScheduleBuilderModel.name","href":"models/ScheduleBuilderModel/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"numPeriods","qualifiedName":"models.ScheduleBuilderModel.numPeriods","href":"models/ScheduleBuilderModel/numPeriods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"periods","qualifiedName":"models.ScheduleBuilderModel.periods","href":"models/ScheduleBuilderModel/periods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"preset","qualifiedName":"models.ScheduleBuilderModel.preset","href":"models/ScheduleBuilderModel/preset.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"ready","qualifiedName":"models.ScheduleBuilderModel.ready","href":"models/ScheduleBuilderModel/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"replaceTime","qualifiedName":"models.ScheduleBuilderModel.replaceTime","href":"models/ScheduleBuilderModel/replaceTime.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"schedule","qualifiedName":"models.ScheduleBuilderModel.schedule","href":"models/ScheduleBuilderModel/schedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"usePreset","qualifiedName":"models.ScheduleBuilderModel.usePreset","href":"models/ScheduleBuilderModel/usePreset.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"ScheduleModel","qualifiedName":"models.ScheduleModel","href":"models/ScheduleModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"ScheduleModel","qualifiedName":"models.ScheduleModel.ScheduleModel","href":"models/ScheduleModel/ScheduleModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"calendar","qualifiedName":"models.ScheduleModel.calendar","href":"models/ScheduleModel/calendar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"dispose","qualifiedName":"models.ScheduleModel.dispose","href":"models/ScheduleModel/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"hasSchool","qualifiedName":"models.ScheduleModel.hasSchool","href":"models/ScheduleModel/hasSchool.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"init","qualifiedName":"models.ScheduleModel.init","href":"models/ScheduleModel/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"initCalendar","qualifiedName":"models.ScheduleModel.initCalendar","href":"models/ScheduleModel/initCalendar.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"isValidReminder","qualifiedName":"models.ScheduleModel.isValidReminder","href":"models/ScheduleModel/isValidReminder.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"nextPeriod","qualifiedName":"models.ScheduleModel.nextPeriod","href":"models/ScheduleModel/nextPeriod.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"nextSubject","qualifiedName":"models.ScheduleModel.nextSubject","href":"models/ScheduleModel/nextSubject.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"now","qualifiedName":"models.ScheduleModel.now","href":"models/ScheduleModel/now.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"onNewPeriod","qualifiedName":"models.ScheduleModel.onNewPeriod","href":"models/ScheduleModel/onNewPeriod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"period","qualifiedName":"models.ScheduleModel.period","href":"models/ScheduleModel/period.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"periodIndex","qualifiedName":"models.ScheduleModel.periodIndex","href":"models/ScheduleModel/periodIndex.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"periods","qualifiedName":"models.ScheduleModel.periods","href":"models/ScheduleModel/periods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"reminders","qualifiedName":"models.ScheduleModel.reminders","href":"models/ScheduleModel/reminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"remindersListener","qualifiedName":"models.ScheduleModel.remindersListener","href":"models/ScheduleModel/remindersListener.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"scheduleReminders","qualifiedName":"models.ScheduleModel.scheduleReminders","href":"models/ScheduleModel/scheduleReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"setToday","qualifiedName":"models.ScheduleModel.setToday","href":"models/ScheduleModel/setToday.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"subject","qualifiedName":"models.ScheduleModel.subject","href":"models/ScheduleModel/subject.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"subjects","qualifiedName":"models.ScheduleModel.subjects","href":"models/ScheduleModel/subjects.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"timer","qualifiedName":"models.ScheduleModel.timer","href":"models/ScheduleModel/timer.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"timerInterval","qualifiedName":"models.ScheduleModel.timerInterval","href":"models/ScheduleModel/timerInterval-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"today","qualifiedName":"models.ScheduleModel.today","href":"models/ScheduleModel/today.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"updateReminders","qualifiedName":"models.ScheduleModel.updateReminders","href":"models/ScheduleModel/updateReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"user","qualifiedName":"models.ScheduleModel.user","href":"models/ScheduleModel/user.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"ScheduleViewModel","qualifiedName":"models.ScheduleViewModel","href":"models/ScheduleViewModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"ScheduleViewModel","qualifiedName":"models.ScheduleViewModel.ScheduleViewModel","href":"models/ScheduleViewModel/ScheduleViewModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"dataModel","qualifiedName":"models.ScheduleViewModel.dataModel","href":"models/ScheduleViewModel/dataModel.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"date","qualifiedName":"models.ScheduleViewModel.date","href":"models/ScheduleViewModel/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"day","qualifiedName":"models.ScheduleViewModel.day","href":"models/ScheduleViewModel/day.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"defatulSchedule","qualifiedName":"models.ScheduleViewModel.defatulSchedule","href":"models/ScheduleViewModel/defatulSchedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"defaultDay","qualifiedName":"models.ScheduleViewModel.defaultDay","href":"models/ScheduleViewModel/defaultDay.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"update","qualifiedName":"models.ScheduleViewModel.update","href":"models/ScheduleViewModel/update.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"SortOption","qualifiedName":"models.SortOption","href":"models/SortOption-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"operator ==","qualifiedName":"models.SortOption.==","href":"models/SortOption/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SortOption","type":"enum"}},{"name":"hashCode","qualifiedName":"models.SortOption.hashCode","href":"models/SortOption/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SortOption","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"models.SortOption.noSuchMethod","href":"models/SortOption/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SortOption","type":"enum"}},{"name":"runtimeType","qualifiedName":"models.SortOption.runtimeType","href":"models/SortOption/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SortOption","type":"enum"}},{"name":"toString","qualifiedName":"models.SortOption.toString","href":"models/SortOption/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SortOption","type":"enum"}},{"name":"Sports","qualifiedName":"models.Sports","href":"models/Sports-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"Sports","qualifiedName":"models.Sports.Sports","href":"models/Sports/Sports.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"addGame","qualifiedName":"models.Sports.addGame","href":"models/Sports/addGame.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"delete","qualifiedName":"models.Sports.delete","href":"models/Sports/delete.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"games","qualifiedName":"models.Sports.games","href":"models/Sports/games.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"getTodayGames","qualifiedName":"models.Sports.getTodayGames","href":"models/Sports/getTodayGames.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"init","qualifiedName":"models.Sports.init","href":"models/Sports/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"now","qualifiedName":"models.Sports.now","href":"models/Sports/now.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"replace","qualifiedName":"models.Sports.replace","href":"models/Sports/replace.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"saveGames","qualifiedName":"models.Sports.saveGames","href":"models/Sports/saveGames.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"timer","qualifiedName":"models.Sports.timer","href":"models/Sports/timer.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"todayGames","qualifiedName":"models.Sports.todayGames","href":"models/Sports/todayGames.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"SportsBuilderModel","qualifiedName":"models.SportsBuilderModel","href":"models/SportsBuilderModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"SportsBuilderModel","qualifiedName":"models.SportsBuilderModel.SportsBuilderModel","href":"models/SportsBuilderModel/SportsBuilderModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"away","qualifiedName":"models.SportsBuilderModel.away","href":"models/SportsBuilderModel/away.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"date","qualifiedName":"models.SportsBuilderModel.date","href":"models/SportsBuilderModel/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"end","qualifiedName":"models.SportsBuilderModel.end","href":"models/SportsBuilderModel/end.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"game","qualifiedName":"models.SportsBuilderModel.game","href":"models/SportsBuilderModel/game.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"loading","qualifiedName":"models.SportsBuilderModel.loading","href":"models/SportsBuilderModel/loading.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"opponent","qualifiedName":"models.SportsBuilderModel.opponent","href":"models/SportsBuilderModel/opponent.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"ready","qualifiedName":"models.SportsBuilderModel.ready","href":"models/SportsBuilderModel/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"scores","qualifiedName":"models.SportsBuilderModel.scores","href":"models/SportsBuilderModel/scores.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"sport","qualifiedName":"models.SportsBuilderModel.sport","href":"models/SportsBuilderModel/sport.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"start","qualifiedName":"models.SportsBuilderModel.start","href":"models/SportsBuilderModel/start.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"team","qualifiedName":"models.SportsBuilderModel.team","href":"models/SportsBuilderModel/team.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"SportsModel","qualifiedName":"models.SportsModel","href":"models/SportsModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"SportsModel","qualifiedName":"models.SportsModel.SportsModel","href":"models/SportsModel/SportsModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"adminFunc","qualifiedName":"models.SportsModel.adminFunc","href":"models/SportsModel/adminFunc.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"data","qualifiedName":"models.SportsModel.data","href":"models/SportsModel/data.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"dispose","qualifiedName":"models.SportsModel.dispose","href":"models/SportsModel/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"divideGames","qualifiedName":"models.SportsModel.divideGames","href":"models/SportsModel/divideGames.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"isAdmin","qualifiedName":"models.SportsModel.isAdmin","href":"models/SportsModel/isAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"loading","qualifiedName":"models.SportsModel.loading","href":"models/SportsModel/loading.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"recentBySport","qualifiedName":"models.SportsModel.recentBySport","href":"models/SportsModel/recentBySport.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"recents","qualifiedName":"models.SportsModel.recents","href":"models/SportsModel/recents.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"setup","qualifiedName":"models.SportsModel.setup","href":"models/SportsModel/setup.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"sortByDate","qualifiedName":"models.SportsModel.sortByDate","href":"models/SportsModel/sortByDate.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"sortBySport","qualifiedName":"models.SportsModel.sortBySport","href":"models/SportsModel/sortBySport.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"sortGames","qualifiedName":"models.SportsModel.sortGames","href":"models/SportsModel/sortGames.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"sortOption","qualifiedName":"models.SportsModel.sortOption","href":"models/SportsModel/sortOption.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"upcoming","qualifiedName":"models.SportsModel.upcoming","href":"models/SportsModel/upcoming.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"upcomingBySport","qualifiedName":"models.SportsModel.upcomingBySport","href":"models/SportsModel/upcomingBySport.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"UserModel","qualifiedName":"models.UserModel","href":"models/UserModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"UserModel","qualifiedName":"models.UserModel.UserModel","href":"models/UserModel/UserModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"adminScopes","qualifiedName":"models.UserModel.adminScopes","href":"models/UserModel/adminScopes.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"data","qualifiedName":"models.UserModel.data","href":"models/UserModel/data.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"init","qualifiedName":"models.UserModel.init","href":"models/UserModel/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"isAdmin","qualifiedName":"models.UserModel.isAdmin","href":"models/UserModel/isAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"subjects","qualifiedName":"models.UserModel.subjects","href":"models/UserModel/subjects.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"pages","qualifiedName":"pages","href":"pages/pages-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"AdminCalendarPage","qualifiedName":"pages.AdminCalendarPage","href":"pages/AdminCalendarPage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"AdminCalendarPage","qualifiedName":"pages.AdminCalendarPage.AdminCalendarPage","href":"pages/AdminCalendarPage/AdminCalendarPage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarPage","type":"class"}},{"name":"createState","qualifiedName":"pages.AdminCalendarPage.createState","href":"pages/AdminCalendarPage/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarPage","type":"class"}},{"name":"AdminCalendarState","qualifiedName":"pages.AdminCalendarState","href":"pages/AdminCalendarState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"AdminCalendarState","qualifiedName":"pages.AdminCalendarState.AdminCalendarState","href":"pages/AdminCalendarState/AdminCalendarState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"build","qualifiedName":"pages.AdminCalendarState.build","href":"pages/AdminCalendarState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"currentMonth","qualifiedName":"pages.AdminCalendarState.currentMonth","href":"pages/AdminCalendarState/currentMonth.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"dispose","qualifiedName":"pages.AdminCalendarState.dispose","href":"pages/AdminCalendarState/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"initState","qualifiedName":"pages.AdminCalendarState.initState","href":"pages/AdminCalendarState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"listener","qualifiedName":"pages.AdminCalendarState.listener","href":"pages/AdminCalendarState/listener.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"loopMonth","qualifiedName":"pages.AdminCalendarState.loopMonth","href":"pages/AdminCalendarState/loopMonth.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"model","qualifiedName":"pages.AdminCalendarState.model","href":"pages/AdminCalendarState/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"months","qualifiedName":"pages.AdminCalendarState.months","href":"pages/AdminCalendarState/months-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"weekdays","qualifiedName":"pages.AdminCalendarState.weekdays","href":"pages/AdminCalendarState/weekdays-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"AdminSchedulesPage","qualifiedName":"pages.AdminSchedulesPage","href":"pages/AdminSchedulesPage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"AdminSchedulesPage","qualifiedName":"pages.AdminSchedulesPage.AdminSchedulesPage","href":"pages/AdminSchedulesPage/AdminSchedulesPage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminSchedulesPage","type":"class"}},{"name":"build","qualifiedName":"pages.AdminSchedulesPage.build","href":"pages/AdminSchedulesPage/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminSchedulesPage","type":"class"}},{"name":"DayBuilder","qualifiedName":"pages.DayBuilder","href":"pages/DayBuilder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"DayBuilder","qualifiedName":"pages.DayBuilder.DayBuilder","href":"pages/DayBuilder/DayBuilder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilder","type":"class"}},{"name":"build","qualifiedName":"pages.DayBuilder.build","href":"pages/DayBuilder/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"DayBuilder","type":"class"}},{"name":"date","qualifiedName":"pages.DayBuilder.date","href":"pages/DayBuilder/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilder","type":"class"}},{"name":"day","qualifiedName":"pages.DayBuilder.day","href":"pages/DayBuilder/day.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilder","type":"class"}},{"name":"upload","qualifiedName":"pages.DayBuilder.upload","href":"pages/DayBuilder/upload.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilder","type":"class"}},{"name":"FeedbackPage","qualifiedName":"pages.FeedbackPage","href":"pages/FeedbackPage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"FeedbackPage","qualifiedName":"pages.FeedbackPage.FeedbackPage","href":"pages/FeedbackPage/FeedbackPage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackPage","type":"class"}},{"name":"build","qualifiedName":"pages.FeedbackPage.build","href":"pages/FeedbackPage/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"FeedbackPage","type":"class"}},{"name":"FormRow","qualifiedName":"pages.FormRow","href":"pages/FormRow-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"FormRow","qualifiedName":"pages.FormRow.FormRow","href":"pages/FormRow/FormRow.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"build","qualifiedName":"pages.FormRow.build","href":"pages/FormRow/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"FormRow.editable","qualifiedName":"pages.FormRow.editable","href":"pages/FormRow/FormRow.editable.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"moreSpace","qualifiedName":"pages.FormRow.moreSpace","href":"pages/FormRow/moreSpace.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"picker","qualifiedName":"pages.FormRow.picker","href":"pages/FormRow/picker.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"sized","qualifiedName":"pages.FormRow.sized","href":"pages/FormRow/sized.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"title","qualifiedName":"pages.FormRow.title","href":"pages/FormRow/title.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"GenericSportsView","qualifiedName":"pages.GenericSportsView","href":"pages/GenericSportsView-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"GenericSportsView","qualifiedName":"pages.GenericSportsView.GenericSportsView","href":"pages/GenericSportsView/GenericSportsView.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"build","qualifiedName":"pages.GenericSportsView.build","href":"pages/GenericSportsView/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"builder","qualifiedName":"pages.GenericSportsView.builder","href":"pages/GenericSportsView/builder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"loading","qualifiedName":"pages.GenericSportsView.loading","href":"pages/GenericSportsView/loading.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"onRefresh","qualifiedName":"pages.GenericSportsView.onRefresh","href":"pages/GenericSportsView/onRefresh.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"recents","qualifiedName":"pages.GenericSportsView.recents","href":"pages/GenericSportsView/recents.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"upcoming","qualifiedName":"pages.GenericSportsView.upcoming","href":"pages/GenericSportsView/upcoming.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"HomePage","qualifiedName":"pages.HomePage","href":"pages/HomePage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"HomePage","qualifiedName":"pages.HomePage.HomePage","href":"pages/HomePage/HomePage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomePage","type":"class"}},{"name":"createState","qualifiedName":"pages.HomePage.createState","href":"pages/HomePage/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"HomePage","type":"class"}},{"name":"pageIndex","qualifiedName":"pages.HomePage.pageIndex","href":"pages/HomePage/pageIndex.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomePage","type":"class"}},{"name":"HomePageState","qualifiedName":"pages.HomePageState","href":"pages/HomePageState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"HomePageState","qualifiedName":"pages.HomePageState.HomePageState","href":"pages/HomePageState/HomePageState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomePageState","type":"class"}},{"name":"build","qualifiedName":"pages.HomePageState.build","href":"pages/HomePageState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"HomePageState","type":"class"}},{"name":"index","qualifiedName":"pages.HomePageState.index","href":"pages/HomePageState/index.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomePageState","type":"class"}},{"name":"initState","qualifiedName":"pages.HomePageState.initState","href":"pages/HomePageState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"HomePageState","type":"class"}},{"name":"navItems","qualifiedName":"pages.HomePageState.navItems","href":"pages/HomePageState/navItems.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomePageState","type":"class"}},{"name":"Login","qualifiedName":"pages.Login","href":"pages/Login-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"Login","qualifiedName":"pages.Login.Login","href":"pages/Login/Login.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Login","type":"class"}},{"name":"createState","qualifiedName":"pages.Login.createState","href":"pages/Login/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Login","type":"class"}},{"name":"destination","qualifiedName":"pages.Login.destination","href":"pages/Login/destination.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Login","type":"class"}},{"name":"LoginState","qualifiedName":"pages.LoginState","href":"pages/LoginState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"LoginState","qualifiedName":"pages.LoginState.LoginState","href":"pages/LoginState/LoginState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"build","qualifiedName":"pages.LoginState.build","href":"pages/LoginState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"initState","qualifiedName":"pages.LoginState.initState","href":"pages/LoginState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"isLoading","qualifiedName":"pages.LoginState.isLoading","href":"pages/LoginState/isLoading.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"onError","qualifiedName":"pages.LoginState.onError","href":"pages/LoginState/onError.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"safely","qualifiedName":"pages.LoginState.safely","href":"pages/LoginState/safely.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"signIn","qualifiedName":"pages.LoginState.signIn","href":"pages/LoginState/signIn.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"NavigationDrawer","qualifiedName":"pages.NavigationDrawer","href":"pages/NavigationDrawer-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"NavigationDrawer","qualifiedName":"pages.NavigationDrawer.NavigationDrawer","href":"pages/NavigationDrawer/NavigationDrawer.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"build","qualifiedName":"pages.NavigationDrawer.build","href":"pages/NavigationDrawer/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"getRouteName","qualifiedName":"pages.NavigationDrawer.getRouteName","href":"pages/NavigationDrawer/getRouteName.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"isScheduleAdmin","qualifiedName":"pages.NavigationDrawer.isScheduleAdmin","href":"pages/NavigationDrawer/isScheduleAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"isSportsAdmin","qualifiedName":"pages.NavigationDrawer.isSportsAdmin","href":"pages/NavigationDrawer/isSportsAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"pushRoute","qualifiedName":"pages.NavigationDrawer.pushRoute","href":"pages/NavigationDrawer/pushRoute.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"OldCalendarWidget","qualifiedName":"pages.OldCalendarWidget","href":"pages/OldCalendarWidget-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"OldCalendarWidget","qualifiedName":"pages.OldCalendarWidget.OldCalendarWidget","href":"pages/OldCalendarWidget/OldCalendarWidget.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"OldCalendarWidget","type":"class"}},{"name":"build","qualifiedName":"pages.OldCalendarWidget.build","href":"pages/OldCalendarWidget/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"OldCalendarWidget","type":"class"}},{"name":"ReminderBuilder","qualifiedName":"pages.ReminderBuilder","href":"pages/ReminderBuilder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ReminderBuilder","qualifiedName":"pages.ReminderBuilder.ReminderBuilder","href":"pages/ReminderBuilder/ReminderBuilder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilder","type":"class"}},{"name":"buildReminder","qualifiedName":"pages.ReminderBuilder.buildReminder","href":"pages/ReminderBuilder/buildReminder.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilder","type":"class"}},{"name":"createState","qualifiedName":"pages.ReminderBuilder.createState","href":"pages/ReminderBuilder/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilder","type":"class"}},{"name":"reminder","qualifiedName":"pages.ReminderBuilder.reminder","href":"pages/ReminderBuilder/reminder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilder","type":"class"}},{"name":"trimString","qualifiedName":"pages.ReminderBuilder.trimString","href":"pages/ReminderBuilder/trimString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilder","type":"class"}},{"name":"ReminderBuilderState","qualifiedName":"pages.ReminderBuilderState","href":"pages/ReminderBuilderState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ReminderBuilderState","qualifiedName":"pages.ReminderBuilderState.ReminderBuilderState","href":"pages/ReminderBuilderState/ReminderBuilderState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilderState","type":"class"}},{"name":"build","qualifiedName":"pages.ReminderBuilderState.build","href":"pages/ReminderBuilderState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilderState","type":"class"}},{"name":"controller","qualifiedName":"pages.ReminderBuilderState.controller","href":"pages/ReminderBuilderState/controller.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilderState","type":"class"}},{"name":"initState","qualifiedName":"pages.ReminderBuilderState.initState","href":"pages/ReminderBuilderState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilderState","type":"class"}},{"name":"ResponsiveReminders","qualifiedName":"pages.ResponsiveReminders","href":"pages/ResponsiveReminders-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ResponsiveReminders","qualifiedName":"pages.ResponsiveReminders.ResponsiveReminders","href":"pages/ResponsiveReminders/ResponsiveReminders.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveReminders","type":"class"}},{"name":"appBar","qualifiedName":"pages.ResponsiveReminders.appBar","href":"pages/ResponsiveReminders/appBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveReminders","type":"class"}},{"name":"build","qualifiedName":"pages.ResponsiveReminders.build","href":"pages/ResponsiveReminders/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveReminders","type":"class"}},{"name":"floatingActionButton","qualifiedName":"pages.ResponsiveReminders.floatingActionButton","href":"pages/ResponsiveReminders/floatingActionButton.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveReminders","type":"class"}},{"name":"model","qualifiedName":"pages.ResponsiveReminders.model","href":"pages/ResponsiveReminders/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveReminders","type":"class"}},{"name":"ResponsiveSchedule","qualifiedName":"pages.ResponsiveSchedule","href":"pages/ResponsiveSchedule-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ResponsiveSchedule","qualifiedName":"pages.ResponsiveSchedule.ResponsiveSchedule","href":"pages/ResponsiveSchedule/ResponsiveSchedule.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"appBar","qualifiedName":"pages.ResponsiveSchedule.appBar","href":"pages/ResponsiveSchedule/appBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"build","qualifiedName":"pages.ResponsiveSchedule.build","href":"pages/ResponsiveSchedule/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"floatingActionButton","qualifiedName":"pages.ResponsiveSchedule.floatingActionButton","href":"pages/ResponsiveSchedule/floatingActionButton.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"handleInvalidSchedule","qualifiedName":"pages.ResponsiveSchedule.handleInvalidSchedule","href":"pages/ResponsiveSchedule/handleInvalidSchedule.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"model","qualifiedName":"pages.ResponsiveSchedule.model","href":"pages/ResponsiveSchedule/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"viewDay","qualifiedName":"pages.ResponsiveSchedule.viewDay","href":"pages/ResponsiveSchedule/viewDay.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"RouteInitializer","qualifiedName":"pages.RouteInitializer","href":"pages/RouteInitializer-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"RouteInitializer","qualifiedName":"pages.RouteInitializer.RouteInitializer","href":"pages/RouteInitializer/RouteInitializer.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"child","qualifiedName":"pages.RouteInitializer.child","href":"pages/RouteInitializer/child.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"createState","qualifiedName":"pages.RouteInitializer.createState","href":"pages/RouteInitializer/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"isAllowed","qualifiedName":"pages.RouteInitializer.isAllowed","href":"pages/RouteInitializer/isAllowed.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"isSignedIn","qualifiedName":"pages.RouteInitializer.isSignedIn","href":"pages/RouteInitializer/isSignedIn.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"onError","qualifiedName":"pages.RouteInitializer.onError","href":"pages/RouteInitializer/onError.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"onFailure","qualifiedName":"pages.RouteInitializer.onFailure","href":"pages/RouteInitializer/onFailure.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"RouteInitializerState","qualifiedName":"pages.RouteInitializerState","href":"pages/RouteInitializerState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"RouteInitializerState","qualifiedName":"pages.RouteInitializerState.RouteInitializerState","href":"pages/RouteInitializerState/RouteInitializerState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializerState","type":"class"}},{"name":"build","qualifiedName":"pages.RouteInitializerState.build","href":"pages/RouteInitializerState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializerState","type":"class"}},{"name":"init","qualifiedName":"pages.RouteInitializerState.init","href":"pages/RouteInitializerState/init.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializerState","type":"class"}},{"name":"initFuture","qualifiedName":"pages.RouteInitializerState.initFuture","href":"pages/RouteInitializerState/initFuture.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializerState","type":"class"}},{"name":"initState","qualifiedName":"pages.RouteInitializerState.initState","href":"pages/RouteInitializerState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializerState","type":"class"}},{"name":"Routes","qualifiedName":"pages.Routes","href":"pages/Routes-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"operator ==","qualifiedName":"pages.Routes.==","href":"pages/Routes/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"Routes","qualifiedName":"pages.Routes.Routes","href":"pages/Routes/Routes.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"calendar","qualifiedName":"pages.Routes.calendar","href":"pages/Routes/calendar-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"feedback","qualifiedName":"pages.Routes.feedback","href":"pages/Routes/feedback-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"hashCode","qualifiedName":"pages.Routes.hashCode","href":"pages/Routes/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"home","qualifiedName":"pages.Routes.home","href":"pages/Routes/home-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"login","qualifiedName":"pages.Routes.login","href":"pages/Routes/login-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"noSuchMethod","qualifiedName":"pages.Routes.noSuchMethod","href":"pages/Routes/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"reminders","qualifiedName":"pages.Routes.reminders","href":"pages/Routes/reminders-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"runtimeType","qualifiedName":"pages.Routes.runtimeType","href":"pages/Routes/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"schedule","qualifiedName":"pages.Routes.schedule","href":"pages/Routes/schedule-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"schedules","qualifiedName":"pages.Routes.schedules","href":"pages/Routes/schedules-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"sports","qualifiedName":"pages.Routes.sports","href":"pages/Routes/sports-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"toString","qualifiedName":"pages.Routes.toString","href":"pages/Routes/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"ScheduleBuilder","qualifiedName":"pages.ScheduleBuilder","href":"pages/ScheduleBuilder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ScheduleBuilder","qualifiedName":"pages.ScheduleBuilder.ScheduleBuilder","href":"pages/ScheduleBuilder/ScheduleBuilder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilder","type":"class"}},{"name":"buildSchedule","qualifiedName":"pages.ScheduleBuilder.buildSchedule","href":"pages/ScheduleBuilder/buildSchedule.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilder","type":"class"}},{"name":"createState","qualifiedName":"pages.ScheduleBuilder.createState","href":"pages/ScheduleBuilder/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilder","type":"class"}},{"name":"preset","qualifiedName":"pages.ScheduleBuilder.preset","href":"pages/ScheduleBuilder/preset.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilder","type":"class"}},{"name":"ScheduleBuilderState","qualifiedName":"pages.ScheduleBuilderState","href":"pages/ScheduleBuilderState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ScheduleBuilderState","qualifiedName":"pages.ScheduleBuilderState.ScheduleBuilderState","href":"pages/ScheduleBuilderState/ScheduleBuilderState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderState","type":"class"}},{"name":"build","qualifiedName":"pages.ScheduleBuilderState.build","href":"pages/ScheduleBuilderState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderState","type":"class"}},{"name":"conflicting","qualifiedName":"pages.ScheduleBuilderState.conflicting","href":"pages/ScheduleBuilderState/conflicting.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderState","type":"class"}},{"name":"controller","qualifiedName":"pages.ScheduleBuilderState.controller","href":"pages/ScheduleBuilderState/controller.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderState","type":"class"}},{"name":"initState","qualifiedName":"pages.ScheduleBuilderState.initState","href":"pages/ScheduleBuilderState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderState","type":"class"}},{"name":"SportBuilderState","qualifiedName":"pages.SportBuilderState","href":"pages/SportBuilderState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"SportBuilderState","qualifiedName":"pages.SportBuilderState.SportBuilderState","href":"pages/SportBuilderState/SportBuilderState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportBuilderState","type":"class"}},{"name":"build","qualifiedName":"pages.SportBuilderState.build","href":"pages/SportBuilderState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportBuilderState","type":"class"}},{"name":"initState","qualifiedName":"pages.SportBuilderState.initState","href":"pages/SportBuilderState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportBuilderState","type":"class"}},{"name":"opponentController","qualifiedName":"pages.SportBuilderState.opponentController","href":"pages/SportBuilderState/opponentController.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportBuilderState","type":"class"}},{"name":"teamController","qualifiedName":"pages.SportBuilderState.teamController","href":"pages/SportBuilderState/teamController.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportBuilderState","type":"class"}},{"name":"SportsBuilder","qualifiedName":"pages.SportsBuilder","href":"pages/SportsBuilder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"SportsBuilder","qualifiedName":"pages.SportsBuilder.SportsBuilder","href":"pages/SportsBuilder/SportsBuilder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilder","type":"class"}},{"name":"createGame","qualifiedName":"pages.SportsBuilder.createGame","href":"pages/SportsBuilder/createGame.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilder","type":"class"}},{"name":"createState","qualifiedName":"pages.SportsBuilder.createState","href":"pages/SportsBuilder/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilder","type":"class"}},{"name":"parent","qualifiedName":"pages.SportsBuilder.parent","href":"pages/SportsBuilder/parent.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilder","type":"class"}},{"name":"SportsPage","qualifiedName":"pages.SportsPage","href":"pages/SportsPage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"SportsPage","qualifiedName":"pages.SportsPage.SportsPage","href":"pages/SportsPage/SportsPage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsPage","type":"class"}},{"name":"build","qualifiedName":"pages.SportsPage.build","href":"pages/SportsPage/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsPage","type":"class"}},{"name":"buildAppBar","qualifiedName":"pages.buildAppBar","href":"pages/buildAppBar.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"getLayout","qualifiedName":"pages.getLayout","href":"pages/getLayout.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"openMenu","qualifiedName":"pages.openMenu","href":"pages/openMenu.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ramaz_services","qualifiedName":"ramaz_services","href":"ramaz_services/ramaz_services-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"Auth","qualifiedName":"ramaz_services.Auth","href":"ramaz_services/Auth-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Auth.==","href":"ramaz_services/Auth/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"Auth","qualifiedName":"ramaz_services.Auth.Auth","href":"ramaz_services/Auth/Auth.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"adminScopes","qualifiedName":"ramaz_services.Auth.adminScopes","href":"ramaz_services/Auth/adminScopes.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"auth","qualifiedName":"ramaz_services.Auth.auth","href":"ramaz_services/Auth/auth.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"calendarScope","qualifiedName":"ramaz_services.Auth.calendarScope","href":"ramaz_services/Auth/calendarScope-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"claims","qualifiedName":"ramaz_services.Auth.claims","href":"ramaz_services/Auth/claims.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"email","qualifiedName":"ramaz_services.Auth.email","href":"ramaz_services/Auth/email.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"google","qualifiedName":"ramaz_services.Auth.google","href":"ramaz_services/Auth/google.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Auth.hashCode","href":"ramaz_services/Auth/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"isAdmin","qualifiedName":"ramaz_services.Auth.isAdmin","href":"ramaz_services/Auth/isAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"isCalendarAdmin","qualifiedName":"ramaz_services.Auth.isCalendarAdmin","href":"ramaz_services/Auth/isCalendarAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"isSignedIn","qualifiedName":"ramaz_services.Auth.isSignedIn","href":"ramaz_services/Auth/isSignedIn.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"isSportsAdmin","qualifiedName":"ramaz_services.Auth.isSportsAdmin","href":"ramaz_services/Auth/isSportsAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"name","qualifiedName":"ramaz_services.Auth.name","href":"ramaz_services/Auth/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Auth.noSuchMethod","href":"ramaz_services/Auth/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Auth.runtimeType","href":"ramaz_services/Auth/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"signIn","qualifiedName":"ramaz_services.Auth.signIn","href":"ramaz_services/Auth/signIn.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"signOut","qualifiedName":"ramaz_services.Auth.signOut","href":"ramaz_services/Auth/signOut.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"sportsScope","qualifiedName":"ramaz_services.Auth.sportsScope","href":"ramaz_services/Auth/sportsScope-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Auth.toString","href":"ramaz_services/Auth/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"Crashlytics","qualifiedName":"ramaz_services.Crashlytics","href":"ramaz_services/Crashlytics-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Crashlytics.==","href":"ramaz_services/Crashlytics/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"Crashlytics","qualifiedName":"ramaz_services.Crashlytics.Crashlytics","href":"ramaz_services/Crashlytics/Crashlytics.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"didCrashLastTime","qualifiedName":"ramaz_services.Crashlytics.didCrashLastTime","href":"ramaz_services/Crashlytics/didCrashLastTime.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Crashlytics.hashCode","href":"ramaz_services/Crashlytics/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"init","qualifiedName":"ramaz_services.Crashlytics.init","href":"ramaz_services/Crashlytics/init.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"instance","qualifiedName":"ramaz_services.Crashlytics.instance","href":"ramaz_services/Crashlytics/instance.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"log","qualifiedName":"ramaz_services.Crashlytics.log","href":"ramaz_services/Crashlytics/log.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Crashlytics.noSuchMethod","href":"ramaz_services/Crashlytics/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"recordError","qualifiedName":"ramaz_services.Crashlytics.recordError","href":"ramaz_services/Crashlytics/recordError.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"recordFlutterError","qualifiedName":"ramaz_services.Crashlytics.recordFlutterError","href":"ramaz_services/Crashlytics/recordFlutterError.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Crashlytics.runtimeType","href":"ramaz_services/Crashlytics/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"setEmail","qualifiedName":"ramaz_services.Crashlytics.setEmail","href":"ramaz_services/Crashlytics/setEmail.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"signIn","qualifiedName":"ramaz_services.Crashlytics.signIn","href":"ramaz_services/Crashlytics/signIn.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Crashlytics.toString","href":"ramaz_services/Crashlytics/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"toggle","qualifiedName":"ramaz_services.Crashlytics.toggle","href":"ramaz_services/Crashlytics/toggle.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"NoAccountException","qualifiedName":"ramaz_services.NoAccountException","href":"ramaz_services/NoAccountException-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.NoAccountException.==","href":"ramaz_services/NoAccountException/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"NoAccountException","qualifiedName":"ramaz_services.NoAccountException.NoAccountException","href":"ramaz_services/NoAccountException/NoAccountException.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.NoAccountException.hashCode","href":"ramaz_services/NoAccountException/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.NoAccountException.noSuchMethod","href":"ramaz_services/NoAccountException/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.NoAccountException.runtimeType","href":"ramaz_services/NoAccountException/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.NoAccountException.toString","href":"ramaz_services/NoAccountException/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"Notification","qualifiedName":"ramaz_services.Notification","href":"ramaz_services/Notification-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Notification.==","href":"ramaz_services/Notification/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"Notification","qualifiedName":"ramaz_services.Notification.Notification","href":"ramaz_services/Notification/Notification.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Notification.hashCode","href":"ramaz_services/Notification/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"id","qualifiedName":"ramaz_services.Notification.id","href":"ramaz_services/Notification/id-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"message","qualifiedName":"ramaz_services.Notification.message","href":"ramaz_services/Notification/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Notification.noSuchMethod","href":"ramaz_services/Notification/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"Notification.reminder","qualifiedName":"ramaz_services.Notification.reminder","href":"ramaz_services/Notification/Notification.reminder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Notification.runtimeType","href":"ramaz_services/Notification/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"title","qualifiedName":"ramaz_services.Notification.title","href":"ramaz_services/Notification/title.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Notification.toString","href":"ramaz_services/Notification/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"Notifications","qualifiedName":"ramaz_services.Notifications","href":"ramaz_services/Notifications-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Notifications.==","href":"ramaz_services/Notifications/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"Notifications","qualifiedName":"ramaz_services.Notifications.Notifications","href":"ramaz_services/Notifications/Notifications.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"cancelAll","qualifiedName":"ramaz_services.Notifications.cancelAll","href":"ramaz_services/Notifications/cancelAll.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Notifications.hashCode","href":"ramaz_services/Notifications/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"init","qualifiedName":"ramaz_services.Notifications.init","href":"ramaz_services/Notifications/init.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"instance","qualifiedName":"ramaz_services.Notifications.instance","href":"ramaz_services/Notifications/instance.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Notifications.noSuchMethod","href":"ramaz_services/Notifications/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"pendingNotifications","qualifiedName":"ramaz_services.Notifications.pendingNotifications","href":"ramaz_services/Notifications/pendingNotifications.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Notifications.runtimeType","href":"ramaz_services/Notifications/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"scheduleNotification","qualifiedName":"ramaz_services.Notifications.scheduleNotification","href":"ramaz_services/Notifications/scheduleNotification.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"sendNotification","qualifiedName":"ramaz_services.Notifications.sendNotification","href":"ramaz_services/Notifications/sendNotification.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"signIn","qualifiedName":"ramaz_services.Notifications.signIn","href":"ramaz_services/Notifications/signIn.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Notifications.toString","href":"ramaz_services/Notifications/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"Preferences","qualifiedName":"ramaz_services.Preferences","href":"ramaz_services/Preferences-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Preferences.==","href":"ramaz_services/Preferences/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"Preferences","qualifiedName":"ramaz_services.Preferences.Preferences","href":"ramaz_services/Preferences/Preferences.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"brightness","qualifiedName":"ramaz_services.Preferences.brightness","href":"ramaz_services/Preferences/brightness.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"firstTime","qualifiedName":"ramaz_services.Preferences.firstTime","href":"ramaz_services/Preferences/firstTime.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"firstTimeKey","qualifiedName":"ramaz_services.Preferences.firstTimeKey","href":"ramaz_services/Preferences/firstTimeKey-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Preferences.hashCode","href":"ramaz_services/Preferences/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"init","qualifiedName":"ramaz_services.Preferences.init","href":"ramaz_services/Preferences/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"lightMode","qualifiedName":"ramaz_services.Preferences.lightMode","href":"ramaz_services/Preferences/lightMode-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Preferences.noSuchMethod","href":"ramaz_services/Preferences/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Preferences.runtimeType","href":"ramaz_services/Preferences/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"signIn","qualifiedName":"ramaz_services.Preferences.signIn","href":"ramaz_services/Preferences/signIn.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Preferences.toString","href":"ramaz_services/Preferences/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"Services","qualifiedName":"ramaz_services.Services","href":"ramaz_services/Services-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Services.==","href":"ramaz_services/Services/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"Services","qualifiedName":"ramaz_services.Services.Services","href":"ramaz_services/Services/Services.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"crashlytics","qualifiedName":"ramaz_services.Services.crashlytics","href":"ramaz_services/Services/crashlytics.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"database","qualifiedName":"ramaz_services.Services.database","href":"ramaz_services/Services/database.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Services.hashCode","href":"ramaz_services/Services/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"init","qualifiedName":"ramaz_services.Services.init","href":"ramaz_services/Services/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"instance","qualifiedName":"ramaz_services.Services.instance","href":"ramaz_services/Services/instance.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"isReady","qualifiedName":"ramaz_services.Services.isReady","href":"ramaz_services/Services/isReady.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Services.noSuchMethod","href":"ramaz_services/Services/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"notifications","qualifiedName":"ramaz_services.Services.notifications","href":"ramaz_services/Services/notifications.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"prefs","qualifiedName":"ramaz_services.Services.prefs","href":"ramaz_services/Services/prefs.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"pushNotifications","qualifiedName":"ramaz_services.Services.pushNotifications","href":"ramaz_services/Services/pushNotifications.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Services.runtimeType","href":"ramaz_services/Services/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"services","qualifiedName":"ramaz_services.Services.services","href":"ramaz_services/Services/services.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"signIn","qualifiedName":"ramaz_services.Services.signIn","href":"ramaz_services/Services/signIn.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Services.toString","href":"ramaz_services/Services/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"widgets","qualifiedName":"widgets","href":"widgets/widgets-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"ActivityTile","qualifiedName":"widgets.ActivityTile","href":"widgets/ActivityTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ActivityTile","qualifiedName":"widgets.ActivityTile.ActivityTile","href":"widgets/ActivityTile/ActivityTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityTile","type":"class"}},{"name":"activity","qualifiedName":"widgets.ActivityTile.activity","href":"widgets/ActivityTile/activity.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityTile","type":"class"}},{"name":"build","qualifiedName":"widgets.ActivityTile.build","href":"widgets/ActivityTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ActivityTile","type":"class"}},{"name":"detailedActivities","qualifiedName":"widgets.ActivityTile.detailedActivities","href":"widgets/ActivityTile/detailedActivities-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityTile","type":"class"}},{"name":"BrightnessChanger","qualifiedName":"widgets.BrightnessChanger","href":"widgets/BrightnessChanger-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"BrightnessChanger","qualifiedName":"widgets.BrightnessChanger.BrightnessChanger","href":"widgets/BrightnessChanger/BrightnessChanger.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChanger","type":"class"}},{"name":"createState","qualifiedName":"widgets.BrightnessChanger.createState","href":"widgets/BrightnessChanger/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChanger","type":"class"}},{"name":"BrightnessChanger.dropdown","qualifiedName":"widgets.BrightnessChanger.dropdown","href":"widgets/BrightnessChanger/BrightnessChanger.dropdown.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChanger","type":"class"}},{"name":"form","qualifiedName":"widgets.BrightnessChanger.form","href":"widgets/BrightnessChanger/form.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChanger","type":"class"}},{"name":"BrightnessChanger.iconButton","qualifiedName":"widgets.BrightnessChanger.iconButton","href":"widgets/BrightnessChanger/BrightnessChanger.iconButton.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChanger","type":"class"}},{"name":"BrightnessChangerForm","qualifiedName":"widgets.BrightnessChangerForm","href":"widgets/BrightnessChangerForm-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"operator ==","qualifiedName":"widgets.BrightnessChangerForm.==","href":"widgets/BrightnessChangerForm/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerForm","type":"enum"}},{"name":"hashCode","qualifiedName":"widgets.BrightnessChangerForm.hashCode","href":"widgets/BrightnessChangerForm/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerForm","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"widgets.BrightnessChangerForm.noSuchMethod","href":"widgets/BrightnessChangerForm/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerForm","type":"enum"}},{"name":"runtimeType","qualifiedName":"widgets.BrightnessChangerForm.runtimeType","href":"widgets/BrightnessChangerForm/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerForm","type":"enum"}},{"name":"toString","qualifiedName":"widgets.BrightnessChangerForm.toString","href":"widgets/BrightnessChangerForm/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerForm","type":"enum"}},{"name":"BrightnessChangerState","qualifiedName":"widgets.BrightnessChangerState","href":"widgets/BrightnessChangerState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"BrightnessChangerState","qualifiedName":"widgets.BrightnessChangerState.BrightnessChangerState","href":"widgets/BrightnessChangerState/BrightnessChangerState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerState","type":"class"}},{"name":"build","qualifiedName":"widgets.BrightnessChangerState.build","href":"widgets/BrightnessChangerState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerState","type":"class"}},{"name":"buttonToggle","qualifiedName":"widgets.BrightnessChangerState.buttonToggle","href":"widgets/BrightnessChangerState/buttonToggle.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerState","type":"class"}},{"name":"icon","qualifiedName":"widgets.BrightnessChangerState.icon","href":"widgets/BrightnessChangerState/icon.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerState","type":"class"}},{"name":"setBrightness","qualifiedName":"widgets.BrightnessChangerState.setBrightness","href":"widgets/BrightnessChangerState/setBrightness.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerState","type":"class"}},{"name":"CalendarTile","qualifiedName":"widgets.CalendarTile","href":"widgets/CalendarTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"CalendarTile","qualifiedName":"widgets.CalendarTile.CalendarTile","href":"widgets/CalendarTile/CalendarTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarTile","type":"class"}},{"name":"blank","qualifiedName":"widgets.CalendarTile.blank","href":"widgets/CalendarTile/blank-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarTile","type":"class"}},{"name":"build","qualifiedName":"widgets.CalendarTile.build","href":"widgets/CalendarTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"CalendarTile","type":"class"}},{"name":"date","qualifiedName":"widgets.CalendarTile.date","href":"widgets/CalendarTile/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarTile","type":"class"}},{"name":"day","qualifiedName":"widgets.CalendarTile.day","href":"widgets/CalendarTile/day.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarTile","type":"class"}},{"name":"ClassList","qualifiedName":"widgets.ClassList","href":"widgets/ClassList-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ClassList","qualifiedName":"widgets.ClassList.ClassList","href":"widgets/ClassList/ClassList.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"build","qualifiedName":"widgets.ClassList.build","href":"widgets/ClassList/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"day","qualifiedName":"widgets.ClassList.day","href":"widgets/ClassList/day.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"getPanel","qualifiedName":"widgets.ClassList.getPanel","href":"widgets/ClassList/getPanel.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"headerText","qualifiedName":"widgets.ClassList.headerText","href":"widgets/ClassList/headerText.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"periods","qualifiedName":"widgets.ClassList.periods","href":"widgets/ClassList/periods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"ClassPanel","qualifiedName":"widgets.ClassPanel","href":"widgets/ClassPanel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ClassPanel","qualifiedName":"widgets.ClassPanel.ClassPanel","href":"widgets/ClassPanel/ClassPanel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"activity","qualifiedName":"widgets.ClassPanel.activity","href":"widgets/ClassPanel/activity.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"build","qualifiedName":"widgets.ClassPanel.build","href":"widgets/ClassPanel/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"children","qualifiedName":"widgets.ClassPanel.children","href":"widgets/ClassPanel/children.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"reminders","qualifiedName":"widgets.ClassPanel.reminders","href":"widgets/ClassPanel/reminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"title","qualifiedName":"widgets.ClassPanel.title","href":"widgets/ClassPanel/title.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"Footer","qualifiedName":"widgets.Footer","href":"widgets/Footer-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"Footer","qualifiedName":"widgets.Footer.Footer","href":"widgets/Footer/Footer.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Footer","type":"class"}},{"name":"build","qualifiedName":"widgets.Footer.build","href":"widgets/Footer/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Footer","type":"class"}},{"name":"textScale","qualifiedName":"widgets.Footer.textScale","href":"widgets/Footer/textScale-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Footer","type":"class"}},{"name":"LayoutInfo","qualifiedName":"widgets.LayoutInfo","href":"widgets/LayoutInfo-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"operator ==","qualifiedName":"widgets.LayoutInfo.==","href":"widgets/LayoutInfo/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"LayoutInfo","qualifiedName":"widgets.LayoutInfo.LayoutInfo","href":"widgets/LayoutInfo/LayoutInfo.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"hasBottomNavBar","qualifiedName":"widgets.LayoutInfo.hasBottomNavBar","href":"widgets/LayoutInfo/hasBottomNavBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"hasNavRail","qualifiedName":"widgets.LayoutInfo.hasNavRail","href":"widgets/LayoutInfo/hasNavRail.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"hasStandardDrawer","qualifiedName":"widgets.LayoutInfo.hasStandardDrawer","href":"widgets/LayoutInfo/hasStandardDrawer.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"hasStandardSideSheet","qualifiedName":"widgets.LayoutInfo.hasStandardSideSheet","href":"widgets/LayoutInfo/hasStandardSideSheet.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"hashCode","qualifiedName":"widgets.LayoutInfo.hashCode","href":"widgets/LayoutInfo/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"isDesktop","qualifiedName":"widgets.LayoutInfo.isDesktop","href":"widgets/LayoutInfo/isDesktop.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"isMobile","qualifiedName":"widgets.LayoutInfo.isMobile","href":"widgets/LayoutInfo/isMobile.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"isTabletLandscape","qualifiedName":"widgets.LayoutInfo.isTabletLandscape","href":"widgets/LayoutInfo/isTabletLandscape.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"isTabletPortrait","qualifiedName":"widgets.LayoutInfo.isTabletPortrait","href":"widgets/LayoutInfo/isTabletPortrait.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"noSuchMethod","qualifiedName":"widgets.LayoutInfo.noSuchMethod","href":"widgets/LayoutInfo/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"runtimeType","qualifiedName":"widgets.LayoutInfo.runtimeType","href":"widgets/LayoutInfo/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"toString","qualifiedName":"widgets.LayoutInfo.toString","href":"widgets/LayoutInfo/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"windowType","qualifiedName":"widgets.LayoutInfo.windowType","href":"widgets/LayoutInfo/windowType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"LinkIcon","qualifiedName":"widgets.LinkIcon","href":"widgets/LinkIcon-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"LinkIcon","qualifiedName":"widgets.LinkIcon.LinkIcon","href":"widgets/LinkIcon/LinkIcon.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LinkIcon","type":"class"}},{"name":"build","qualifiedName":"widgets.LinkIcon.build","href":"widgets/LinkIcon/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LinkIcon","type":"class"}},{"name":"path","qualifiedName":"widgets.LinkIcon.path","href":"widgets/LinkIcon/path.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LinkIcon","type":"class"}},{"name":"url","qualifiedName":"widgets.LinkIcon.url","href":"widgets/LinkIcon/url.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LinkIcon","type":"class"}},{"name":"LoadingImage","qualifiedName":"widgets.LoadingImage","href":"widgets/LoadingImage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"LoadingImage","qualifiedName":"widgets.LoadingImage.LoadingImage","href":"widgets/LoadingImage/LoadingImage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImage","type":"class"}},{"name":"aspectRatio","qualifiedName":"widgets.LoadingImage.aspectRatio","href":"widgets/LoadingImage/aspectRatio.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImage","type":"class"}},{"name":"createState","qualifiedName":"widgets.LoadingImage.createState","href":"widgets/LoadingImage/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoadingImage","type":"class"}},{"name":"image","qualifiedName":"widgets.LoadingImage.image","href":"widgets/LoadingImage/image.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImage","type":"class"}},{"name":"LoadingImageState","qualifiedName":"widgets.LoadingImageState","href":"widgets/LoadingImageState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"LoadingImageState","qualifiedName":"widgets.LoadingImageState.LoadingImageState","href":"widgets/LoadingImageState/LoadingImageState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"aspectRatio","qualifiedName":"widgets.LoadingImageState.aspectRatio","href":"widgets/LoadingImageState/aspectRatio.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"build","qualifiedName":"widgets.LoadingImageState.build","href":"widgets/LoadingImageState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"dispose","qualifiedName":"widgets.LoadingImageState.dispose","href":"widgets/LoadingImageState/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"initState","qualifiedName":"widgets.LoadingImageState.initState","href":"widgets/LoadingImageState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"listener","qualifiedName":"widgets.LoadingImageState.listener","href":"widgets/LoadingImageState/listener.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"loading","qualifiedName":"widgets.LoadingImageState.loading","href":"widgets/LoadingImageState/loading.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"onLoad","qualifiedName":"widgets.LoadingImageState.onLoad","href":"widgets/LoadingImageState/onLoad.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"stream","qualifiedName":"widgets.LoadingImageState.stream","href":"widgets/LoadingImageState/stream.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"Logos","qualifiedName":"widgets.Logos","href":"widgets/Logos-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"operator ==","qualifiedName":"widgets.Logos.==","href":"widgets/Logos/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"Logos","qualifiedName":"widgets.Logos.Logos","href":"widgets/Logos/Logos.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"drive","qualifiedName":"widgets.Logos.drive","href":"widgets/Logos/drive-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"google","qualifiedName":"widgets.Logos.google","href":"widgets/Logos/google-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"hashCode","qualifiedName":"widgets.Logos.hashCode","href":"widgets/Logos/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"noSuchMethod","qualifiedName":"widgets.Logos.noSuchMethod","href":"widgets/Logos/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"outlook","qualifiedName":"widgets.Logos.outlook","href":"widgets/Logos/outlook-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"ramazIcon","qualifiedName":"widgets.Logos.ramazIcon","href":"widgets/Logos/ramazIcon-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"runtimeType","qualifiedName":"widgets.Logos.runtimeType","href":"widgets/Logos/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"schoology","qualifiedName":"widgets.Logos.schoology","href":"widgets/Logos/schoology-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"seniorSystems","qualifiedName":"widgets.Logos.seniorSystems","href":"widgets/Logos/seniorSystems-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"toString","qualifiedName":"widgets.Logos.toString","href":"widgets/Logos/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"ModelBuilder","qualifiedName":"widgets.ModelBuilder","href":"widgets/ModelBuilder.html","type":"typedef","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ModelListener","qualifiedName":"widgets.ModelListener","href":"widgets/ModelListener-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ModelListener","qualifiedName":"widgets.ModelListener.ModelListener","href":"widgets/ModelListener/ModelListener.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"builder","qualifiedName":"widgets.ModelListener.builder","href":"widgets/ModelListener/builder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"child","qualifiedName":"widgets.ModelListener.child","href":"widgets/ModelListener/child.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"createState","qualifiedName":"widgets.ModelListener.createState","href":"widgets/ModelListener/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"dispose","qualifiedName":"widgets.ModelListener.dispose","href":"widgets/ModelListener/dispose.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"model","qualifiedName":"widgets.ModelListener.model","href":"widgets/ModelListener/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"ModelListenerState","qualifiedName":"widgets.ModelListenerState","href":"widgets/ModelListenerState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ModelListenerState","qualifiedName":"widgets.ModelListenerState.ModelListenerState","href":"widgets/ModelListenerState/ModelListenerState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"build","qualifiedName":"widgets.ModelListenerState.build","href":"widgets/ModelListenerState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"dispose","qualifiedName":"widgets.ModelListenerState.dispose","href":"widgets/ModelListenerState/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"initState","qualifiedName":"widgets.ModelListenerState.initState","href":"widgets/ModelListenerState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"listener","qualifiedName":"widgets.ModelListenerState.listener","href":"widgets/ModelListenerState/listener.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"model","qualifiedName":"widgets.ModelListenerState.model","href":"widgets/ModelListenerState/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"NavigationItem","qualifiedName":"widgets.NavigationItem","href":"widgets/NavigationItem-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"NavigationItem","qualifiedName":"widgets.NavigationItem.NavigationItem","href":"widgets/NavigationItem/NavigationItem.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"appBar","qualifiedName":"widgets.NavigationItem.appBar","href":"widgets/NavigationItem/appBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"bottomNavBar","qualifiedName":"widgets.NavigationItem.bottomNavBar","href":"widgets/NavigationItem/bottomNavBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"floatingActionButton","qualifiedName":"widgets.NavigationItem.floatingActionButton","href":"widgets/NavigationItem/floatingActionButton.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"floatingActionButtonLocation","qualifiedName":"widgets.NavigationItem.floatingActionButtonLocation","href":"widgets/NavigationItem/floatingActionButtonLocation.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"icon","qualifiedName":"widgets.NavigationItem.icon","href":"widgets/NavigationItem/icon.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"label","qualifiedName":"widgets.NavigationItem.label","href":"widgets/NavigationItem/label.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"navRail","qualifiedName":"widgets.NavigationItem.navRail","href":"widgets/NavigationItem/navRail.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"sideSheet","qualifiedName":"widgets.NavigationItem.sideSheet","href":"widgets/NavigationItem/sideSheet.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"NextClass","qualifiedName":"widgets.NextClass","href":"widgets/NextClass-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"NextClass","qualifiedName":"widgets.NextClass.NextClass","href":"widgets/NextClass/NextClass.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"build","qualifiedName":"widgets.NextClass.build","href":"widgets/NextClass/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"next","qualifiedName":"widgets.NextClass.next","href":"widgets/NextClass/next.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"period","qualifiedName":"widgets.NextClass.period","href":"widgets/NextClass/period.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"reminders","qualifiedName":"widgets.NextClass.reminders","href":"widgets/NextClass/reminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"subject","qualifiedName":"widgets.NextClass.subject","href":"widgets/NextClass/subject.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"PeriodTile","qualifiedName":"widgets.PeriodTile","href":"widgets/PeriodTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"PeriodTile","qualifiedName":"widgets.PeriodTile.PeriodTile","href":"widgets/PeriodTile/PeriodTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"activity","qualifiedName":"widgets.PeriodTile.activity","href":"widgets/PeriodTile/activity.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"build","qualifiedName":"widgets.PeriodTile.build","href":"widgets/PeriodTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"end","qualifiedName":"widgets.PeriodTile.end","href":"widgets/PeriodTile/end.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"getRange","qualifiedName":"widgets.PeriodTile.getRange","href":"widgets/PeriodTile/getRange.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"index","qualifiedName":"widgets.PeriodTile.index","href":"widgets/PeriodTile/index.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"model","qualifiedName":"widgets.PeriodTile.model","href":"widgets/PeriodTile/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"range","qualifiedName":"widgets.PeriodTile.range","href":"widgets/PeriodTile/range.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"start","qualifiedName":"widgets.PeriodTile.start","href":"widgets/PeriodTile/start.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"RamazLogos","qualifiedName":"widgets.RamazLogos","href":"widgets/RamazLogos-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"operator ==","qualifiedName":"widgets.RamazLogos.==","href":"widgets/RamazLogos/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"RamazLogos","qualifiedName":"widgets.RamazLogos.RamazLogos","href":"widgets/RamazLogos/RamazLogos.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"hashCode","qualifiedName":"widgets.RamazLogos.hashCode","href":"widgets/RamazLogos/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"noSuchMethod","qualifiedName":"widgets.RamazLogos.noSuchMethod","href":"widgets/RamazLogos/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"ramRectangle","qualifiedName":"widgets.RamazLogos.ramRectangle","href":"widgets/RamazLogos/ramRectangle-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"ramSquare","qualifiedName":"widgets.RamazLogos.ramSquare","href":"widgets/RamazLogos/ramSquare-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"ramSquareWords","qualifiedName":"widgets.RamazLogos.ramSquareWords","href":"widgets/RamazLogos/ramSquareWords-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"runtimeType","qualifiedName":"widgets.RamazLogos.runtimeType","href":"widgets/RamazLogos/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"teal","qualifiedName":"widgets.RamazLogos.teal","href":"widgets/RamazLogos/teal-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"toString","qualifiedName":"widgets.RamazLogos.toString","href":"widgets/RamazLogos/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"ReminderTile","qualifiedName":"widgets.ReminderTile","href":"widgets/ReminderTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ReminderTile","qualifiedName":"widgets.ReminderTile.ReminderTile","href":"widgets/ReminderTile/ReminderTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTile","type":"class"}},{"name":"build","qualifiedName":"widgets.ReminderTile.build","href":"widgets/ReminderTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderTile","type":"class"}},{"name":"height","qualifiedName":"widgets.ReminderTile.height","href":"widgets/ReminderTile/height.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTile","type":"class"}},{"name":"index","qualifiedName":"widgets.ReminderTile.index","href":"widgets/ReminderTile/index.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTile","type":"class"}},{"name":"ResponsiveBuilder","qualifiedName":"widgets.ResponsiveBuilder","href":"widgets/ResponsiveBuilder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ResponsiveBuilder","qualifiedName":"widgets.ResponsiveBuilder.ResponsiveBuilder","href":"widgets/ResponsiveBuilder/ResponsiveBuilder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveBuilder","type":"class"}},{"name":"build","qualifiedName":"widgets.ResponsiveBuilder.build","href":"widgets/ResponsiveBuilder/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveBuilder","type":"class"}},{"name":"builder","qualifiedName":"widgets.ResponsiveBuilder.builder","href":"widgets/ResponsiveBuilder/builder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveBuilder","type":"class"}},{"name":"child","qualifiedName":"widgets.ResponsiveBuilder.child","href":"widgets/ResponsiveBuilder/child.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveBuilder","type":"class"}},{"name":"ResponsiveScaffold","qualifiedName":"widgets.ResponsiveScaffold","href":"widgets/ResponsiveScaffold-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ResponsiveScaffold","qualifiedName":"widgets.ResponsiveScaffold.ResponsiveScaffold","href":"widgets/ResponsiveScaffold/ResponsiveScaffold.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"appBar","qualifiedName":"widgets.ResponsiveScaffold.appBar","href":"widgets/ResponsiveScaffold/appBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"bodyBuilder","qualifiedName":"widgets.ResponsiveScaffold.bodyBuilder","href":"widgets/ResponsiveScaffold/bodyBuilder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"build","qualifiedName":"widgets.ResponsiveScaffold.build","href":"widgets/ResponsiveScaffold/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"drawer","qualifiedName":"widgets.ResponsiveScaffold.drawer","href":"widgets/ResponsiveScaffold/drawer.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"floatingActionButton","qualifiedName":"widgets.ResponsiveScaffold.floatingActionButton","href":"widgets/ResponsiveScaffold/floatingActionButton.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"floatingActionButtonLocation","qualifiedName":"widgets.ResponsiveScaffold.floatingActionButtonLocation","href":"widgets/ResponsiveScaffold/floatingActionButtonLocation.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"hasNavBar","qualifiedName":"widgets.ResponsiveScaffold.hasNavBar","href":"widgets/ResponsiveScaffold/hasNavBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"ResponsiveScaffold.navBar","qualifiedName":"widgets.ResponsiveScaffold.navBar","href":"widgets/ResponsiveScaffold/ResponsiveScaffold.navBar.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"navIndex","qualifiedName":"widgets.ResponsiveScaffold.navIndex","href":"widgets/ResponsiveScaffold/navIndex.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"navItems","qualifiedName":"widgets.ResponsiveScaffold.navItems","href":"widgets/ResponsiveScaffold/navItems.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"onNavIndexChanged","qualifiedName":"widgets.ResponsiveScaffold.onNavIndexChanged","href":"widgets/ResponsiveScaffold/onNavIndexChanged.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"secondaryDrawer","qualifiedName":"widgets.ResponsiveScaffold.secondaryDrawer","href":"widgets/ResponsiveScaffold/secondaryDrawer.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"sideSheet","qualifiedName":"widgets.ResponsiveScaffold.sideSheet","href":"widgets/ResponsiveScaffold/sideSheet.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"ResponsiveWidgetBuilder","qualifiedName":"widgets.ResponsiveWidgetBuilder","href":"widgets/ResponsiveWidgetBuilder.html","type":"typedef","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ScoreUpdaterState","qualifiedName":"widgets.ScoreUpdaterState","href":"widgets/ScoreUpdaterState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ScoreUpdaterState","qualifiedName":"widgets.ScoreUpdaterState.ScoreUpdaterState","href":"widgets/ScoreUpdaterState/ScoreUpdaterState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"build","qualifiedName":"widgets.ScoreUpdaterState.build","href":"widgets/ScoreUpdaterState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"initState","qualifiedName":"widgets.ScoreUpdaterState.initState","href":"widgets/ScoreUpdaterState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"otherController","qualifiedName":"widgets.ScoreUpdaterState.otherController","href":"widgets/ScoreUpdaterState/otherController.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"otherScore","qualifiedName":"widgets.ScoreUpdaterState.otherScore","href":"widgets/ScoreUpdaterState/otherScore.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"ramazController","qualifiedName":"widgets.ScoreUpdaterState.ramazController","href":"widgets/ScoreUpdaterState/ramazController.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"ramazScore","qualifiedName":"widgets.ScoreUpdaterState.ramazScore","href":"widgets/ScoreUpdaterState/ramazScore.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"ready","qualifiedName":"widgets.ScoreUpdaterState.ready","href":"widgets/ScoreUpdaterState/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"scores","qualifiedName":"widgets.ScoreUpdaterState.scores","href":"widgets/ScoreUpdaterState/scores.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"SpecialTile","qualifiedName":"widgets.SpecialTile","href":"widgets/SpecialTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"SpecialTile","qualifiedName":"widgets.SpecialTile.SpecialTile","href":"widgets/SpecialTile/SpecialTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SpecialTile","type":"class"}},{"name":"build","qualifiedName":"widgets.SpecialTile.build","href":"widgets/SpecialTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SpecialTile","type":"class"}},{"name":"child","qualifiedName":"widgets.SpecialTile.child","href":"widgets/SpecialTile/child.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SpecialTile","type":"class"}},{"name":"SportsIcons","qualifiedName":"widgets.SportsIcons","href":"widgets/SportsIcons-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"operator ==","qualifiedName":"widgets.SportsIcons.==","href":"widgets/SportsIcons/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"SportsIcons","qualifiedName":"widgets.SportsIcons.SportsIcons","href":"widgets/SportsIcons/SportsIcons.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"baseball","qualifiedName":"widgets.SportsIcons.baseball","href":"widgets/SportsIcons/baseball-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"basketball","qualifiedName":"widgets.SportsIcons.basketball","href":"widgets/SportsIcons/basketball-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"hashCode","qualifiedName":"widgets.SportsIcons.hashCode","href":"widgets/SportsIcons/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"hockey","qualifiedName":"widgets.SportsIcons.hockey","href":"widgets/SportsIcons/hockey-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"noSuchMethod","qualifiedName":"widgets.SportsIcons.noSuchMethod","href":"widgets/SportsIcons/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"runtimeType","qualifiedName":"widgets.SportsIcons.runtimeType","href":"widgets/SportsIcons/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"soccer","qualifiedName":"widgets.SportsIcons.soccer","href":"widgets/SportsIcons/soccer-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"tennis","qualifiedName":"widgets.SportsIcons.tennis","href":"widgets/SportsIcons/tennis-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"toString","qualifiedName":"widgets.SportsIcons.toString","href":"widgets/SportsIcons/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"volleyball","qualifiedName":"widgets.SportsIcons.volleyball","href":"widgets/SportsIcons/volleyball-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"SportsScoreUpdater","qualifiedName":"widgets.SportsScoreUpdater","href":"widgets/SportsScoreUpdater-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"SportsScoreUpdater","qualifiedName":"widgets.SportsScoreUpdater.SportsScoreUpdater","href":"widgets/SportsScoreUpdater/SportsScoreUpdater.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsScoreUpdater","type":"class"}},{"name":"createState","qualifiedName":"widgets.SportsScoreUpdater.createState","href":"widgets/SportsScoreUpdater/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsScoreUpdater","type":"class"}},{"name":"game","qualifiedName":"widgets.SportsScoreUpdater.game","href":"widgets/SportsScoreUpdater/game.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsScoreUpdater","type":"class"}},{"name":"updateScores","qualifiedName":"widgets.SportsScoreUpdater.updateScores","href":"widgets/SportsScoreUpdater/updateScores.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsScoreUpdater","type":"class"}},{"name":"SportsStats","qualifiedName":"widgets.SportsStats","href":"widgets/SportsStats-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"SportsStats","qualifiedName":"widgets.SportsStats.SportsStats","href":"widgets/SportsStats/SportsStats.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsStats","type":"class"}},{"name":"build","qualifiedName":"widgets.SportsStats.build","href":"widgets/SportsStats/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsStats","type":"class"}},{"name":"dateTime","qualifiedName":"widgets.SportsStats.dateTime","href":"widgets/SportsStats/dateTime.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsStats","type":"class"}},{"name":"score","qualifiedName":"widgets.SportsStats.score","href":"widgets/SportsStats/score.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsStats","type":"class"}},{"name":"team","qualifiedName":"widgets.SportsStats.team","href":"widgets/SportsStats/team.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsStats","type":"class"}},{"name":"SportsTile","qualifiedName":"widgets.SportsTile","href":"widgets/SportsTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"SportsTile","qualifiedName":"widgets.SportsTile.SportsTile","href":"widgets/SportsTile/SportsTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"build","qualifiedName":"widgets.SportsTile.build","href":"widgets/SportsTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"cardColor","qualifiedName":"widgets.SportsTile.cardColor","href":"widgets/SportsTile/cardColor.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"formatDate","qualifiedName":"widgets.SportsTile.formatDate","href":"widgets/SportsTile/formatDate.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"game","qualifiedName":"widgets.SportsTile.game","href":"widgets/SportsTile/game.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"icon","qualifiedName":"widgets.SportsTile.icon","href":"widgets/SportsTile/icon.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"onTap","qualifiedName":"widgets.SportsTile.onTap","href":"widgets/SportsTile/onTap.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"padLength","qualifiedName":"widgets.SportsTile.padLength","href":"widgets/SportsTile/padLength.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"ThemeBuilder","qualifiedName":"widgets.ThemeBuilder","href":"widgets/ThemeBuilder.html","type":"typedef","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ThemeChanger","qualifiedName":"widgets.ThemeChanger","href":"widgets/ThemeChanger-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ThemeChanger","qualifiedName":"widgets.ThemeChanger.ThemeChanger","href":"widgets/ThemeChanger/ThemeChanger.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"builder","qualifiedName":"widgets.ThemeChanger.builder","href":"widgets/ThemeChanger/builder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"createState","qualifiedName":"widgets.ThemeChanger.createState","href":"widgets/ThemeChanger/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"dark","qualifiedName":"widgets.ThemeChanger.dark","href":"widgets/ThemeChanger/dark.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"defaultBrightness","qualifiedName":"widgets.ThemeChanger.defaultBrightness","href":"widgets/ThemeChanger/defaultBrightness.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"light","qualifiedName":"widgets.ThemeChanger.light","href":"widgets/ThemeChanger/light.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"of","qualifiedName":"widgets.ThemeChanger.of","href":"widgets/ThemeChanger/of.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"themes","qualifiedName":"widgets.ThemeChanger.themes","href":"widgets/ThemeChanger/themes.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"ThemeChangerState","qualifiedName":"widgets.ThemeChangerState","href":"widgets/ThemeChangerState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ThemeChangerState","qualifiedName":"widgets.ThemeChangerState.ThemeChangerState","href":"widgets/ThemeChangerState/ThemeChangerState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"brightness","qualifiedName":"widgets.ThemeChangerState.brightness","href":"widgets/ThemeChangerState/brightness.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"build","qualifiedName":"widgets.ThemeChangerState.build","href":"widgets/ThemeChangerState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"initState","qualifiedName":"widgets.ThemeChangerState.initState","href":"widgets/ThemeChangerState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"theme","qualifiedName":"widgets.ThemeChangerState.theme","href":"widgets/ThemeChangerState/theme.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"themeName","qualifiedName":"widgets.ThemeChangerState.themeName","href":"widgets/ThemeChangerState/themeName.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"caseConverter","qualifiedName":"widgets.caseConverter","href":"widgets/caseConverter.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"pickDate","qualifiedName":"widgets.pickDate","href":"widgets/pickDate.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}}] diff --git a/docs/main/main-library.html b/docs/main/main-library.html new file mode 100644 index 000000000..51a646387 --- /dev/null +++ b/docs/main/main-library.html @@ -0,0 +1,150 @@ + + + + + + + + main library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
main
+ +
+ +
+ + + + +
+
+ +

main library + Null safety + +

+ + + + + + + + + +
+

Functions

+ +
+
+ main() + → void + + + +
+
+ + + +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/main/main.html b/docs/main/main.html new file mode 100644 index 000000000..e441fd6f0 --- /dev/null +++ b/docs/main/main.html @@ -0,0 +1,124 @@ + + + + + + + + main function - main library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
main
+ +
+ +
+ + + + +
+
+ +

main function + Null safety + +

+ +
+ + +void +main() + +
+ + + + +
+

Implementation

+
void main() => runApp(const RamLife());
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/AdminScheduleModel-class.html b/docs/models/AdminScheduleModel-class.html new file mode 100644 index 000000000..6c9fbfe22 --- /dev/null +++ b/docs/models/AdminScheduleModel-class.html @@ -0,0 +1,399 @@ + + + + + + + + AdminScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
AdminScheduleModel
+ +
+ +
+ + + + +
+
+ +

AdminScheduleModel class + Null safety + +

+ + + + +
+
+ + +
Mixed in types
+
+ + + +
+
+ +
+

Constructors

+ +
+
+ AdminScheduleModel() +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ jsonSchedules + → List<Map> + +
+
+ +
read-only
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ schedules + → List<Schedule> + +
+
+ +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ createSchedule(Schedule schedule) + → Future<void> + + + +
+
+ + + +
+ +
+ deleteSchedule(Schedule schedule) + → Future<void> + + + +
+
+ + + +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
@mustCallSuper, inherited
+ +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ saveSchedules() + → Future<void> + + + +
+
+ + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/AdminScheduleModel/AdminScheduleModel.html b/docs/models/AdminScheduleModel/AdminScheduleModel.html new file mode 100644 index 000000000..04e18b077 --- /dev/null +++ b/docs/models/AdminScheduleModel/AdminScheduleModel.html @@ -0,0 +1,139 @@ + + + + + + + + AdminScheduleModel constructor - AdminScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
AdminScheduleModel
+ +
+ +
+ + + + +
+
+ +

AdminScheduleModel constructor + Null safety +

+ +
+ AdminScheduleModel() +
+ + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/AdminScheduleModel/createSchedule.html b/docs/models/AdminScheduleModel/createSchedule.html new file mode 100644 index 000000000..20bed8c22 --- /dev/null +++ b/docs/models/AdminScheduleModel/createSchedule.html @@ -0,0 +1,152 @@ + + + + + + + + createSchedule method - AdminScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
createSchedule
+ +
+ +
+ + + + +
+
+ +

createSchedule method + Null safety +

+ +
+ + +Future<void> +createSchedule(
  1. Schedule schedule
  2. +
) + + + +
+ + + + +
+

Implementation

+
Future<void> createSchedule(Schedule schedule) async {
+	schedules.add(schedule);
+	return saveSchedules();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/AdminScheduleModel/deleteSchedule.html b/docs/models/AdminScheduleModel/deleteSchedule.html new file mode 100644 index 000000000..8d2a732bb --- /dev/null +++ b/docs/models/AdminScheduleModel/deleteSchedule.html @@ -0,0 +1,154 @@ + + + + + + + + deleteSchedule method - AdminScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
deleteSchedule
+ +
+ +
+ + + + +
+
+ +

deleteSchedule method + Null safety +

+ +
+ + +Future<void> +deleteSchedule(
  1. Schedule schedule
  2. +
) + + + +
+ + + + +
+

Implementation

+
Future<void> deleteSchedule(Schedule schedule) async {
+	schedules.removeWhere(
+		(Schedule other) => other.name == schedule.name
+	);
+	return saveSchedules();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/AdminScheduleModel/jsonSchedules.html b/docs/models/AdminScheduleModel/jsonSchedules.html new file mode 100644 index 000000000..d192eee7c --- /dev/null +++ b/docs/models/AdminScheduleModel/jsonSchedules.html @@ -0,0 +1,154 @@ + + + + + + + + jsonSchedules property - AdminScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
jsonSchedules
+ +
+ +
+ + + + +
+
+ +

jsonSchedules property + Null safety +

+ + + +
+ +
+ List<Map> + jsonSchedules + + +
+ + + + +
+

Implementation

+
List<Map> get jsonSchedules => [
+	for (final Schedule schedule in schedules)
+		schedule.toJson()
+];
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/AdminScheduleModel/saveSchedules.html b/docs/models/AdminScheduleModel/saveSchedules.html new file mode 100644 index 000000000..b094cc150 --- /dev/null +++ b/docs/models/AdminScheduleModel/saveSchedules.html @@ -0,0 +1,152 @@ + + + + + + + + saveSchedules method - AdminScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
saveSchedules
+ +
+ +
+ + + + +
+
+ +

saveSchedules method + Null safety +

+ +
+ + +Future<void> +saveSchedules() + + + +
+ + + + +
+

Implementation

+
Future<void> saveSchedules() async {
+	await Services.instance.database.saveSchedules(jsonSchedules);
+	Schedule.schedules = schedules;
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/AdminScheduleModel/schedules.html b/docs/models/AdminScheduleModel/schedules.html new file mode 100644 index 000000000..46efdec23 --- /dev/null +++ b/docs/models/AdminScheduleModel/schedules.html @@ -0,0 +1,146 @@ + + + + + + + + schedules property - AdminScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schedules
+ +
+ +
+ + + + +
+
+ +

schedules property + Null safety +

+ +
+ List<Schedule> + schedules +
final
+ +
+ + + +
+

Implementation

+
final List<Schedule> schedules = Schedule.schedules;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarDay-class.html b/docs/models/CalendarDay-class.html new file mode 100644 index 000000000..f0ce4d7b3 --- /dev/null +++ b/docs/models/CalendarDay-class.html @@ -0,0 +1,272 @@ + + + + + + + + CalendarDay class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
CalendarDay
+ +
+ +
+ + + + +
+
+ +

CalendarDay class + Null safety + +

+ + + + + +
+

Constructors

+ +
+
+ CalendarDay({required DateTime date, required Day? schoolDay}) +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ date + → DateTime + +
+
+ +
final
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ schoolDay + Day? + +
+
+ +
read / write
+ +
+ +
+
+ +
+

Methods

+
+
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarDay/CalendarDay.html b/docs/models/CalendarDay/CalendarDay.html new file mode 100644 index 000000000..16fafcccf --- /dev/null +++ b/docs/models/CalendarDay/CalendarDay.html @@ -0,0 +1,137 @@ + + + + + + + + CalendarDay constructor - CalendarDay class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
CalendarDay
+ +
+ +
+ + + + +
+
+ +

CalendarDay constructor + Null safety +

+ +
+ CalendarDay(
  1. {required DateTime date,
  2. +
  3. required Day? schoolDay}
  4. +
) +
+ + + + + +
+

Implementation

+
CalendarDay({required this.date, required this.schoolDay});
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarDay/date.html b/docs/models/CalendarDay/date.html new file mode 100644 index 000000000..4bb40558c --- /dev/null +++ b/docs/models/CalendarDay/date.html @@ -0,0 +1,138 @@ + + + + + + + + date property - CalendarDay class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
date
+ +
+ +
+ + + + +
+
+ +

date property + Null safety +

+ +
+ DateTime + date +
final
+ +
+ + + +
+

Implementation

+
final DateTime date;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarDay/hashCode.html b/docs/models/CalendarDay/hashCode.html new file mode 100644 index 000000000..5cb1ac73d --- /dev/null +++ b/docs/models/CalendarDay/hashCode.html @@ -0,0 +1,170 @@ + + + + + + + + hashCode property - CalendarDay class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hashCode
+ +
+ +
+ + + + +
+
+

hashCode property + Null safety +

+ + + +
+ +
+ int + hashCode +
inherited
+ +
+ + +
+

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+
+ + +
+

Implementation

+
external int get hashCode;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarDay/noSuchMethod.html b/docs/models/CalendarDay/noSuchMethod.html new file mode 100644 index 000000000..6bceafbdb --- /dev/null +++ b/docs/models/CalendarDay/noSuchMethod.html @@ -0,0 +1,178 @@ + + + + + + + + noSuchMethod method - CalendarDay class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
noSuchMethod
+ +
+ +
+ + + + +
+
+

noSuchMethod method + Null safety +

+ +
+ + +dynamic +noSuchMethod(
  1. Invocation invocation
  2. +
) + +
inherited
+ +
+ +
+

Invoked when a non-existent method or property is accessed.

+

A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

+
dynamic object = 1;
+object.add(42); // Statically allowed, run-time error
+
+

This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

+

Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

+

A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

+
class MockList<T> implements List<T> {
+  noSuchMethod(Invocation invocation) {
+    log(invocation);
+    super.noSuchMethod(invocation); // Will throw.
+  }
+}
+void main() {
+  MockList().add(42);
+}
+
+

This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

+

If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

+

The default behavior is to throw a NoSuchMethodError.

+
+ + + +
+

Implementation

+
@pragma("vm:entry-point")
+external dynamic noSuchMethod(Invocation invocation);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarDay/operator_equals.html b/docs/models/CalendarDay/operator_equals.html new file mode 100644 index 000000000..d6c9f2d90 --- /dev/null +++ b/docs/models/CalendarDay/operator_equals.html @@ -0,0 +1,169 @@ + + + + + + + + operator == method - CalendarDay class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
operator ==
+ +
+ +
+ + + + +
+
+

operator == method + Null safety +

+ +
+ + +bool +operator ==(
  1. Object other
  2. +
) + +
inherited
+ +
+ +
+

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+
+ + + +
+

Implementation

+
external bool operator ==(Object other);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarDay/runtimeType.html b/docs/models/CalendarDay/runtimeType.html new file mode 100644 index 000000000..7575a730e --- /dev/null +++ b/docs/models/CalendarDay/runtimeType.html @@ -0,0 +1,145 @@ + + + + + + + + runtimeType property - CalendarDay class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
runtimeType
+ +
+ +
+ + + + +
+
+

runtimeType property + Null safety +

+ + + +
+ +
+ Type + runtimeType +
inherited
+ +
+ + +
+

A representation of the runtime type of the object.

+
+ + +
+

Implementation

+
external Type get runtimeType;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarDay/schoolDay.html b/docs/models/CalendarDay/schoolDay.html new file mode 100644 index 000000000..d81b36e4e --- /dev/null +++ b/docs/models/CalendarDay/schoolDay.html @@ -0,0 +1,138 @@ + + + + + + + + schoolDay property - CalendarDay class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schoolDay
+ +
+ +
+ + + + +
+
+ +

schoolDay property + Null safety +

+ +
+ Day? + schoolDay +
read / write
+ +
+ + + +
+

Implementation

+
Day? schoolDay;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarDay/toString.html b/docs/models/CalendarDay/toString.html new file mode 100644 index 000000000..e7b1318ed --- /dev/null +++ b/docs/models/CalendarDay/toString.html @@ -0,0 +1,151 @@ + + + + + + + + toString method - CalendarDay class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toString
+ +
+ +
+ + + + +
+
+

toString method + Null safety +

+ +
+ + +String +toString() + +
inherited
+ +
+ +
+

A string representation of this object.

+

Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

+

Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

+
+ + + +
+

Implementation

+
external String toString();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor-class.html b/docs/models/CalendarEditor-class.html new file mode 100644 index 000000000..59accb86d --- /dev/null +++ b/docs/models/CalendarEditor-class.html @@ -0,0 +1,470 @@ + + + + + + + + CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
CalendarEditor
+ +
+ +
+ + + + +
+
+ +

CalendarEditor class + Null safety + +

+ + +
+

A model to manage the calendar.

+

This model listens to the calendar and can modify it in the database.

+
+ + +
+
+ + +
Mixed in types
+
+ + + +
+
+ +
+

Constructors

+ +
+
+ CalendarEditor() +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ calendar + → List<List<CalendarDay?>?> + +
+
+ The calendar filled with Days. [...] +
final
+ +
+ +
+ daysInMonth + ↔ List<int?> + +
+
+ How many days there are in every month. +
read / write
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ subscriptions + → List<StreamSubscription?> + +
+
+ A list of streams on the Firebase streams. +
final
+ +
+ +
+ years + → List<int> + +
+
+ The year of each month. [...] +
final
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
override
+ +
+ +
+ layoutMonth(List<Day?> cal, int month) + → List<CalendarDay?> + + + +
+
+ Fits the calendar to a 6-week layout. [...] + + +
+ +
+ loadMonth(int month) + → void + + + +
+
+ + + +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+ updateDay({required Day? day, required DateTime date}) + → Future<void> + + + +
+
+ Updates the calendar. + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ +
+

Static Properties

+ +
+
+ currentMonth + → int + +
+
+ The current month. +
final
+ +
+ +
+ currentYear + → int + +
+
+ The current year. +
final
+ +
+ +
+ now + → DateTime + +
+
+ The current date. +
final
+ +
+ +
+
+ + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/CalendarEditor.html b/docs/models/CalendarEditor/CalendarEditor.html new file mode 100644 index 000000000..79a59f1bf --- /dev/null +++ b/docs/models/CalendarEditor/CalendarEditor.html @@ -0,0 +1,145 @@ + + + + + + + + CalendarEditor constructor - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
CalendarEditor
+ +
+ +
+ + + + +
+
+ +

CalendarEditor constructor + Null safety +

+ +
+ CalendarEditor() +
+ + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/calendar.html b/docs/models/CalendarEditor/calendar.html new file mode 100644 index 000000000..03ff24980 --- /dev/null +++ b/docs/models/CalendarEditor/calendar.html @@ -0,0 +1,156 @@ + + + + + + + + calendar property - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
calendar
+ +
+ +
+ + + + +
+
+ +

calendar property + Null safety +

+ +
+ List<List<CalendarDay?>?> + calendar +
final
+ +
+ +
+

The calendar filled with Days.

+

Each month is lazy-loaded from the database, so it's null until selected.

+
+ + +
+

Implementation

+
final List<List<CalendarDay?>?> calendar = List.filled(12, null);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/currentMonth.html b/docs/models/CalendarEditor/currentMonth.html new file mode 100644 index 000000000..ea11beaa3 --- /dev/null +++ b/docs/models/CalendarEditor/currentMonth.html @@ -0,0 +1,155 @@ + + + + + + + + currentMonth property - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
currentMonth
+ +
+ +
+ + + + +
+
+ +

currentMonth property + Null safety +

+ +
+ int + currentMonth +
final
+ +
+ +
+

The current month.

+
+ + +
+

Implementation

+
static final int currentMonth = now.month;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/currentYear.html b/docs/models/CalendarEditor/currentYear.html new file mode 100644 index 000000000..da894435a --- /dev/null +++ b/docs/models/CalendarEditor/currentYear.html @@ -0,0 +1,155 @@ + + + + + + + + currentYear property - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
currentYear
+ +
+ +
+ + + + +
+
+ +

currentYear property + Null safety +

+ +
+ int + currentYear +
final
+ +
+ +
+

The current year.

+
+ + +
+

Implementation

+
static final int currentYear = now.year;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/daysInMonth.html b/docs/models/CalendarEditor/daysInMonth.html new file mode 100644 index 000000000..61ec7851a --- /dev/null +++ b/docs/models/CalendarEditor/daysInMonth.html @@ -0,0 +1,155 @@ + + + + + + + + daysInMonth property - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
daysInMonth
+ +
+ +
+ + + + +
+
+ +

daysInMonth property + Null safety +

+ +
+ List<int?> + daysInMonth +
read / write
+ +
+ +
+

How many days there are in every month.

+
+ + +
+

Implementation

+
List<int?> daysInMonth = List.filled(12, null);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/dispose.html b/docs/models/CalendarEditor/dispose.html new file mode 100644 index 000000000..b6e882639 --- /dev/null +++ b/docs/models/CalendarEditor/dispose.html @@ -0,0 +1,172 @@ + + + + + + + + dispose method - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
dispose
+ +
+ +
+ + + + +
+
+ +

dispose method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +void +dispose() + +
override
+ +
+ +
+

Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed).

+

This method should only be called by the object's owner.

+
+ + + +
+

Implementation

+
@override
+void dispose() {
+	for (final StreamSubscription? subscription in subscriptions) {
+		subscription?.cancel();
+	}
+	super.dispose();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/layoutMonth.html b/docs/models/CalendarEditor/layoutMonth.html new file mode 100644 index 000000000..d3f5ea2f8 --- /dev/null +++ b/docs/models/CalendarEditor/layoutMonth.html @@ -0,0 +1,186 @@ + + + + + + + + layoutMonth method - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
layoutMonth
+ +
+ +
+ + + + +
+
+ +

layoutMonth method + Null safety +

+ +
+ + +List<CalendarDay?> +layoutMonth(
  1. List<Day?> cal,
  2. +
  3. int month
  4. +
) + + + +
+ +
+

Fits the calendar to a 6-week layout.

+

Adjusts the calendar so that it begins on the correct day of the week +(starting on Sunday) instead of defaulting to the first open cell on +the calendar grid. This function pads the calendar with the correct +amount of empty days before and after the month.

+
+ + + +
+

Implementation

+
List<CalendarDay?> layoutMonth(List<Day?> cal, int month) {
+	final int year = years [month];
+	final int firstDayOfMonth = DateTime(year, month + 1, 1).weekday;
+	final int weekday = firstDayOfMonth == 7 ? 0 : firstDayOfMonth;
+	int weeks = 0;  // the number of sundays (except for the first week)
+	if (firstDayOfMonth != 7) {  // First week doesn't have a sunday
+		weeks++;
+	}
+	for (int date = 0; date < cal.length; date++) {
+		if (DateTime(year, month + 1, date + 1).weekday == 7) {  // Sunday
+			weeks++;
+		}
+	}
+	final int leftPad = weekday;
+	final int rightPad = (weeks * 7) - (weekday + cal.length);
+	return [
+		for (int _ = 0; _ < leftPad; _++) null,
+		for (int date = 0; date < cal.length; date++) CalendarDay(
+			date: DateTime(year, month + 1, date + 1),
+			schoolDay: cal [date],
+		),
+		for (int _ = 0; _ < rightPad; _++) null,
+	];
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/loadMonth.html b/docs/models/CalendarEditor/loadMonth.html new file mode 100644 index 000000000..7e35049de --- /dev/null +++ b/docs/models/CalendarEditor/loadMonth.html @@ -0,0 +1,168 @@ + + + + + + + + loadMonth method - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
loadMonth
+ +
+ +
+ + + + +
+
+ +

loadMonth method + Null safety +

+ +
+ + +void +loadMonth(
  1. int month
  2. +
) + + + +
+ + + + +
+

Implementation

+
void loadMonth(int month) => subscriptions [month] ??= Services
+	.instance.database.cloudDatabase.getCalendarStream(month + 1)
+	.listen(
+		(List<Map?> cal) {
+			calendar [month] = layoutMonth(
+				[
+					for (final Map? day in cal)
+						day == null ? null : Day.fromJson(day),
+				],
+				month
+			);
+			notifyListeners();
+		}
+	);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/now.html b/docs/models/CalendarEditor/now.html new file mode 100644 index 000000000..707a0d800 --- /dev/null +++ b/docs/models/CalendarEditor/now.html @@ -0,0 +1,155 @@ + + + + + + + + now property - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
now
+ +
+ +
+ + + + +
+
+ +

now property + Null safety +

+ +
+ DateTime + now +
final
+ +
+ +
+

The current date.

+
+ + +
+

Implementation

+
static final DateTime now = DateTime.now();
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/subscriptions.html b/docs/models/CalendarEditor/subscriptions.html new file mode 100644 index 000000000..8e26a681c --- /dev/null +++ b/docs/models/CalendarEditor/subscriptions.html @@ -0,0 +1,155 @@ + + + + + + + + subscriptions property - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
subscriptions
+ +
+ +
+ + + + +
+
+ +

subscriptions property + Null safety +

+ +
+ List<StreamSubscription?> + subscriptions +
final
+ +
+ +
+

A list of streams on the Firebase streams.

+
+ + +
+

Implementation

+
final List<StreamSubscription?> subscriptions = List.filled(12, null);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/updateDay.html b/docs/models/CalendarEditor/updateDay.html new file mode 100644 index 000000000..32c74b128 --- /dev/null +++ b/docs/models/CalendarEditor/updateDay.html @@ -0,0 +1,174 @@ + + + + + + + + updateDay method - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
updateDay
+ +
+ +
+ + + + +
+
+ +

updateDay method + Null safety +

+ +
+ + +Future<void> +updateDay(
  1. {required Day? day,
  2. +
  3. required DateTime date}
  4. +
) + + + +
+ +
+

Updates the calendar.

+
+ + + +
+

Implementation

+
Future<void> updateDay({required Day? day, required DateTime date}) async {
+	final int index = calendar [date.month - 1]!
+		.indexWhere((CalendarDay? day) => day != null);
+	calendar [date.month - 1]! [index + date.day - 1]!.schoolDay = day;
+	await Services.instance.database.setCalendar(
+		date.month,
+		{
+			"calendar": [
+				for (final CalendarDay? day in calendar [date.month - 1]!)
+					if (day != null)
+						day.schoolDay?.toJson(),
+			],
+			"month": date.month
+		}
+	);
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/CalendarEditor/years.html b/docs/models/CalendarEditor/years.html new file mode 100644 index 000000000..a42f9ff56 --- /dev/null +++ b/docs/models/CalendarEditor/years.html @@ -0,0 +1,163 @@ + + + + + + + + years property - CalendarEditor class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
years
+ +
+ +
+ + + + +
+
+ +

years property + Null safety +

+ +
+ List<int> + years +
final
+ +
+ +
+

The year of each month.

+

Because the school year goes from September to June, determining the year +of any given month is not trivial. The year is computed from the current +month and the month in question.

+
+ + +
+

Implementation

+
final List<int> years = [
+	for (int month = 0; month < 12; month++)
+		currentMonth > 7
+			? month > 7 ? currentYear : currentYear + 1
+			: month > 7 ? currentYear - 1 : currentYear
+];
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/DayBuilderModel-class.html b/docs/models/DayBuilderModel-class.html new file mode 100644 index 000000000..c5460fc32 --- /dev/null +++ b/docs/models/DayBuilderModel-class.html @@ -0,0 +1,408 @@ + + + + + + + + DayBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
DayBuilderModel
+ +
+ +
+ + + + +
+
+ +

DayBuilderModel class + Null safety + +

+ + +
+

A view model for the creating a new Day.

+
+ + +
+
+ + +
Mixed in types
+
+ + + +
+
+ +
+

Constructors

+ +
+
+ DayBuilderModel({required Day? day, required DateTime date}) +
+
+ Creates a view model for modifying a Day. +
+
+
+ +
+

Properties

+ +
+
+ date + → DateTime + +
+
+ +
final
+ +
+ +
+ day + Day? + +
+
+ The day being created (in present state). +
read-only
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ hasSchool + ↔ bool + +
+
+ If this day has school. +
read / write
+ +
+ +
+ name + ↔ String? + +
+
+ The name for this day. +
read / write
+ +
+ +
+ ready + → bool + +
+
+ Whether this day is ready to be created. +
read-only
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ schedule + Schedule? + +
+
+ The schedule for this day. +
read / write
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
@mustCallSuper, inherited
+ +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/DayBuilderModel/DayBuilderModel.html b/docs/models/DayBuilderModel/DayBuilderModel.html new file mode 100644 index 000000000..035368e9b --- /dev/null +++ b/docs/models/DayBuilderModel/DayBuilderModel.html @@ -0,0 +1,152 @@ + + + + + + + + DayBuilderModel constructor - DayBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
DayBuilderModel
+ +
+ +
+ + + + +
+
+ +

DayBuilderModel constructor + Null safety +

+ +
+ DayBuilderModel(
  1. {required Day? day,
  2. +
  3. required DateTime date}
  4. +
) +
+ + +
+

Creates a view model for modifying a Day.

+
+ + + +
+

Implementation

+
DayBuilderModel({required Day? day, required this.date}) :
+	_name = day?.name,
+	_schedule = day?.schedule,
+	_hasSchool = day != null;
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/DayBuilderModel/date.html b/docs/models/DayBuilderModel/date.html new file mode 100644 index 000000000..c8a470d48 --- /dev/null +++ b/docs/models/DayBuilderModel/date.html @@ -0,0 +1,147 @@ + + + + + + + + date property - DayBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
date
+ +
+ +
+ + + + +
+
+ +

date property + Null safety +

+ +
+ DateTime + date +
final
+ +
+ + + +
+

Implementation

+
final DateTime date;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/DayBuilderModel/day.html b/docs/models/DayBuilderModel/day.html new file mode 100644 index 000000000..3776771fe --- /dev/null +++ b/docs/models/DayBuilderModel/day.html @@ -0,0 +1,158 @@ + + + + + + + + day property - DayBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
day
+ +
+ +
+ + + + +
+
+ +

day property + Null safety +

+ + + +
+ +
+ Day? + day + + +
+ + +
+

The day being created (in present state).

+
+ + +
+

Implementation

+
Day? get day => !hasSchool ? null : Day(
+	name: name ?? "",
+	schedule: schedule ?? Schedule.schedules.first,
+);
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/DayBuilderModel/hasSchool.html b/docs/models/DayBuilderModel/hasSchool.html new file mode 100644 index 000000000..113e96cf2 --- /dev/null +++ b/docs/models/DayBuilderModel/hasSchool.html @@ -0,0 +1,178 @@ + + + + + + + + hasSchool property - DayBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hasSchool
+ +
+ +
+ + + + +
+
+ +

hasSchool property + Null safety +

+ + + +
+ +
+ bool + hasSchool + + +
+ + +
+

If this day has school.

+
+ + +
+

Implementation

+
bool get hasSchool => _hasSchool;
+
+ +
+ + + +
+ +
+ void + hasSchool=(bool value) + + +
+ + + + +
+

Implementation

+
set hasSchool(bool value) {
+	_hasSchool = value;
+	notifyListeners();
+}
+
+ +
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/DayBuilderModel/name.html b/docs/models/DayBuilderModel/name.html new file mode 100644 index 000000000..3f51b31dc --- /dev/null +++ b/docs/models/DayBuilderModel/name.html @@ -0,0 +1,178 @@ + + + + + + + + name property - DayBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
name
+ +
+ +
+ + + + +
+
+ +

name property + Null safety +

+ + + +
+ +
+ String? + name + + +
+ + +
+

The name for this day.

+
+ + +
+

Implementation

+
String? get name => _name;
+
+ +
+ + + +
+ +
+ void + name=(String? value) + + +
+ + + + +
+

Implementation

+
set name (String? value) {
+	_name = value;
+	notifyListeners();
+}
+
+ +
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/DayBuilderModel/ready.html b/docs/models/DayBuilderModel/ready.html new file mode 100644 index 000000000..2e74fc173 --- /dev/null +++ b/docs/models/DayBuilderModel/ready.html @@ -0,0 +1,155 @@ + + + + + + + + ready property - DayBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ready
+ +
+ +
+ + + + +
+
+ +

ready property + Null safety +

+ + + +
+ +
+ bool + ready + + +
+ + +
+

Whether this day is ready to be created.

+
+ + +
+

Implementation

+
bool get ready => name != null && schedule != null;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/DayBuilderModel/schedule.html b/docs/models/DayBuilderModel/schedule.html new file mode 100644 index 000000000..b2d81f465 --- /dev/null +++ b/docs/models/DayBuilderModel/schedule.html @@ -0,0 +1,181 @@ + + + + + + + + schedule property - DayBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schedule
+ +
+ +
+ + + + +
+
+ +

schedule property + Null safety +

+ + + +
+ +
+ Schedule? + schedule + + +
+ + +
+

The schedule for this day.

+
+ + +
+

Implementation

+
Schedule? get schedule => _schedule;
+
+ +
+ + + +
+ +
+ void + schedule=(Schedule? value) + + +
+ + + + +
+

Implementation

+
set schedule (Schedule? value) {
+	if (value == null) {
+		return;
+	}
+	_schedule = value;
+	notifyListeners();
+}
+
+ +
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/FeedbackModel-class.html b/docs/models/FeedbackModel-class.html new file mode 100644 index 000000000..2cb7be37d --- /dev/null +++ b/docs/models/FeedbackModel-class.html @@ -0,0 +1,386 @@ + + + + + + + + FeedbackModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
FeedbackModel
+ +
+ +
+ + + + +
+
+ +

FeedbackModel class + Null safety + +

+ + +
+

A view model for the feedback page.

+
+ + +
+
+ + +
Mixed in types
+
+ + + +
+
+ +
+

Constructors

+ +
+
+ FeedbackModel() +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ anonymous + ↔ bool + +
+
+ Whether the user consents to receiving a follow-up response. +
read / write
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ message + ↔ String? + +
+
+ The message that will be sent along with the feedback. +
read / write
+ +
+ +
+ ready + → bool + +
+
+ Whether the user is ready to submit [...] +
read-only
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
@mustCallSuper, inherited
+ +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ send() + → Future<void> + + + +
+
+ Sends the feedback to Cloud Firestore. [...] + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/FeedbackModel/FeedbackModel.html b/docs/models/FeedbackModel/FeedbackModel.html new file mode 100644 index 000000000..f960e5942 --- /dev/null +++ b/docs/models/FeedbackModel/FeedbackModel.html @@ -0,0 +1,138 @@ + + + + + + + + FeedbackModel constructor - FeedbackModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
FeedbackModel
+ +
+ +
+ + + + +
+
+ +

FeedbackModel constructor + Null safety +

+ +
+ FeedbackModel() +
+ + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/FeedbackModel/anonymous.html b/docs/models/FeedbackModel/anonymous.html new file mode 100644 index 000000000..44073fee8 --- /dev/null +++ b/docs/models/FeedbackModel/anonymous.html @@ -0,0 +1,176 @@ + + + + + + + + anonymous property - FeedbackModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
anonymous
+ +
+ +
+ + + + +
+
+ +

anonymous property + Null safety +

+ + + +
+ +
+ bool + anonymous + + +
+ + +
+

Whether the user consents to receiving a follow-up response.

+
+ + +
+

Implementation

+
bool get anonymous => _anonymous;
+
+ +
+ + + +
+ +
+ void + anonymous=(bool value) + + +
+ + + + +
+

Implementation

+
set anonymous(bool value) {
+	_anonymous = value;
+	notifyListeners();
+}
+
+ +
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/FeedbackModel/message.html b/docs/models/FeedbackModel/message.html new file mode 100644 index 000000000..1e2364c55 --- /dev/null +++ b/docs/models/FeedbackModel/message.html @@ -0,0 +1,176 @@ + + + + + + + + message property - FeedbackModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
message
+ +
+ +
+ + + + +
+
+ +

message property + Null safety +

+ + + +
+ +
+ String? + message + + +
+ + +
+

The message that will be sent along with the feedback.

+
+ + +
+

Implementation

+
String? get message => _message;
+
+ +
+ + + +
+ +
+ void + message=(String? value) + + +
+ + + + +
+

Implementation

+
set message (String? value) {
+	_message = value;
+	notifyListeners();
+}
+
+ +
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/FeedbackModel/ready.html b/docs/models/FeedbackModel/ready.html new file mode 100644 index 000000000..9e0e16615 --- /dev/null +++ b/docs/models/FeedbackModel/ready.html @@ -0,0 +1,154 @@ + + + + + + + + ready property - FeedbackModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ready
+ +
+ +
+ + + + +
+
+ +

ready property + Null safety +

+ + + +
+ +
+ bool + ready + + +
+ + +
+

Whether the user is ready to submit

+

Is true if the message is non-null and not empty.

+
+ + +
+

Implementation

+
bool get ready => message != null && message!.trim().isNotEmpty;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/FeedbackModel/send.html b/docs/models/FeedbackModel/send.html new file mode 100644 index 000000000..017f0d432 --- /dev/null +++ b/docs/models/FeedbackModel/send.html @@ -0,0 +1,163 @@ + + + + + + + + send method - FeedbackModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
send
+ +
+ +
+ + + + +
+
+ +

send method + Null safety +

+ +
+ + +Future<void> +send() + + + +
+ +
+

Sends the feedback to Cloud Firestore.

+

The feedback is anonymized if anonymous is true.

+
+ + + +
+

Implementation

+
Future<void> send() async => Services
+	.instance
+	.database
+	.cloudDatabase
+	.sendFeedback(
+		Feedback (
+			message: message!,
+			timestamp: DateTime.now(),
+			anonymous: anonymous,
+			name: anonymous ? null : Auth.name,
+			email: anonymous ? null : Auth.email,
+		).toJson()
+);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/HomeModel-class.html b/docs/models/HomeModel-class.html new file mode 100644 index 000000000..62bfb03db --- /dev/null +++ b/docs/models/HomeModel-class.html @@ -0,0 +1,358 @@ + + + + + + + + HomeModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
HomeModel
+ +
+ +
+ + + + +
+
+ +

HomeModel class + Null safety + +

+ + +
+

A view model for the home page.

+

This model doesn't actually do much, it just listens to any data models +that are relevant to the home page. Because we're using ChangeNotifier, +as its the only Listenable with a dispose method, we can't simply use +Listenable.merge.

+

Additionally, the data models being listened to here will be disposed after +signing in and will be unusable. That's why we can't simply pass in a data +model. Instead, we have to reference it through Models, which will always +have an up-to-date instance.

+
+ + +
+
+ + +
Mixed in types
+
+ + + +
+
+ +
+

Constructors

+ +
+
+ HomeModel() +
+
+ Listens to ScheduleModel (and by extension, Reminders) and Sports. +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
override
+ +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ refresh(VoidCallback onFailure) + → Future<void> + + + +
+
+ Refreshes the database. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/HomeModel/HomeModel.html b/docs/models/HomeModel/HomeModel.html new file mode 100644 index 000000000..28e76ecff --- /dev/null +++ b/docs/models/HomeModel/HomeModel.html @@ -0,0 +1,145 @@ + + + + + + + + HomeModel constructor - HomeModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
HomeModel
+ +
+ +
+ + + + +
+
+ +

HomeModel constructor + Null safety +

+ +
+ HomeModel() +
+ + +
+

Listens to ScheduleModel (and by extension, Reminders) and Sports.

+
+ + + +
+

Implementation

+
HomeModel() {
+	Models.instance.schedule.addListener(notifyListeners);
+	Models.instance.sports.addListener(notifyListeners);
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/HomeModel/dispose.html b/docs/models/HomeModel/dispose.html new file mode 100644 index 000000000..fbb48c33c --- /dev/null +++ b/docs/models/HomeModel/dispose.html @@ -0,0 +1,161 @@ + + + + + + + + dispose method - HomeModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
dispose
+ +
+ +
+ + + + +
+
+ +

dispose method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +void +dispose() + +
override
+ +
+ +
+

Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed).

+

This method should only be called by the object's owner.

+
+ + + +
+

Implementation

+
@override
+void dispose() {
+	Models.instance.schedule.removeListener(notifyListeners);
+	Models.instance.sports.removeListener(notifyListeners);
+	super.dispose();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/HomeModel/refresh.html b/docs/models/HomeModel/refresh.html new file mode 100644 index 000000000..a58e6c425 --- /dev/null +++ b/docs/models/HomeModel/refresh.html @@ -0,0 +1,160 @@ + + + + + + + + refresh method - HomeModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
refresh
+ +
+ +
+ + + + +
+
+ +

refresh method + Null safety +

+ +
+ + +Future<void> +refresh(
  1. VoidCallback onFailure
  2. +
) + + + +
+ +
+

Refreshes the database.

+

This only updates the calendar and sports games, not the user profile. To +update user data, sign out and sign back in.

+
+ + + +
+

Implementation

+
Future<void> refresh(VoidCallback onFailure) async {
+	try {
+		await Services.instance.database.updateCalendar();
+		await Services.instance.database.updateSports();
+		await Models.instance.schedule.initCalendar();
+	} catch (error) {  // ignore: avoid_catches_without_on_clauses
+		// We just want to allow the user to retry. But still rethrow.
+		onFailure();
+		rethrow;
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Models-class.html b/docs/models/Models-class.html new file mode 100644 index 000000000..f02806836 --- /dev/null +++ b/docs/models/Models-class.html @@ -0,0 +1,423 @@ + + + + + + + + Models class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Models
+ +
+ +
+ + + + +
+
+ +

Models class + Null safety + +

+ + +
+

Bundles all the data models together.

+

Each data model is responsible for different types of data. For example, +ScheduleModel keeps track of the schedule (as well as associated data such +as the current period) and UserModel reads the user data.

+

Each data model inherits from Model, so it has init and dispose +functions. This model serves to bundles those together, so that calling +init or dispose on this model will call the respective functions +on all the data models.

+
+ + + +
+

Constructors

+ +
+
+ Models() +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ isReady + ↔ bool + +
+
+ Whether the data models have been initialized. +
read / write
+ +
+ +
+ reminders + Reminders + +
+
+ The reminders data model. +
read-only
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ schedule + ScheduleModel + +
+
+ The schedule data model. +
read-only
+ +
+ +
+ sports + Sports + +
+
+ The sports data model. +
read-only
+ +
+ +
+ user + UserModel + +
+
+ The user data model. +
read-only
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
override
+ +
+ +
+ init() + → Future<void> + + + +
+
+ Gets whatever data is needed by this model from a service. [...] + + +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ +
+

Static Properties

+ +
+
+ instance + Models + +
+
+ The singleton instance of this class. +
read / write
+ +
+ +
+
+ + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Models/Models.html b/docs/models/Models/Models.html new file mode 100644 index 000000000..9f2524ed9 --- /dev/null +++ b/docs/models/Models/Models.html @@ -0,0 +1,142 @@ + + + + + + + + Models constructor - Models class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Models
+ +
+ +
+ + + + +
+
+ +

Models constructor + Null safety +

+ +
+ Models() +
+ + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Models/dispose.html b/docs/models/Models/dispose.html new file mode 100644 index 000000000..df896554f --- /dev/null +++ b/docs/models/Models/dispose.html @@ -0,0 +1,177 @@ + + + + + + + + dispose method - Models class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
dispose
+ +
+ +
+ + + + +
+
+ +

dispose method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +void +dispose() + +
override
+ +
+ +
+

Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed).

+

This method should only be called by the object's owner.

+
+ + + +
+

Implementation

+
@override
+// This object can be revived using [init].
+// ignore: must_call_super
+void dispose() {
+	_schedule?.dispose();
+	_reminders?.dispose();
+	_sports?.dispose();
+	_user?.dispose();
+	// These data models have been disposed and cannot be used again
+	_reminders = null;
+	_schedule = null;
+	_sports = null;
+	_user = null;
+	isReady = false;
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Models/init.html b/docs/models/Models/init.html new file mode 100644 index 000000000..f2545cd76 --- /dev/null +++ b/docs/models/Models/init.html @@ -0,0 +1,175 @@ + + + + + + + + init method - Models class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
init
+ +
+ +
+ + + + +
+
+ +

init method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +Future<void> +init() + + + +
+ +
+

Gets whatever data is needed by this model from a service.

+

This model may not function properly if this function is not called.

+
+ + + +
+

Implementation

+
@override
+Future<void> init() async {
+	if (isReady) {
+		return;
+	}
+	final Crashlytics crashlytics = Services.instance.crashlytics;
+	await crashlytics.log("Initializing user model");
+	await user.init();
+	await crashlytics.log("Initializing reminders model");
+	await reminders.init();
+	await crashlytics.log("Initializing schedule model");
+	await schedule.init();
+	await crashlytics.log("Initializing sports model");
+	await sports.init();
+	isReady = true;
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Models/instance.html b/docs/models/Models/instance.html new file mode 100644 index 000000000..13de4e1d9 --- /dev/null +++ b/docs/models/Models/instance.html @@ -0,0 +1,152 @@ + + + + + + + + instance property - Models class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
instance
+ +
+ +
+ + + + +
+
+ +

instance property + Null safety +

+ +
+ Models + instance +
read / write
+ +
+ +
+

The singleton instance of this class.

+
+ + +
+

Implementation

+
static Models instance = Models();
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Models/isReady.html b/docs/models/Models/isReady.html new file mode 100644 index 000000000..bd4985a7f --- /dev/null +++ b/docs/models/Models/isReady.html @@ -0,0 +1,152 @@ + + + + + + + + isReady property - Models class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
isReady
+ +
+ +
+ + + + +
+
+ +

isReady property + Null safety +

+ +
+ bool + isReady +
read / write
+ +
+ +
+

Whether the data models have been initialized.

+
+ + +
+

Implementation

+
bool isReady = false;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Models/reminders.html b/docs/models/Models/reminders.html new file mode 100644 index 000000000..763b2c5f5 --- /dev/null +++ b/docs/models/Models/reminders.html @@ -0,0 +1,157 @@ + + + + + + + + reminders property - Models class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
reminders
+ +
+ +
+ + + + +
+
+ +

reminders property + Null safety +

+ + + +
+ +
+ Reminders + reminders + + +
+ + +
+

The reminders data model.

+
+ + +
+

Implementation

+
Reminders get reminders => _reminders ??= Reminders();
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Models/schedule.html b/docs/models/Models/schedule.html new file mode 100644 index 000000000..649395698 --- /dev/null +++ b/docs/models/Models/schedule.html @@ -0,0 +1,157 @@ + + + + + + + + schedule property - Models class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schedule
+ +
+ +
+ + + + +
+
+ +

schedule property + Null safety +

+ + + +
+ +
+ ScheduleModel + schedule + + +
+ + +
+

The schedule data model.

+
+ + +
+

Implementation

+
ScheduleModel get schedule => _schedule ??= ScheduleModel();
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Models/sports.html b/docs/models/Models/sports.html new file mode 100644 index 000000000..2238a0d94 --- /dev/null +++ b/docs/models/Models/sports.html @@ -0,0 +1,157 @@ + + + + + + + + sports property - Models class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
sports
+ +
+ +
+ + + + +
+
+ +

sports property + Null safety +

+ + + +
+ +
+ Sports + sports + + +
+ + +
+

The sports data model.

+
+ + +
+

Implementation

+
Sports get sports => _sports ??= Sports();
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Models/user.html b/docs/models/Models/user.html new file mode 100644 index 000000000..4c262b040 --- /dev/null +++ b/docs/models/Models/user.html @@ -0,0 +1,157 @@ + + + + + + + + user property - Models class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
user
+ +
+ +
+ + + + +
+
+ +

user property + Null safety +

+ + + +
+ +
+ UserModel + user + + +
+ + +
+

The user data model.

+
+ + +
+

Implementation

+
UserModel get user => _user ??= UserModel();
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders-class.html b/docs/models/Reminders-class.html new file mode 100644 index 000000000..8f7dd2b7b --- /dev/null +++ b/docs/models/Reminders-class.html @@ -0,0 +1,510 @@ + + + + + + + + Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Reminders
+ +
+ +
+ + + + +
+
+ +

Reminders class + Null safety + +

+ + +
+

A DataModel that keeps the state of the user's reminders.

+

This data model abstracts all operations that have to do with reminders, +and all other parts of the app that want to operate on reminders should use +this data model.

+
+ + + +
+

Constructors

+ +
+
+ Reminders() +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ currentReminders + ↔ List<int> + +
+
+ The reminders that apply for this period. [...] +
read / write
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ hasNextReminder + → bool + +
+
+ Whether any reminder applies to the next period. +
read-only
+ +
+ +
+ hasReminder + → bool + +
+
+ Whether any reminder applies to the current period. +
read-only
+ +
+ +
+ nextReminders + ↔ List<int> + +
+
+ The reminders that apply for next period. [...] +
read / write
+ +
+ +
+ readReminders + → List<int> + +
+
+ Reminders that applied for previous periods. [...] +
final
+ +
+ +
+ reminders + ↔ List<Reminder> + +
+
+ The reminders for the user. +
final, read / write, late
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ addReminder(Reminder? reminder) + → void + + + +
+
+ Creates a new reminder. + + +
+ +
+ cleanReminders() + → void + + + +
+
+ Deletes expired reminders. [...] + + +
+ +
+ deleteReminder(int index) + → void + + + +
+
+ Deletes the reminder at a given index. + + +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
@mustCallSuper, inherited
+ +
+ +
+ getReminders({required String? subject, required String? period, required String? dayName}) + → List<int> + + + +
+
+ Gets all reminders that apply to the a given period. [...] + + +
+ +
+ init() + → Future<void> + + + +
+
+ Gets whatever data is needed by this model from a service. [...] + + +
+ +
+ markShown(int index) + → void + + + +
+
+ Marks a reminder as "shown". [...] + + +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ replaceReminder(int index, Reminder? reminder) + → void + + + +
+
+ Replaces a reminder at a given index. + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+ verifyReminders(int changedIndex) + → void + + + +
+
+ Checks if any reminders have been modified and removes them. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/Reminders.html b/docs/models/Reminders/Reminders.html new file mode 100644 index 000000000..a1c2afeb3 --- /dev/null +++ b/docs/models/Reminders/Reminders.html @@ -0,0 +1,148 @@ + + + + + + + + Reminders constructor - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
Reminders
+ +
+ +
+ + + + +
+
+ +

Reminders constructor + Null safety +

+ +
+ Reminders() +
+ + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/addReminder.html b/docs/models/Reminders/addReminder.html new file mode 100644 index 000000000..eefda039f --- /dev/null +++ b/docs/models/Reminders/addReminder.html @@ -0,0 +1,168 @@ + + + + + + + + addReminder method - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
addReminder
+ +
+ +
+ + + + +
+
+ +

addReminder method + Null safety +

+ +
+ + +void +addReminder(
  1. Reminder? reminder
  2. +
) + + + +
+ +
+

Creates a new reminder.

+
+ + + +
+

Implementation

+
void addReminder(Reminder? reminder) {
+	if (reminder == null) {
+		return;
+	}
+	reminders.add(reminder);
+	Services.instance.database.updateReminder(null, reminder.toJson());
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/cleanReminders.html b/docs/models/Reminders/cleanReminders.html new file mode 100644 index 000000000..566b3a15c --- /dev/null +++ b/docs/models/Reminders/cleanReminders.html @@ -0,0 +1,171 @@ + + + + + + + + cleanReminders method - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
cleanReminders
+ +
+ +
+ + + + +
+
+ +

cleanReminders method + Null safety +

+ +
+ + +void +cleanReminders() + + + +
+ +
+

Deletes expired reminders.

+

This method searches all reminders in readReminders for a reminder that +does not repeat and has been shown already (ie, in currentReminders), +then calls deleteReminder on them.

+
+ + + +
+

Implementation

+
void cleanReminders() {
+	for (final Reminder reminder in [
+		for (final int index in readReminders)
+			if (!reminders [index].time.repeats && !currentReminders.contains(index))
+				reminders [index]
+	]) {
+		deleteReminder(reminders.indexOf(reminder));
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/currentReminders.html b/docs/models/Reminders/currentReminders.html new file mode 100644 index 000000000..48a89befd --- /dev/null +++ b/docs/models/Reminders/currentReminders.html @@ -0,0 +1,159 @@ + + + + + + + + currentReminders property - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
currentReminders
+ +
+ +
+ + + + +
+
+ +

currentReminders property + Null safety +

+ +
+ List<int> + currentReminders +
read / write
+ +
+ +
+

The reminders that apply for this period.

+

This is managed by the Schedule data model.

+
+ + +
+

Implementation

+
List<int> currentReminders = [];
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/deleteReminder.html b/docs/models/Reminders/deleteReminder.html new file mode 100644 index 000000000..4366172a2 --- /dev/null +++ b/docs/models/Reminders/deleteReminder.html @@ -0,0 +1,167 @@ + + + + + + + + deleteReminder method - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
deleteReminder
+ +
+ +
+ + + + +
+
+ +

deleteReminder method + Null safety +

+ +
+ + +void +deleteReminder(
  1. int index
  2. +
) + + + +
+ +
+

Deletes the reminder at a given index.

+
+ + + +
+

Implementation

+
void deleteReminder(int index) {
+	final String oldHash = reminders [index].hash;
+	reminders.removeAt(index);
+	Services.instance.database.deleteReminder(oldHash);
+	verifyReminders(index);  // remove the reminder from the schedule
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/getReminders.html b/docs/models/Reminders/getReminders.html new file mode 100644 index 000000000..2b3e52e10 --- /dev/null +++ b/docs/models/Reminders/getReminders.html @@ -0,0 +1,174 @@ + + + + + + + + getReminders method - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
getReminders
+ +
+ +
+ + + + +
+
+ +

getReminders method + Null safety +

+ +
+ + +List<int> +getReminders(
  1. {required String? subject,
  2. +
  3. required String? period,
  4. +
  5. required String? dayName}
  6. +
) + + + +
+ +
+

Gets all reminders that apply to the a given period.

+

This method is a wrapper around Reminder.getReminders, and should only +be called by an object with access to the relevant period.

+
+ + + +
+

Implementation

+
List<int> getReminders({
+	required String? subject,
+	required String? period,
+	required String? dayName,
+}) => Reminder.getReminders(
+	reminders: reminders,
+	subject: subject,
+	dayName: dayName,
+	period: period,
+).toList();
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/hasNextReminder.html b/docs/models/Reminders/hasNextReminder.html new file mode 100644 index 000000000..7574511c2 --- /dev/null +++ b/docs/models/Reminders/hasNextReminder.html @@ -0,0 +1,163 @@ + + + + + + + + hasNextReminder property - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hasNextReminder
+ +
+ +
+ + + + +
+
+ +

hasNextReminder property + Null safety +

+ + + +
+ +
+ bool + hasNextReminder + + +
+ + +
+

Whether any reminder applies to the next period.

+
+ + +
+

Implementation

+
bool get hasNextReminder => nextReminders.isNotEmpty;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/hasReminder.html b/docs/models/Reminders/hasReminder.html new file mode 100644 index 000000000..d86588f51 --- /dev/null +++ b/docs/models/Reminders/hasReminder.html @@ -0,0 +1,163 @@ + + + + + + + + hasReminder property - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hasReminder
+ +
+ +
+ + + + +
+
+ +

hasReminder property + Null safety +

+ + + +
+ +
+ bool + hasReminder + + +
+ + +
+

Whether any reminder applies to the current period.

+
+ + +
+

Implementation

+
bool get hasReminder => currentReminders.isNotEmpty;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/init.html b/docs/models/Reminders/init.html new file mode 100644 index 000000000..836b74b8f --- /dev/null +++ b/docs/models/Reminders/init.html @@ -0,0 +1,172 @@ + + + + + + + + init method - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
init
+ +
+ +
+ + + + +
+
+ +

init method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +Future<void> +init() + + + +
+ +
+

Gets whatever data is needed by this model from a service.

+

This model may not function properly if this function is not called.

+
+ + + +
+

Implementation

+
@override
+Future<void> init() async {
+	reminders = [
+		for (final Map json in await Services.instance.database.reminders)
+			Reminder.fromJson(json)
+	];
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/markShown.html b/docs/models/Reminders/markShown.html new file mode 100644 index 000000000..73a2642f0 --- /dev/null +++ b/docs/models/Reminders/markShown.html @@ -0,0 +1,169 @@ + + + + + + + + markShown method - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
markShown
+ +
+ +
+ + + + +
+
+ +

markShown method + Null safety +

+ +
+ + +void +markShown(
  1. int index
  2. +
) + + + +
+ +
+

Marks a reminder as "shown".

+

It will then be marked for deletion if it does not repeat. +See readReminders and cleanReminders for details.

+
+ + + +
+

Implementation

+
void markShown(int index) {
+	if (readReminders.contains(index)) {
+		return;
+	}
+	readReminders.add(index);
+	cleanReminders();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/nextReminders.html b/docs/models/Reminders/nextReminders.html new file mode 100644 index 000000000..9a5e4133d --- /dev/null +++ b/docs/models/Reminders/nextReminders.html @@ -0,0 +1,159 @@ + + + + + + + + nextReminders property - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
nextReminders
+ +
+ +
+ + + + +
+
+ +

nextReminders property + Null safety +

+ +
+ List<int> + nextReminders +
read / write
+ +
+ +
+

The reminders that apply for next period.

+

This is managed by the Schedule data model.

+
+ + +
+

Implementation

+
List<int> nextReminders = [];
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/readReminders.html b/docs/models/Reminders/readReminders.html new file mode 100644 index 000000000..5f410d356 --- /dev/null +++ b/docs/models/Reminders/readReminders.html @@ -0,0 +1,159 @@ + + + + + + + + readReminders property - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
readReminders
+ +
+ +
+ + + + +
+
+ +

readReminders property + Null safety +

+ +
+ List<int> + readReminders +
final
+ +
+ +
+

Reminders that applied for previous periods.

+

These reminders will be marked for deletion if they do not repeat.

+
+ + +
+

Implementation

+
final List<int> readReminders = [];
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/reminders.html b/docs/models/Reminders/reminders.html new file mode 100644 index 000000000..970bd38bd --- /dev/null +++ b/docs/models/Reminders/reminders.html @@ -0,0 +1,158 @@ + + + + + + + + reminders property - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
reminders
+ +
+ +
+ + + + +
+
+ +

reminders property + Null safety +

+ +
+ List<Reminder> + reminders +
final, read / write, late
+ +
+ +
+

The reminders for the user.

+
+ + +
+

Implementation

+
late final List<Reminder> reminders;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/replaceReminder.html b/docs/models/Reminders/replaceReminder.html new file mode 100644 index 000000000..5452ad0d5 --- /dev/null +++ b/docs/models/Reminders/replaceReminder.html @@ -0,0 +1,171 @@ + + + + + + + + replaceReminder method - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
replaceReminder
+ +
+ +
+ + + + +
+
+ +

replaceReminder method + Null safety +

+ +
+ + +void +replaceReminder(
  1. int index,
  2. +
  3. Reminder? reminder
  4. +
) + + + +
+ +
+

Replaces a reminder at a given index.

+
+ + + +
+

Implementation

+
void replaceReminder(int index, Reminder? reminder) {
+	if (reminder == null) {
+		return;
+	}
+	final String oldHash = reminders [index].hash;
+	reminders [index] = reminder;
+	Services.instance.database.updateReminder(oldHash, reminder.toJson());
+	verifyReminders(index);
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/Reminders/verifyReminders.html b/docs/models/Reminders/verifyReminders.html new file mode 100644 index 000000000..8926f36e4 --- /dev/null +++ b/docs/models/Reminders/verifyReminders.html @@ -0,0 +1,175 @@ + + + + + + + + verifyReminders method - Reminders class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
verifyReminders
+ +
+ +
+ + + + +
+
+ +

verifyReminders method + Null safety +

+ +
+ + +void +verifyReminders(
  1. int changedIndex
  2. +
) + + + +
+ +
+

Checks if any reminders have been modified and removes them.

+

This makes sure that any reminders in currentReminders, +nextReminders, and readReminders are all up-to-date.

+
+ + + +
+

Implementation

+
void verifyReminders(int changedIndex) {
+	final List<List<int>> reminderLists = [
+		currentReminders,
+		nextReminders,
+		readReminders
+	];
+	for (final List<int> remindersList in reminderLists) {
+		final int removeIndex = remindersList.indexOf(changedIndex);
+		if (removeIndex != -1) {
+			remindersList.removeAt(removeIndex);
+		}
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel-class.html b/docs/models/RemindersBuilderModel-class.html new file mode 100644 index 000000000..62db206a3 --- /dev/null +++ b/docs/models/RemindersBuilderModel-class.html @@ -0,0 +1,554 @@ + + + + + + + + RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
RemindersBuilderModel
+ +
+ +
+ + + + +
+
+ +

RemindersBuilderModel class + Null safety + +

+ + +
+

A view model for the dialog that allows the user to build a reminder.

+
+ + +
+
+ + +
Mixed in types
+
+ + + +
+
+ +
+

Constructors

+ +
+
+ RemindersBuilderModel([Reminder? reminder]) +
+
+ Creates a new reminder builder model. [...] +
+
+
+ +
+

Properties

+ +
+
+ course + ↔ String? + +
+
+ The name of the class this reminder should be displayed. [...] +
read / write
+ +
+ +
+ courses + → List<String> + +
+
+ All the names of the user's courses. +
final
+ +
+ +
+ dayName + ↔ String? + +
+
+ The name of the day. +
read / write
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ message + ↔ String + +
+
+ The message for this reminder. +
read / write
+ +
+ +
+ period + ↔ String? + +
+
+ The period this reminder should be displayed. [...] +
read / write
+ +
+ +
+ periods + → List<String>? + +
+
+ A list of all the periods in dayName. [...] +
read-only
+ +
+ +
+ ready + → bool + +
+
+ Whether the dialog is ready to submit. [...] +
read-only
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ shouldRepeat + ↔ bool + +
+
+ Whether this reminder repeats. [...] +
read / write
+ +
+ +
+ time + ReminderTime? + +
+
+ The time this reminder will be displayed. +
read / write
+ +
+ +
+ type + ReminderTimeType? + +
+
+ The type of reminder the user is building. +
read / write
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ build() + Reminder + + + +
+
+ Returns a new reminder from the model's fields. + + +
+ +
+ changeCourse(String value) + → void + + + +
+
+ Changes the course of this reminder. [...] + + +
+ +
+ changeDay(String value) + → void + + + +
+
+ Changes the period of this reminder. [...] + + +
+ +
+ changePeriod(String value) + → void + + + +
+
+ Changes the period of this reminder. [...] + + +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
@mustCallSuper, inherited
+ +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ onMessageChanged(String newMessage) + → void + + + +
+
+ Sets the message to the given string. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ toggleRepeat(bool value) + → void + + + +
+
+ Toggles whether this reminder should repeat. + + +
+ +
+ toggleRepeatType(ReminderTimeType value) + → void + + + +
+
+ Changes the type of this reminder. + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/RemindersBuilderModel.html b/docs/models/RemindersBuilderModel/RemindersBuilderModel.html new file mode 100644 index 000000000..a4a2d5847 --- /dev/null +++ b/docs/models/RemindersBuilderModel/RemindersBuilderModel.html @@ -0,0 +1,189 @@ + + + + + + + + RemindersBuilderModel constructor - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
RemindersBuilderModel
+ +
+ +
+ + + + +
+
+ +

RemindersBuilderModel constructor + Null safety +

+ +
+ RemindersBuilderModel(
  1. [Reminder? reminder]
  2. +
) +
+ + +
+

Creates a new reminder builder model.

+

If reminder is not null, then the relevant fields of this +class are filled in with the corresponding fields of the reminder.

+
+ + + +
+

Implementation

+
RemindersBuilderModel([Reminder? reminder]) :
+	_schedule = Models.instance.schedule,
+	courses = [
+		for (final Subject subject in Models.instance.schedule.subjects.values)
+			subject.name
+	]
+{
+	if (reminder == null) {
+		return;
+	}
+
+	message = reminder.message;
+	time = reminder.time;
+	shouldRepeat = time!.repeats;
+	type = time!.type;
+	switch (type) {
+		case ReminderTimeType.period:
+			final PeriodReminderTime reminderTime = time as PeriodReminderTime;
+			period = reminderTime.period;
+			dayName = reminderTime.dayName;
+			break;
+		case ReminderTimeType.subject:
+			final SubjectReminderTime reminderTime = time as SubjectReminderTime;
+			course = reminderTime.name;
+			break;
+		default:
+			throw ArgumentError.notNull("Reminder.time.type");
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/build.html b/docs/models/RemindersBuilderModel/build.html new file mode 100644 index 000000000..919588e55 --- /dev/null +++ b/docs/models/RemindersBuilderModel/build.html @@ -0,0 +1,172 @@ + + + + + + + + build method - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
build
+ +
+ +
+ + + + +
+
+ +

build method + Null safety +

+ +
+ + +Reminder +build() + + + +
+ +
+

Returns a new reminder from the model's fields.

+
+ + + +
+

Implementation

+
Reminder build() => Reminder (
+	message: message,
+	time: ReminderTime.fromType(
+		type: type!,
+		dayName: dayName,
+		period: period,
+		name: course,
+		repeats: shouldRepeat,
+	),
+);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/changeCourse.html b/docs/models/RemindersBuilderModel/changeCourse.html new file mode 100644 index 000000000..392151029 --- /dev/null +++ b/docs/models/RemindersBuilderModel/changeCourse.html @@ -0,0 +1,168 @@ + + + + + + + + changeCourse method - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
changeCourse
+ +
+ +
+ + + + +
+
+ +

changeCourse method + Null safety +

+ +
+ + +void +changeCourse(
  1. String value
  2. +
) + + + +
+ +
+

Changes the course of this reminder.

+

Only relevant when type is ReminderTimeType.subject.

+
+ + + +
+

Implementation

+
void changeCourse(String value) {
+	course = value;
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/changeDay.html b/docs/models/RemindersBuilderModel/changeDay.html new file mode 100644 index 000000000..098222267 --- /dev/null +++ b/docs/models/RemindersBuilderModel/changeDay.html @@ -0,0 +1,169 @@ + + + + + + + + changeDay method - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
changeDay
+ +
+ +
+ + + + +
+
+ +

changeDay method + Null safety +

+ +
+ + +void +changeDay(
  1. String value
  2. +
) + + + +
+ +
+

Changes the period of this reminder.

+

Only relevant when type is ReminderTimeType.period.

+
+ + + +
+

Implementation

+
void changeDay(String value) {
+	dayName = value;
+	period = null;
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/changePeriod.html b/docs/models/RemindersBuilderModel/changePeriod.html new file mode 100644 index 000000000..515b5762d --- /dev/null +++ b/docs/models/RemindersBuilderModel/changePeriod.html @@ -0,0 +1,168 @@ + + + + + + + + changePeriod method - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
changePeriod
+ +
+ +
+ + + + +
+
+ +

changePeriod method + Null safety +

+ +
+ + +void +changePeriod(
  1. String value
  2. +
) + + + +
+ +
+

Changes the period of this reminder.

+

Only relevant when type is ReminderTimeType.period

+
+ + + +
+

Implementation

+
void changePeriod(String value) {
+	period = value;
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/course.html b/docs/models/RemindersBuilderModel/course.html new file mode 100644 index 000000000..c95fd85dd --- /dev/null +++ b/docs/models/RemindersBuilderModel/course.html @@ -0,0 +1,162 @@ + + + + + + + + course property - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
course
+ +
+ +
+ + + + +
+
+ +

course property + Null safety +

+ +
+ String? + course +
read / write
+ +
+ +
+

The name of the class this reminder should be displayed.

+

Only relevant for SubjectReminderTime.

+
+ + +
+

Implementation

+
String? course;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/courses.html b/docs/models/RemindersBuilderModel/courses.html new file mode 100644 index 000000000..10e52d632 --- /dev/null +++ b/docs/models/RemindersBuilderModel/courses.html @@ -0,0 +1,161 @@ + + + + + + + + courses property - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
courses
+ +
+ +
+ + + + +
+
+ +

courses property + Null safety +

+ +
+ List<String> + courses +
final
+ +
+ +
+

All the names of the user's courses.

+
+ + +
+

Implementation

+
final List<String> courses;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/dayName.html b/docs/models/RemindersBuilderModel/dayName.html new file mode 100644 index 000000000..3ba5e4447 --- /dev/null +++ b/docs/models/RemindersBuilderModel/dayName.html @@ -0,0 +1,161 @@ + + + + + + + + dayName property - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
dayName
+ +
+ +
+ + + + +
+
+ +

dayName property + Null safety +

+ +
+ String? + dayName +
read / write
+ +
+ +
+

The name of the day.

+
+ + +
+

Implementation

+
String? dayName;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/message.html b/docs/models/RemindersBuilderModel/message.html new file mode 100644 index 000000000..1bd93b5ef --- /dev/null +++ b/docs/models/RemindersBuilderModel/message.html @@ -0,0 +1,161 @@ + + + + + + + + message property - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
message
+ +
+ +
+ + + + +
+
+ +

message property + Null safety +

+ +
+ String + message +
read / write
+ +
+ +
+

The message for this reminder.

+
+ + +
+

Implementation

+
String message = "";
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/onMessageChanged.html b/docs/models/RemindersBuilderModel/onMessageChanged.html new file mode 100644 index 000000000..ae6601ee5 --- /dev/null +++ b/docs/models/RemindersBuilderModel/onMessageChanged.html @@ -0,0 +1,168 @@ + + + + + + + + onMessageChanged method - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
onMessageChanged
+ +
+ +
+ + + + +
+
+ +

onMessageChanged method + Null safety +

+ +
+ + +void +onMessageChanged(
  1. String newMessage
  2. +
) + + + +
+ +
+

Sets the message to the given string.

+

Use this to properly update ready.

+
+ + + +
+

Implementation

+
void onMessageChanged(String newMessage) {
+	message = newMessage;
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/period.html b/docs/models/RemindersBuilderModel/period.html new file mode 100644 index 000000000..983c858da --- /dev/null +++ b/docs/models/RemindersBuilderModel/period.html @@ -0,0 +1,162 @@ + + + + + + + + period property - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
period
+ +
+ +
+ + + + +
+
+ +

period property + Null safety +

+ +
+ String? + period +
read / write
+ +
+ +
+

The period this reminder should be displayed.

+

Only relevant for PeriodReminderTime.

+
+ + +
+

Implementation

+
String? period;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/periods.html b/docs/models/RemindersBuilderModel/periods.html new file mode 100644 index 000000000..4a67dd111 --- /dev/null +++ b/docs/models/RemindersBuilderModel/periods.html @@ -0,0 +1,176 @@ + + + + + + + + periods property - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
periods
+ +
+ +
+ + + + +
+
+ +

periods property + Null safety +

+ + + +
+ +
+ List<String>? + periods + + +
+ + +
+

A list of all the periods in dayName.

+

Make sure this field is only accessed after setting dayName.

+
+ + +
+

Implementation

+
List<String>? get periods {
+	if (dayName == null) {
+		return null;
+	}
+	final List<PeriodData?> schedule = _schedule.user.schedule [dayName]!;
+	return [
+		for (int index = 0; index < schedule.length; index++)
+			(index + 1).toString()
+	];
+}
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/ready.html b/docs/models/RemindersBuilderModel/ready.html new file mode 100644 index 000000000..93e54bae4 --- /dev/null +++ b/docs/models/RemindersBuilderModel/ready.html @@ -0,0 +1,184 @@ + + + + + + + + ready property - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ready
+ +
+ +
+ + + + +
+
+ +

ready property + Null safety +

+ + + +
+ +
+ bool + ready + + +
+ + +
+

Whether the dialog is ready to submit.

+

In a nutshell, this field will be false if:

+ +
+ + +
+

Implementation

+
bool get ready {
+	if (message.isEmpty) {
+		return false;
+	}
+	switch (type) {
+		case ReminderTimeType.period:
+			return dayName != null && period != null;
+		case ReminderTimeType.subject:
+			return type != ReminderTimeType.subject || course != null;
+		case null: return false;
+	}
+}
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/shouldRepeat.html b/docs/models/RemindersBuilderModel/shouldRepeat.html new file mode 100644 index 000000000..1bfd1ac61 --- /dev/null +++ b/docs/models/RemindersBuilderModel/shouldRepeat.html @@ -0,0 +1,163 @@ + + + + + + + + shouldRepeat property - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
shouldRepeat
+ +
+ +
+ + + + +
+
+ +

shouldRepeat property + Null safety +

+ +
+ bool + shouldRepeat +
read / write
+ +
+ +
+

Whether this reminder repeats.

+

This affects whether it will be deleted after +being displayed once.

+
+ + +
+

Implementation

+
bool shouldRepeat = false;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/time.html b/docs/models/RemindersBuilderModel/time.html new file mode 100644 index 000000000..cfe4a7519 --- /dev/null +++ b/docs/models/RemindersBuilderModel/time.html @@ -0,0 +1,161 @@ + + + + + + + + time property - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
time
+ +
+ +
+ + + + +
+
+ +

time property + Null safety +

+ +
+ ReminderTime? + time +
read / write
+ +
+ +
+

The time this reminder will be displayed.

+
+ + +
+

Implementation

+
ReminderTime? time;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/toggleRepeat.html b/docs/models/RemindersBuilderModel/toggleRepeat.html new file mode 100644 index 000000000..717bcf7de --- /dev/null +++ b/docs/models/RemindersBuilderModel/toggleRepeat.html @@ -0,0 +1,168 @@ + + + + + + + + toggleRepeat method - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toggleRepeat
+ +
+ +
+ + + + +
+
+ +

toggleRepeat method + Null safety +

+ +
+ + +void +toggleRepeat(
  1. bool value
  2. +
) + + + +
+ +
+

Toggles whether this reminder should repeat.

+
+ + + +
+

Implementation

+
// ignore: avoid_positional_boolean_parameters
+void toggleRepeat(bool value) {
+	shouldRepeat = value;
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/toggleRepeatType.html b/docs/models/RemindersBuilderModel/toggleRepeatType.html new file mode 100644 index 000000000..e254a8147 --- /dev/null +++ b/docs/models/RemindersBuilderModel/toggleRepeatType.html @@ -0,0 +1,167 @@ + + + + + + + + toggleRepeatType method - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
toggleRepeatType
+ +
+ +
+ + + + +
+
+ +

toggleRepeatType method + Null safety +

+ +
+ + +void +toggleRepeatType(
  1. ReminderTimeType value
  2. +
) + + + +
+ +
+

Changes the type of this reminder.

+
+ + + +
+

Implementation

+
void toggleRepeatType(ReminderTimeType value) {
+	type = value;
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/RemindersBuilderModel/type.html b/docs/models/RemindersBuilderModel/type.html new file mode 100644 index 000000000..a952c5f56 --- /dev/null +++ b/docs/models/RemindersBuilderModel/type.html @@ -0,0 +1,161 @@ + + + + + + + + type property - RemindersBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
type
+ +
+ +
+ + + + +
+
+ +

type property + Null safety +

+ +
+ ReminderTimeType? + type +
read / write
+ +
+ +
+

The type of reminder the user is building.

+
+ + +
+

Implementation

+
ReminderTimeType? type;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleBuilderModel-class.html b/docs/models/ScheduleBuilderModel-class.html new file mode 100644 index 000000000..d7ebad69a --- /dev/null +++ b/docs/models/ScheduleBuilderModel-class.html @@ -0,0 +1,436 @@ + + + + + + + + ScheduleBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ScheduleBuilderModel
+ +
+ +
+ + + + +
+
+ +

ScheduleBuilderModel class + Null safety + +

+ + +
+

A view model to create a Schedule.

+
+ + +
+
+ + +
Mixed in types
+
+ + + +
+
+ +
+

Constructors

+ +
+
+ ScheduleBuilderModel([Schedule? preset]) +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ name + ↔ String? + +
+
+ The name of this schedule. [...] +
read / write
+ +
+ +
+ numPeriods + ↔ int + +
+
+ The amount of periods. [...] +
read / write
+ +
+ +
+ periods + ↔ List<Period> + +
+
+ Numbers for the periods. [...] +
read / write
+ +
+ +
+ preset + Schedule? + +
+
+ The schedule that this schedule is based on. +
read / write
+ +
+ +
+ ready + → bool + +
+
+ Whether this schedule is ready to be built. +
read-only
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ schedule + Schedule + +
+
+ The schedule being built. +
read-only
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
@mustCallSuper, inherited
+ +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ replaceTime(int index, Range range) + → void + + + +
+
+ Switches out a time in periods with a new time. + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+ usePreset(Schedule? schedule) + → void + + + +
+
+ Sets properties of this schedule based on an existing schedule. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleBuilderModel/ScheduleBuilderModel.html b/docs/models/ScheduleBuilderModel/ScheduleBuilderModel.html new file mode 100644 index 000000000..32b2b254e --- /dev/null +++ b/docs/models/ScheduleBuilderModel/ScheduleBuilderModel.html @@ -0,0 +1,149 @@ + + + + + + + + ScheduleBuilderModel constructor - ScheduleBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ScheduleBuilderModel
+ +
+ +
+ + + + +
+
+ +

ScheduleBuilderModel constructor + Null safety +

+ +
+ ScheduleBuilderModel(
  1. [Schedule? preset]
  2. +
) +
+ + + + + +
+

Implementation

+
ScheduleBuilderModel([this.preset]) {
+	usePreset(preset);
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleBuilderModel/name.html b/docs/models/ScheduleBuilderModel/name.html new file mode 100644 index 000000000..ab4cd1689 --- /dev/null +++ b/docs/models/ScheduleBuilderModel/name.html @@ -0,0 +1,181 @@ + + + + + + + + name property - ScheduleBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
name
+ +
+ +
+ + + + +
+
+ +

name property + Null safety +

+ + + +
+ +
+ String? + name + + +
+ + +
+

The name of this schedule.

+

See Schedule.name.

+
+ + +
+

Implementation

+
String? get name => _name;
+
+ +
+ + + +
+ +
+ void + name=(String? value) + + +
+ + + + +
+

Implementation

+
set name (String? value) {
+	_name = value;
+	notifyListeners();
+}
+
+ +
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleBuilderModel/numPeriods.html b/docs/models/ScheduleBuilderModel/numPeriods.html new file mode 100644 index 000000000..8fc514d29 --- /dev/null +++ b/docs/models/ScheduleBuilderModel/numPeriods.html @@ -0,0 +1,201 @@ + + + + + + + + numPeriods property - ScheduleBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
numPeriods
+ +
+ +
+ + + + +
+
+ +

numPeriods property + Null safety +

+ + + +
+ +
+ int + numPeriods + + +
+ + +
+

The amount of periods.

+

Grows and trims periods as necessary. This is Schedule.periods.length.

+
+ + +
+

Implementation

+
int get numPeriods => _numPeriods;
+
+ +
+ + + +
+ +
+ void + numPeriods=(int value) + + +
+ + + + +
+

Implementation

+
set numPeriods (int value) {
+	if (value == 0) {
+		periods.clear();
+	} else if (value < numPeriods) {
+		periods.removeRange(value, periods.length);
+	} else if (_numPeriods == 0) {
+		periods.add(
+			const Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 50)))
+		);
+	} else {
+		final Range prev = periods [value - 2].time;
+		periods.add(
+			Period.raw(
+				name: value.toString(),
+				time: Range(
+					Time(prev.end.hour + 1, 0),
+					Time(prev.end.hour + 2, 0)
+				)
+			)
+		);
+	}
+	_numPeriods = value;
+	notifyListeners();
+}
+
+ +
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleBuilderModel/periods.html b/docs/models/ScheduleBuilderModel/periods.html new file mode 100644 index 000000000..326d29ab2 --- /dev/null +++ b/docs/models/ScheduleBuilderModel/periods.html @@ -0,0 +1,153 @@ + + + + + + + + periods property - ScheduleBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
periods
+ +
+ +
+ + + + +
+
+ +

periods property + Null safety +

+ +
+ List<Period> + periods +
read / write
+ +
+ +
+

Numbers for the periods.

+

Regular periods have numbers, others (eg, homeroom and mincha) are null.

+
+ + +
+

Implementation

+
List<Period> periods = [];
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleBuilderModel/preset.html b/docs/models/ScheduleBuilderModel/preset.html new file mode 100644 index 000000000..a6be41b4d --- /dev/null +++ b/docs/models/ScheduleBuilderModel/preset.html @@ -0,0 +1,152 @@ + + + + + + + + preset property - ScheduleBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
preset
+ +
+ +
+ + + + +
+
+ +

preset property + Null safety +

+ +
+ Schedule? + preset +
read / write
+ +
+ +
+

The schedule that this schedule is based on.

+
+ + +
+

Implementation

+
Schedule? preset;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleBuilderModel/ready.html b/docs/models/ScheduleBuilderModel/ready.html new file mode 100644 index 000000000..00eeca4e0 --- /dev/null +++ b/docs/models/ScheduleBuilderModel/ready.html @@ -0,0 +1,160 @@ + + + + + + + + ready property - ScheduleBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ready
+ +
+ +
+ + + + +
+
+ +

ready property + Null safety +

+ + + +
+ +
+ bool + ready + + +
+ + +
+

Whether this schedule is ready to be built.

+
+ + +
+

Implementation

+
bool get ready => numPeriods > 0
+	&& periods.isNotEmpty
+	&& name != null && name!.isNotEmpty
+	&& !Schedule.schedules.any((Schedule other) => other.name == name);
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleBuilderModel/replaceTime.html b/docs/models/ScheduleBuilderModel/replaceTime.html new file mode 100644 index 000000000..b0cf9c0e0 --- /dev/null +++ b/docs/models/ScheduleBuilderModel/replaceTime.html @@ -0,0 +1,162 @@ + + + + + + + + replaceTime method - ScheduleBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
replaceTime
+ +
+ +
+ + + + +
+
+ +

replaceTime method + Null safety +

+ +
+ + +void +replaceTime(
  1. int index,
  2. +
  3. Range range
  4. +
) + + + +
+ +
+

Switches out a time in periods with a new time.

+
+ + + +
+

Implementation

+
void replaceTime(int index, Range range) {
+	periods [index] = Period.raw(
+		name: periods [index].name,
+		time: range,
+	);
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleBuilderModel/schedule.html b/docs/models/ScheduleBuilderModel/schedule.html new file mode 100644 index 000000000..093d747d5 --- /dev/null +++ b/docs/models/ScheduleBuilderModel/schedule.html @@ -0,0 +1,157 @@ + + + + + + + + schedule property - ScheduleBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
schedule
+ +
+ +
+ + + + +
+
+ +

schedule property + Null safety +

+ + + +
+ +
+ Schedule + schedule + + +
+ + +
+

The schedule being built.

+
+ + +
+

Implementation

+
Schedule get schedule => Schedule(name: name!, periods: periods);
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleBuilderModel/usePreset.html b/docs/models/ScheduleBuilderModel/usePreset.html new file mode 100644 index 000000000..fe9d57225 --- /dev/null +++ b/docs/models/ScheduleBuilderModel/usePreset.html @@ -0,0 +1,165 @@ + + + + + + + + usePreset method - ScheduleBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
usePreset
+ +
+ +
+ + + + +
+
+ +

usePreset method + Null safety +

+ +
+ + +void +usePreset(
  1. Schedule? schedule
  2. +
) + + + +
+ +
+

Sets properties of this schedule based on an existing schedule.

+

The schedule can then be fine-tuned afterwards.

+
+ + + +
+

Implementation

+
void usePreset(Schedule? schedule) {
+	if (schedule == null) {
+		return;
+	}
+	preset = schedule;
+	periods = List.of(schedule.periods);  // make a copy
+	_name = schedule.name;
+	_numPeriods = schedule.periods.length;
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel-class.html b/docs/models/ScheduleModel-class.html new file mode 100644 index 000000000..df754a931 --- /dev/null +++ b/docs/models/ScheduleModel-class.html @@ -0,0 +1,633 @@ + + + + + + + + ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ScheduleModel
+ +
+ +
+ + + + +
+
+ +

ScheduleModel class + Null safety + +

+ + +
+

A data model for the user's schedule.

+
+ + + +
+

Constructors

+ +
+
+ ScheduleModel() +
+
+ +
+
+
+ +
+

Properties

+ +
+
+ calendar + ↔ List<List<Day?>> + +
+
+ The calendar for the month. +
read / write
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ hasSchool + → bool + +
+
+ Whether there is school today. +
read-only
+ +
+ +
+ nextPeriod + Period? + +
+
+ The next period. +
read / write
+ +
+ +
+ nextSubject + Subject? + +
+
+ The next subject. +
read-only
+ +
+ +
+ period + Period? + +
+
+ The current period. +
read / write
+ +
+ +
+ periodIndex + ↔ int? + +
+
+ The index that represents period's location in periods. +
read / write
+ +
+ +
+ periods + ↔ List<Period>? + +
+
+ A list of today's periods. +
read / write
+ +
+ +
+ reminders + Reminders + +
+
+ The reminders data model. +
read / write
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+ subject + Subject? + +
+
+ The current subject. +
read-only
+ +
+ +
+ subjects + ↔ Map<String, Subject> + +
+
+ The subjects this user has. +
read / write
+ +
+ +
+ timer + ↔ Timer? + +
+
+ A timer that updates the period. [...] +
read / write
+ +
+ +
+ today + Day? + +
+
+ The Day that represents today. +
read / write
+ +
+ +
+ user + User + +
+
+ The current user. +
read / write
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
override
+ +
+ +
+ init() + → Future<void> + + + +
+
+ Gets whatever data is needed by this model from a service. [...] + + +
+ +
+ initCalendar() + → Future<void> + + + +
+
+ Initializes the calendar. + + +
+ +
+ isValidReminder(Reminder reminder) + → bool + + + +
+
+ Determines whether a reminder is compatible with the user's schedule. [...] + + +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ onNewPeriod({bool first = false}) + → void + + + +
+
+ Updates the current period. + + +
+ +
+ remindersListener() + → void + + + +
+
+ A callback that runs whenever the reminders data model changes. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ scheduleReminders() + → Future<void> + + + +
+
+ Schedules notifications for today's reminders. [...] + + +
+ +
+ setToday() + → void + + + +
+
+ Changes the current day. [...] + + +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+ updateReminders({bool scheduleNotifications = false}) + → void + + + +
+
+ Updates the reminders given the current period. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ +
+

Static Properties

+ +
+
+ now + ↔ DateTime + +
+
+ The current date. [...] +
read / write
+ +
+ +
+
+ + +
+

Constants

+ +
+
+ timerInterval + → const Duration + + +
+
+ How often to refresh the schedule. + + +
+ Duration(minutes: 1) +
+
+ +
+
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/ScheduleModel.html b/docs/models/ScheduleModel/ScheduleModel.html new file mode 100644 index 000000000..77d272267 --- /dev/null +++ b/docs/models/ScheduleModel/ScheduleModel.html @@ -0,0 +1,159 @@ + + + + + + + + ScheduleModel constructor - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ScheduleModel
+ +
+ +
+ + + + +
+
+ +

ScheduleModel constructor + Null safety +

+ +
+ ScheduleModel() +
+ + + + + + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/calendar.html b/docs/models/ScheduleModel/calendar.html new file mode 100644 index 000000000..2a57fae4d --- /dev/null +++ b/docs/models/ScheduleModel/calendar.html @@ -0,0 +1,169 @@ + + + + + + + + calendar property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
calendar
+ +
+ +
+ + + + +
+
+ +

calendar property + Null safety +

+ +
+ List<List<Day?>> + calendar +
read / write
+ +
+ +
+

The calendar for the month.

+
+ + +
+

Implementation

+
late List<List<Day?>> calendar;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/dispose.html b/docs/models/ScheduleModel/dispose.html new file mode 100644 index 000000000..887ce13c3 --- /dev/null +++ b/docs/models/ScheduleModel/dispose.html @@ -0,0 +1,185 @@ + + + + + + + + dispose method - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
dispose
+ +
+ +
+ + + + +
+
+ +

dispose method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +void +dispose() + +
override
+ +
+ +
+

Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed).

+

This method should only be called by the object's owner.

+
+ + + +
+

Implementation

+
@override
+void dispose() {
+	Models.instance.reminders.removeListener(remindersListener);
+	timer?.cancel();
+	super.dispose();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/hasSchool.html b/docs/models/ScheduleModel/hasSchool.html new file mode 100644 index 000000000..fc1472783 --- /dev/null +++ b/docs/models/ScheduleModel/hasSchool.html @@ -0,0 +1,174 @@ + + + + + + + + hasSchool property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
hasSchool
+ +
+ +
+ + + + +
+
+ +

hasSchool property + Null safety +

+ + + +
+ +
+ bool + hasSchool + + +
+ + +
+

Whether there is school today.

+
+ + +
+

Implementation

+
bool get hasSchool => today != null;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/init.html b/docs/models/ScheduleModel/init.html new file mode 100644 index 000000000..a8f114644 --- /dev/null +++ b/docs/models/ScheduleModel/init.html @@ -0,0 +1,184 @@ + + + + + + + + init method - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
init
+ +
+ +
+ + + + +
+
+ +

init method + Null safety +

+ +
+ +
+
    +
  1. @override
  2. +
+
+ +Future<void> +init() + + + +
+ +
+

Gets whatever data is needed by this model from a service.

+

This model may not function properly if this function is not called.

+
+ + + +
+

Implementation

+
@override
+Future<void> init() async {
+	reminders = Models.instance.reminders
+		..addListener(remindersListener);
+	user = Models.instance.user.data;
+	subjects = Models.instance.user.subjects;
+	await initCalendar();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/initCalendar.html b/docs/models/ScheduleModel/initCalendar.html new file mode 100644 index 000000000..d7b6d5d78 --- /dev/null +++ b/docs/models/ScheduleModel/initCalendar.html @@ -0,0 +1,179 @@ + + + + + + + + initCalendar method - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
initCalendar
+ +
+ +
+ + + + +
+
+ +

initCalendar method + Null safety +

+ +
+ + +Future<void> +initCalendar() + + + +
+ +
+

Initializes the calendar.

+
+ + + +
+

Implementation

+
Future<void> initCalendar() async {
+	Schedule.schedules = [
+		for (final Map json in await Services.instance.database.getSchedules())
+			Schedule.fromJson(json)
+	];
+	calendar = Day.getCalendar(await Services.instance.database.calendar);
+	setToday();
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/isValidReminder.html b/docs/models/ScheduleModel/isValidReminder.html new file mode 100644 index 000000000..ae6bcce44 --- /dev/null +++ b/docs/models/ScheduleModel/isValidReminder.html @@ -0,0 +1,188 @@ + + + + + + + + isValidReminder method - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
isValidReminder
+ +
+ +
+ + + + +
+
+ +

isValidReminder method + Null safety +

+ +
+ + +bool +isValidReminder(
  1. Reminder reminder
  2. +
) + + + +
+ +
+

Determines whether a reminder is compatible with the user's schedule.

+

If User.dayNames has changed, then reminders with PeriodReminderTime +might fail. Similarly, if the user changes classes, SubjectReminderTime +might fail. This method helps the app spot these inconsistencies and get +rid of the problematic reminders.

+
+ + + +
+

Implementation

+
bool isValidReminder(Reminder reminder) {
+	switch(reminder.time.type) {
+		case ReminderTimeType.period:
+			final PeriodReminderTime time = reminder.time as PeriodReminderTime;
+			final Iterable<String> dayNames = user.schedule.keys;
+			return dayNames.contains(time.dayName)
+				&& int.parse(time.period) <= user.schedule [time.dayName]!.length;
+		case ReminderTimeType.subject:
+			final SubjectReminderTime time = reminder.time as SubjectReminderTime;
+			return subjects.values.any((Subject subject) => subject.name == time.name);
+		default: throw StateError("Reminder <$reminder> has invalid ReminderTime");
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/nextPeriod.html b/docs/models/ScheduleModel/nextPeriod.html new file mode 100644 index 000000000..6d1e5d070 --- /dev/null +++ b/docs/models/ScheduleModel/nextPeriod.html @@ -0,0 +1,169 @@ + + + + + + + + nextPeriod property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
nextPeriod
+ +
+ +
+ + + + +
+
+ +

nextPeriod property + Null safety +

+ +
+ Period? + nextPeriod +
read / write
+ +
+ +
+

The next period.

+
+ + +
+

Implementation

+
Period? nextPeriod;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/nextSubject.html b/docs/models/ScheduleModel/nextSubject.html new file mode 100644 index 000000000..797b9f2c6 --- /dev/null +++ b/docs/models/ScheduleModel/nextSubject.html @@ -0,0 +1,174 @@ + + + + + + + + nextSubject property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
nextSubject
+ +
+ +
+ + + + +
+
+ +

nextSubject property + Null safety +

+ + + +
+ +
+ Subject? + nextSubject + + +
+ + +
+

The next subject.

+
+ + +
+

Implementation

+
Subject? get nextSubject => subjects [nextPeriod?.id];
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/now.html b/docs/models/ScheduleModel/now.html new file mode 100644 index 000000000..898548a91 --- /dev/null +++ b/docs/models/ScheduleModel/now.html @@ -0,0 +1,170 @@ + + + + + + + + now property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
now
+ +
+ +
+ + + + +
+
+ +

now property + Null safety +

+ +
+ DateTime + now +
read / write
+ +
+ +
+

The current date.

+

This helps track when the day has changed.

+
+ + +
+

Implementation

+
static DateTime now = DateTime.now();
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/onNewPeriod.html b/docs/models/ScheduleModel/onNewPeriod.html new file mode 100644 index 000000000..d93845615 --- /dev/null +++ b/docs/models/ScheduleModel/onNewPeriod.html @@ -0,0 +1,211 @@ + + + + + + + + onNewPeriod method - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
onNewPeriod
+ +
+ +
+ + + + +
+
+ +

onNewPeriod method + Null safety +

+ +
+ + +void +onNewPeriod(
  1. {bool first = false}
  2. +
) + + + +
+ +
+

Updates the current period.

+
+ + + +
+

Implementation

+
void onNewPeriod({bool first = false}) {
+	final DateTime newDate = DateTime.now();
+
+	// Day changed. Probably midnight.
+	if (newDate.day != now.day) {
+		now = newDate;
+		return setToday();
+	}
+
+	// no school today.
+	if (!hasSchool) {
+		period = nextPeriod = periods = null;
+		return;
+	}
+
+	// So we have school today...
+	final int? newIndex = today?.getCurrentPeriod();
+
+	// Maybe the day changed
+	if (newIndex != null && newIndex == periodIndex) {
+		return;
+	}
+
+	// period changed since last checked.
+	periodIndex = newIndex;
+
+	// School ended
+	if (newIndex == null) {
+		period = nextPeriod = null;
+		return;
+	}
+
+	// Period changed and there is still school.
+	period = periods! [newIndex];
+	nextPeriod = newIndex < periods!.length - 1
+		? periods! [newIndex + 1]
+		: null;
+
+	updateReminders(scheduleNotifications: first);
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/period.html b/docs/models/ScheduleModel/period.html new file mode 100644 index 000000000..49159f46a --- /dev/null +++ b/docs/models/ScheduleModel/period.html @@ -0,0 +1,169 @@ + + + + + + + + period property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
period
+ +
+ +
+ + + + +
+
+ +

period property + Null safety +

+ +
+ Period? + period +
read / write
+ +
+ +
+

The current period.

+
+ + +
+

Implementation

+
Period? period;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/periodIndex.html b/docs/models/ScheduleModel/periodIndex.html new file mode 100644 index 000000000..0c5e33a4f --- /dev/null +++ b/docs/models/ScheduleModel/periodIndex.html @@ -0,0 +1,169 @@ + + + + + + + + periodIndex property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
periodIndex
+ +
+ +
+ + + + +
+
+ +

periodIndex property + Null safety +

+ +
+ int? + periodIndex +
read / write
+ +
+ +
+

The index that represents period's location in periods.

+
+ + +
+

Implementation

+
int? periodIndex;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/periods.html b/docs/models/ScheduleModel/periods.html new file mode 100644 index 000000000..4cb29c4df --- /dev/null +++ b/docs/models/ScheduleModel/periods.html @@ -0,0 +1,169 @@ + + + + + + + + periods property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
periods
+ +
+ +
+ + + + +
+
+ +

periods property + Null safety +

+ +
+ List<Period>? + periods +
read / write
+ +
+ +
+

A list of today's periods.

+
+ + +
+

Implementation

+
List<Period>? periods;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/reminders.html b/docs/models/ScheduleModel/reminders.html new file mode 100644 index 000000000..0ebb58722 --- /dev/null +++ b/docs/models/ScheduleModel/reminders.html @@ -0,0 +1,169 @@ + + + + + + + + reminders property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
reminders
+ +
+ +
+ + + + +
+
+ +

reminders property + Null safety +

+ +
+ Reminders + reminders +
read / write
+ +
+ +
+

The reminders data model.

+
+ + +
+

Implementation

+
late Reminders reminders;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/remindersListener.html b/docs/models/ScheduleModel/remindersListener.html new file mode 100644 index 000000000..1900a1a8c --- /dev/null +++ b/docs/models/ScheduleModel/remindersListener.html @@ -0,0 +1,172 @@ + + + + + + + + remindersListener method - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
remindersListener
+ +
+ +
+ + + + +
+
+ +

remindersListener method + Null safety +

+ +
+ + +void +remindersListener() + + + +
+ +
+

A callback that runs whenever the reminders data model changes.

+

See updateReminders.

+
+ + + +
+

Implementation

+
void remindersListener() => updateReminders(scheduleNotifications: true);
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/scheduleReminders.html b/docs/models/ScheduleModel/scheduleReminders.html new file mode 100644 index 000000000..f8bd9c8dc --- /dev/null +++ b/docs/models/ScheduleModel/scheduleReminders.html @@ -0,0 +1,205 @@ + + + + + + + + scheduleReminders method - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
scheduleReminders
+ +
+ +
+ + + + +
+
+ +

scheduleReminders method + Null safety +

+ +
+ + +Future<void> +scheduleReminders() + + + +
+ +
+

Schedules notifications for today's reminders.

+

Starting from the current period, schedules a notification for the period +using Notifications.scheduleNotification

+
+ + + +
+

Implementation

+
Future<void> scheduleReminders() async {
+	Services.instance.notifications.cancelAll();
+	final DateTime now = DateTime.now();
+
+	// No school today/right now
+	if (!hasSchool || periodIndex == null || periods == null) {
+		return;
+	}
+
+	// For all periods starting from periodIndex, schedule applicable reminders.
+	for (int index = periodIndex!; index < periods!.length; index++) {
+		final Period period = periods! [index];
+		for (final int reminderIndex in reminders.getReminders(
+			period: period.name,
+			subject: subjects [period.id]?.name,
+			dayName: today?.name,
+		)) {
+			Services.instance.notifications.scheduleNotification(
+				date: DateTime(
+					now.year,
+					now.month,
+					now.day,
+					period.time.start.hour,
+					period.time.start.minutes,
+				),
+				notification: Notification.reminder(
+					title: "New reminder",
+					message: reminders.reminders [reminderIndex].message,
+				)
+			);
+		}
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/setToday.html b/docs/models/ScheduleModel/setToday.html new file mode 100644 index 000000000..f578fe496 --- /dev/null +++ b/docs/models/ScheduleModel/setToday.html @@ -0,0 +1,189 @@ + + + + + + + + setToday method - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
setToday
+ +
+ +
+ + + + +
+
+ +

setToday method + Null safety +

+ +
+ + +void +setToday() + + + +
+ +
+

Changes the current day.

+

If there is school today, then schedules the time to update every period. +See onNewPeriod.

+

Only to be called when the day actually changes.

+
+ + + +
+

Implementation

+
void setToday() {
+	// initialize today
+	today = Day.getDate(calendar, now);
+	timer?.cancel();
+	if (hasSchool) {
+		// initialize periods.
+		periods = user.getPeriods(today!);
+		// initialize the current period.
+		onNewPeriod(first: true);
+		// initialize the timer. See comments for [timer].
+		timer = Timer.periodic(
+			timerInterval,
+			(Timer timer) => onNewPeriod()
+		);
+	}
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/subject.html b/docs/models/ScheduleModel/subject.html new file mode 100644 index 000000000..6b90dab11 --- /dev/null +++ b/docs/models/ScheduleModel/subject.html @@ -0,0 +1,174 @@ + + + + + + + + subject property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
subject
+ +
+ +
+ + + + +
+
+ +

subject property + Null safety +

+ + + +
+ +
+ Subject? + subject + + +
+ + +
+

The current subject.

+
+ + +
+

Implementation

+
Subject? get subject => subjects [period?.id];
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/subjects.html b/docs/models/ScheduleModel/subjects.html new file mode 100644 index 000000000..502ba5616 --- /dev/null +++ b/docs/models/ScheduleModel/subjects.html @@ -0,0 +1,169 @@ + + + + + + + + subjects property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
subjects
+ +
+ +
+ + + + +
+
+ +

subjects property + Null safety +

+ +
+ Map<String, Subject> + subjects +
read / write
+ +
+ +
+

The subjects this user has.

+
+ + +
+

Implementation

+
late Map<String, Subject> subjects;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/timer.html b/docs/models/ScheduleModel/timer.html new file mode 100644 index 000000000..98c42c06b --- /dev/null +++ b/docs/models/ScheduleModel/timer.html @@ -0,0 +1,171 @@ + + + + + + + + timer property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
timer
+ +
+ +
+ + + + +
+
+ +

timer property + Null safety +

+ +
+ Timer? + timer +
read / write
+ +
+ +
+

A timer that updates the period.

+

This timer fires once every timerInterval, and calls onNewPeriod +when it does.

+
+ + +
+

Implementation

+
Timer? timer;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/timerInterval-constant.html b/docs/models/ScheduleModel/timerInterval-constant.html new file mode 100644 index 000000000..7300d4b0e --- /dev/null +++ b/docs/models/ScheduleModel/timerInterval-constant.html @@ -0,0 +1,169 @@ + + + + + + + + timerInterval constant - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
timerInterval
+ +
+ +
+ + + + +
+
+ +

timerInterval constant + Null safety +

+ +
+ Duration + const timerInterval + + +
+ +
+

How often to refresh the schedule.

+
+ + +
+

Implementation

+
static const timerInterval = Duration (minutes: 1);
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/today.html b/docs/models/ScheduleModel/today.html new file mode 100644 index 000000000..ee29e32b1 --- /dev/null +++ b/docs/models/ScheduleModel/today.html @@ -0,0 +1,169 @@ + + + + + + + + today property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
today
+ +
+ +
+ + + + +
+
+ +

today property + Null safety +

+ +
+ Day? + today +
read / write
+ +
+ +
+

The Day that represents today.

+
+ + +
+

Implementation

+
Day? today;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/updateReminders.html b/docs/models/ScheduleModel/updateReminders.html new file mode 100644 index 000000000..27308a04e --- /dev/null +++ b/docs/models/ScheduleModel/updateReminders.html @@ -0,0 +1,196 @@ + + + + + + + + updateReminders method - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
updateReminders
+ +
+ +
+ + + + +
+
+ +

updateReminders method + Null safety +

+ +
+ + +void +updateReminders(
  1. {bool scheduleNotifications = false}
  2. +
) + + + +
+ +
+

Updates the reminders given the current period.

+

Is responsible for updating Reminders.currentReminders, +Reminders.nextReminders and calling Reminders.markShown. Will also +schedule notifications if that has not been done yet today or as a +response to changed reminders. See scheduleReminders for more details +on scheduling notifications.

+
+ + + +
+

Implementation

+
void updateReminders({bool scheduleNotifications = false}) {
+	reminders
+		..currentReminders = reminders.getReminders(
+			period: period?.name,
+			subject: subjects [period?.id]?.name,
+			dayName: today?.name,
+		)
+		..nextReminders = reminders.getReminders(
+			period: nextPeriod?.name,
+			subject: subjects [nextPeriod?.id]?.name,
+			dayName: today?.name,
+		);
+
+	reminders.currentReminders.forEach(reminders.markShown);
+
+	if (scheduleNotifications) {
+		Future(scheduleReminders);
+	}
+	notifyListeners();
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleModel/user.html b/docs/models/ScheduleModel/user.html new file mode 100644 index 000000000..04dfd404f --- /dev/null +++ b/docs/models/ScheduleModel/user.html @@ -0,0 +1,169 @@ + + + + + + + + user property - ScheduleModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
user
+ +
+ +
+ + + + +
+
+ +

user property + Null safety +

+ +
+ User + user +
read / write
+ +
+ +
+

The current user.

+
+ + +
+

Implementation

+
late User user;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleViewModel-class.html b/docs/models/ScheduleViewModel-class.html new file mode 100644 index 000000000..566c12216 --- /dev/null +++ b/docs/models/ScheduleViewModel-class.html @@ -0,0 +1,417 @@ + + + + + + + + ScheduleViewModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ScheduleViewModel
+ +
+ +
+ + + + +
+
+ +

ScheduleViewModel class + Null safety + +

+ + +
+

A view model for the schedule page.

+
+ + +
+
+ + +
Mixed in types
+
+ + + +
+
+ +
+

Constructors

+ +
+
+ ScheduleViewModel() +
+
+ Initializes the view model. [...] +
+
+
+ +
+

Properties

+ +
+
+ dataModel + ScheduleModel + +
+
+ The schedule data model. [...] +
final
+ +
+ +
+ date + ↔ DateTime + +
+
+ Gets the date whose schedule the user is looking at +
read / write
+ +
+ +
+ day + Day + +
+
+ The day whose schedule is being shown in the UI. +
read / write
+ +
+ +
+ defaultDay + Day + +
+
+ The default Day for the UI. +
read / write
+ +
+ +
+ hashCode + → int + +
+
+ The hash code for this object. [...] +
read-only, inherited
+ +
+ +
+ hasListeners + → bool + +
+
+ Whether any listeners are currently registered. [...] +
@protected, read-only, inherited
+ +
+ +
+ runtimeType + → Type + +
+
+ A representation of the runtime type of the object. +
read-only, inherited
+ +
+ +
+
+ +
+

Methods

+
+
+ addListener(VoidCallback listener) + → void + + + +
+
+ Register a closure to be called when the object changes. [...] +
inherited
+ +
+ +
+ dispose() + → void + + + +
+
+ Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
@mustCallSuper, inherited
+ +
+ +
+ noSuchMethod(Invocation invocation) + → dynamic + + + +
+
+ Invoked when a non-existent method or property is accessed. [...] +
inherited
+ +
+ +
+ notifyListeners() + → void + + + +
+
+ Call all the registered listeners. [...] + + +
+ +
+ removeListener(VoidCallback listener) + → void + + + +
+
+ Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
inherited
+ +
+ +
+ toString() + → String + + + +
+
+ A string representation of this object. [...] +
inherited
+ +
+ +
+ update({String? newName, Schedule? newSchedule, void onInvalidSchedule()?}) + → void + + + +
+
+ Updates the UI to a new day given a new dayName or schedule. [...] + + +
+ +
+
+ +
+

Operators

+
+
+ operator ==(Object other) + → bool + + + +
+
+ The equality operator. [...] +
inherited
+ +
+ +
+
+ +
+

Static Properties

+ +
+
+ defatulSchedule + Schedule + +
+
+ The default Schedule for the UI. +
read-only
+ +
+ +
+
+ + + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleViewModel/ScheduleViewModel.html b/docs/models/ScheduleViewModel/ScheduleViewModel.html new file mode 100644 index 000000000..cbb9311ba --- /dev/null +++ b/docs/models/ScheduleViewModel/ScheduleViewModel.html @@ -0,0 +1,157 @@ + + + + + + + + ScheduleViewModel constructor - ScheduleViewModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
ScheduleViewModel
+ +
+ +
+ + + + +
+
+ +

ScheduleViewModel constructor + Null safety +

+ +
+ ScheduleViewModel() +
+ + +
+

Initializes the view model.

+

Also initializes the default day shown to the user. +If today is a school day, then use that. Otherwise, use the +defaults (see defatulSchedule).

+
+ + + +
+

Implementation

+
ScheduleViewModel () : dataModel = Models.instance.schedule {
+	defaultDay = Day(
+		name: Models.instance.user.data.schedule.keys.first,
+		schedule: defatulSchedule
+	);
+	day = dataModel.today ?? defaultDay;
+}
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleViewModel/dataModel.html b/docs/models/ScheduleViewModel/dataModel.html new file mode 100644 index 000000000..3ce6759a4 --- /dev/null +++ b/docs/models/ScheduleViewModel/dataModel.html @@ -0,0 +1,152 @@ + + + + + + + + dataModel property - ScheduleViewModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
dataModel
+ +
+ +
+ + + + +
+
+ +

dataModel property + Null safety +

+ +
+ ScheduleModel + dataModel +
final
+ +
+ +
+

The schedule data model.

+

Used to retrieve the schedule for a given day.

+
+ + +
+

Implementation

+
final ScheduleModel dataModel;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleViewModel/date.html b/docs/models/ScheduleViewModel/date.html new file mode 100644 index 000000000..74afb915d --- /dev/null +++ b/docs/models/ScheduleViewModel/date.html @@ -0,0 +1,194 @@ + + + + + + + + date property - ScheduleViewModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
date
+ +
+ +
+ + + + +
+
+ +

date property + Null safety +

+ + + +
+ +
+ DateTime + date + + +
+ + +
+

Gets the date whose schedule the user is looking at

+
+ + +
+

Implementation

+
DateTime get date => _selectedDay;
+
+ +
+ + + +
+ +
+ void + date=(DateTime date) + + +
+ + +
+

Attempts to set the UI to the schedule of the given day.

+

If there is no school on that day, then ArgumentError is thrown.

+
+ + +
+

Implementation

+
set date(DateTime date) {
+	// Get rid of time
+	final DateTime justDate = DateTime.utc (
+		date.year,
+		date.month,
+		date.day
+	);
+	final Day? selected = Day.getDate(dataModel.calendar, justDate);
+	if (selected == null) {
+		throw Exception("No School");
+	}
+	day = selected;
+	_selectedDay = justDate;
+	notifyListeners();
+}
+
+ +
+ +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleViewModel/day.html b/docs/models/ScheduleViewModel/day.html new file mode 100644 index 000000000..2bbab477c --- /dev/null +++ b/docs/models/ScheduleViewModel/day.html @@ -0,0 +1,151 @@ + + + + + + + + day property - ScheduleViewModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
day
+ +
+ +
+ + + + +
+
+ +

day property + Null safety +

+ +
+ Day + day +
read / write
+ +
+ +
+

The day whose schedule is being shown in the UI.

+
+ + +
+

Implementation

+
late Day day;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleViewModel/defatulSchedule.html b/docs/models/ScheduleViewModel/defatulSchedule.html new file mode 100644 index 000000000..4bec49c0d --- /dev/null +++ b/docs/models/ScheduleViewModel/defatulSchedule.html @@ -0,0 +1,156 @@ + + + + + + + + defatulSchedule property - ScheduleViewModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
defatulSchedule
+ +
+ +
+ + + + +
+
+ +

defatulSchedule property + Null safety +

+ + + +
+ +
+ Schedule + defatulSchedule + + +
+ + +
+

The default Schedule for the UI.

+
+ + +
+

Implementation

+
static Schedule get defatulSchedule => Schedule.schedules.first;
+
+ +
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleViewModel/defaultDay.html b/docs/models/ScheduleViewModel/defaultDay.html new file mode 100644 index 000000000..a71b159f7 --- /dev/null +++ b/docs/models/ScheduleViewModel/defaultDay.html @@ -0,0 +1,151 @@ + + + + + + + + defaultDay property - ScheduleViewModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
defaultDay
+ +
+ +
+ + + + +
+
+ +

defaultDay property + Null safety +

+ +
+ Day + defaultDay +
read / write
+ +
+ +
+

The default Day for the UI.

+
+ + +
+

Implementation

+
late Day defaultDay;
+
+
+
+ + +
+ + + +
+ +
+ + ramaz + 2.1.1+1 + + + +
+ + + + + + + + + + + diff --git a/docs/models/ScheduleViewModel/update.html b/docs/models/ScheduleViewModel/update.html new file mode 100644 index 000000000..db578c5be --- /dev/null +++ b/docs/models/ScheduleViewModel/update.html @@ -0,0 +1,177 @@ + + + + + + + + update method - ScheduleViewModel class - models library - Dart API + + + + + + + + + + + + + + + + +
+ +
+ + +
update
+ +
+ +
+ + + + +
+
+ +

update method + Null safety +

+ +
+ + +void +update(
  1. {String? newName,
  2. +
  3. Schedule? newSchedule,
  4. +
  5. void onInvalidSchedule(
      +)?}
    1. +
    ) + + + +
    + +
    +

    Updates the UI to a new day given a new dayName or schedule.

    +

    If the dayName is non-null, the schedule defaults to defatulSchedule.

    +
    + + + +
    +

    Implementation

    +
    void update({
    +	String? newName,
    +	Schedule? newSchedule,
    +	void Function()? onInvalidSchedule,
    +}) {
    +	final String name = newName ?? day.name;
    +	final Schedule schedule = newSchedule ?? day.schedule;
    +	day = Day(name: name, schedule: schedule);
    +	notifyListeners();
    +	try {
    +		// Just to see if the computation is possible.
    +		// TODO: Move the logic from ClassList here.
    +		Models.instance.schedule.user.getPeriods(day);
    +	} on RangeError { // ignore: avoid_catching_errors
    +		day = Day(name: day.name, schedule: defatulSchedule);
    +		if (onInvalidSchedule != null) {
    +			onInvalidSchedule();
    +		}
    +	}
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SortOption-class.html b/docs/models/SortOption-class.html new file mode 100644 index 000000000..937d51223 --- /dev/null +++ b/docs/models/SortOption-class.html @@ -0,0 +1,303 @@ + + + + + + + + SortOption enum - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    SortOption
    + +
    + +
    + + + + +
    +
    + +

    SortOption enum + Null safety + +

    + + +
    +

    Different ways to sort the sports calendar.

    +
    + + + +
    +

    Constants

    + +
    +
    + chronological + → const SortOption + + +
    +
    +

    Sorts the sports games chronologically.

    +

    Uses SportsGame.date.

    + + +
    + const SortOption(0) +
    +
    + +
    + sport + → const SortOption + + +
    +
    +

    Sorts the sports game by sport.

    +

    Uses SportsGame.sport.

    + + +
    + const SortOption(1) +
    +
    + +
    + values + → const List<SortOption> + + +
    +
    +

    A constant List of the values in this enum, in order of their declaration.

    + + +
    + const List<SortOption> +
    +
    + +
    +
    + + +
    +

    Properties

    + +
    +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    read-only, inherited
    + +
    + +
    + index + → int + +
    +
    +

    The integer index of this enum.

    +
    final
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + toString() + → String + + + +
    +
    + A string representation of this object. [...] + + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    inherited
    + +
    + +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SortOption/hashCode.html b/docs/models/SortOption/hashCode.html new file mode 100644 index 000000000..2fb45b0ec --- /dev/null +++ b/docs/models/SortOption/hashCode.html @@ -0,0 +1,169 @@ + + + + + + + + hashCode property - SortOption extension - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    hashCode
    + +
    + +
    + + + + +
    +
    +

    hashCode property + Null safety +

    + + + +
    + +
    + int + hashCode +
    inherited
    + +
    + + +
    +

    The hash code for this object.

    +

    A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

    +

    All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

    +

    If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

    +

    Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

    +

    Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

    +

    If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

    +
    + + +
    +

    Implementation

    +
    external int get hashCode;
    +
    + +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SortOption/noSuchMethod.html b/docs/models/SortOption/noSuchMethod.html new file mode 100644 index 000000000..2ce213f69 --- /dev/null +++ b/docs/models/SortOption/noSuchMethod.html @@ -0,0 +1,177 @@ + + + + + + + + noSuchMethod method - SortOption extension - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    noSuchMethod
    + +
    + +
    + + + + +
    +
    +

    noSuchMethod method + Null safety +

    + +
    + + +dynamic +noSuchMethod(
    1. Invocation invocation
    2. +
    ) + +
    inherited
    + +
    + +
    +

    Invoked when a non-existent method or property is accessed.

    +

    A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

    +
    dynamic object = 1;
    +object.add(42); // Statically allowed, run-time error
    +
    +

    This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

    +

    Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

    +

    A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

    +
    class MockList<T> implements List<T> {
    +  noSuchMethod(Invocation invocation) {
    +    log(invocation);
    +    super.noSuchMethod(invocation); // Will throw.
    +  }
    +}
    +void main() {
    +  MockList().add(42);
    +}
    +
    +

    This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

    +

    If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

    +

    The default behavior is to throw a NoSuchMethodError.

    +
    + + + +
    +

    Implementation

    +
    @pragma("vm:entry-point")
    +external dynamic noSuchMethod(Invocation invocation);
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SortOption/operator_equals.html b/docs/models/SortOption/operator_equals.html new file mode 100644 index 000000000..68aff6167 --- /dev/null +++ b/docs/models/SortOption/operator_equals.html @@ -0,0 +1,168 @@ + + + + + + + + operator == method - SortOption extension - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    operator ==
    + +
    + +
    + + + + +
    +
    +

    operator == method + Null safety +

    + +
    + + +bool +operator ==(
    1. Object other
    2. +
    ) + +
    inherited
    + +
    + +
    +

    The equality operator.

    +

    The default behavior for all Objects is to return true if and +only if this object and other are the same object.

    +

    Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

    +
      +
    • +

      Total: It must return a boolean for all arguments. It should never throw.

      +
    • +
    • +

      Reflexive: For all objects o, o == o must be true.

      +
    • +
    • +

      Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

      +
    • +
    • +

      Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

      +
    • +
    +

    The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

    +

    If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

    +
    + + + +
    +

    Implementation

    +
    external bool operator ==(Object other);
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SortOption/runtimeType.html b/docs/models/SortOption/runtimeType.html new file mode 100644 index 000000000..ef836cf4b --- /dev/null +++ b/docs/models/SortOption/runtimeType.html @@ -0,0 +1,144 @@ + + + + + + + + runtimeType property - SortOption extension - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    runtimeType
    + +
    + +
    + + + + +
    +
    +

    runtimeType property + Null safety +

    + + + +
    + +
    + Type + runtimeType +
    inherited
    + +
    + + +
    +

    A representation of the runtime type of the object.

    +
    + + +
    +

    Implementation

    +
    external Type get runtimeType;
    +
    + +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SortOption/toString.html b/docs/models/SortOption/toString.html new file mode 100644 index 000000000..c6d322b37 --- /dev/null +++ b/docs/models/SortOption/toString.html @@ -0,0 +1,147 @@ + + + + + + + + toString method - SortOption extension - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    toString
    + +
    + +
    + + + + +
    +
    + +

    toString method + Null safety +

    + +
    + + +String +toString() + + + +
    + +
    +

    A string representation of this object.

    +

    Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

    +

    Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

    +
    + + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports-class.html b/docs/models/Sports-class.html new file mode 100644 index 000000000..313908eef --- /dev/null +++ b/docs/models/Sports-class.html @@ -0,0 +1,457 @@ + + + + + + + + Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    Sports
    + +
    + +
    + + + + +
    +
    + +

    Sports class + Null safety + +

    + + +
    +

    A data model for sports games.

    +

    This class hosts todayGames, a list of games being played today, +as well as CRUD methods for the database (if permissions allow).

    +
    + + + +
    +

    Constructors

    + +
    +
    + Sports() +
    +
    + +
    +
    +
    + +
    +

    Properties

    + +
    +
    + games + ↔ List<SportsGame> + +
    +
    + A list of all the games taking place. +
    read / write
    + +
    + +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    read-only, inherited
    + +
    + +
    + hasListeners + → bool + +
    +
    + Whether any listeners are currently registered. [...] +
    @protected, read-only, inherited
    + +
    + +
    + now + ↔ DateTime + +
    +
    + Helps partition games by past and future. +
    read / write
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    + timer + ↔ Timer + +
    +
    + A timer to refresh todayGames. +
    read / write
    + +
    + +
    + todayGames + ↔ List<int> + +
    +
    + A list of games being played today to be showed on the home screen. +
    read / write
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + addGame(SportsGame? game) + → Future<void> + + + +
    +
    + Adds a game to the database. + + +
    + +
    + addListener(VoidCallback listener) + → void + + + +
    +
    + Register a closure to be called when the object changes. [...] +
    inherited
    + +
    + +
    + delete(int index) + → Future<void> + + + +
    +
    + Deletes a game from the database. + + +
    + +
    + dispose() + → void + + + +
    +
    + Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
    @mustCallSuper, inherited
    + +
    + +
    + getTodayGames() + → List<int> + + + +
    +
    + Returns a list of all the games taking place today. [...] + + +
    + +
    + init() + → Future<void> + + + +
    +
    + Loads data from the device and + + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + notifyListeners() + → void + + + +
    +
    + Call all the registered listeners. [...] + + +
    + +
    + removeListener(VoidCallback listener) + → void + + + +
    +
    + Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
    inherited
    + +
    + +
    + replace(int index, SportsGame? newGame) + → Future<void> + + + +
    +
    + Replaces a game with another and saves it to the database. [...] + + +
    + +
    + saveGames() + → Future<void> + + + +
    +
    + Saves the games to the database. [...] + + +
    + +
    + toString() + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    inherited
    + +
    + +
    +
    + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/Sports.html b/docs/models/Sports/Sports.html new file mode 100644 index 000000000..206c22d4c --- /dev/null +++ b/docs/models/Sports/Sports.html @@ -0,0 +1,144 @@ + + + + + + + + Sports constructor - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    Sports
    + +
    + +
    + + + + +
    +
    + +

    Sports constructor + Null safety +

    + +
    + Sports() +
    + + + + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/addGame.html b/docs/models/Sports/addGame.html new file mode 100644 index 000000000..2a4f0c741 --- /dev/null +++ b/docs/models/Sports/addGame.html @@ -0,0 +1,163 @@ + + + + + + + + addGame method - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    addGame
    + +
    + +
    + + + + +
    +
    + +

    addGame method + Null safety +

    + +
    + + +Future<void> +addGame(
    1. SportsGame? game
    2. +
    ) + + + +
    + +
    +

    Adds a game to the database.

    +
    + + + +
    +

    Implementation

    +
    Future<void> addGame(SportsGame? game) async {
    +	if (game == null) {
    +		return;
    +	}
    +	games.add(game);
    +	return saveGames();
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/delete.html b/docs/models/Sports/delete.html new file mode 100644 index 000000000..e171bdce7 --- /dev/null +++ b/docs/models/Sports/delete.html @@ -0,0 +1,160 @@ + + + + + + + + delete method - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    delete
    + +
    + +
    + + + + +
    +
    + +

    delete method + Null safety +

    + +
    + + +Future<void> +delete(
    1. int index
    2. +
    ) + + + +
    + +
    +

    Deletes a game from the database.

    +
    + + + +
    +

    Implementation

    +
    Future<void> delete(int index) {
    +	games.removeAt(index);
    +	return saveGames();
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/games.html b/docs/models/Sports/games.html new file mode 100644 index 000000000..34059904a --- /dev/null +++ b/docs/models/Sports/games.html @@ -0,0 +1,154 @@ + + + + + + + + games property - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    games
    + +
    + +
    + + + + +
    +
    + +

    games property + Null safety +

    + +
    + List<SportsGame> + games +
    read / write
    + +
    + +
    +

    A list of all the games taking place.

    +
    + + +
    +

    Implementation

    +
    List<SportsGame> games = [];
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/getTodayGames.html b/docs/models/Sports/getTodayGames.html new file mode 100644 index 000000000..b9e2e8f71 --- /dev/null +++ b/docs/models/Sports/getTodayGames.html @@ -0,0 +1,161 @@ + + + + + + + + getTodayGames method - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    getTodayGames
    + +
    + +
    + + + + +
    +
    + +

    getTodayGames method + Null safety +

    + +
    + + +List<int> +getTodayGames() + + + +
    + +
    +

    Returns a list of all the games taking place today.

    +

    The result should be saved to todayGames.

    +
    + + + +
    +

    Implementation

    +
    List<int> getTodayGames() => [
    +	for (final MapEntry<int, SportsGame> entry in games.asMap().entries)
    +		if (entry.value.date.isSameDay(DateTime.now()))
    +			entry.key,
    +];
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/init.html b/docs/models/Sports/init.html new file mode 100644 index 000000000..620337a75 --- /dev/null +++ b/docs/models/Sports/init.html @@ -0,0 +1,167 @@ + + + + + + + + init method - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    init
    + +
    + +
    + + + + +
    +
    + +

    init method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +Future<void> +init() + + + +
    + +
    +

    Loads data from the device and

    +
    + + + +
    +

    Implementation

    +
    @override
    +Future<void> init() async {
    +	timer = Timer.periodic(_minute, (_) => todayGames = getTodayGames());
    +	games = SportsGame.fromList(await Services.instance.database.sports);
    +	todayGames = getTodayGames();
    +	now = DateTime.now();
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/now.html b/docs/models/Sports/now.html new file mode 100644 index 000000000..1d29a29a1 --- /dev/null +++ b/docs/models/Sports/now.html @@ -0,0 +1,154 @@ + + + + + + + + now property - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    now
    + +
    + +
    + + + + +
    +
    + +

    now property + Null safety +

    + +
    + DateTime + now +
    read / write
    + +
    + +
    +

    Helps partition games by past and future.

    +
    + + +
    +

    Implementation

    +
    DateTime now = DateTime.now();
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/replace.html b/docs/models/Sports/replace.html new file mode 100644 index 000000000..3e0314adf --- /dev/null +++ b/docs/models/Sports/replace.html @@ -0,0 +1,166 @@ + + + + + + + + replace method - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    replace
    + +
    + +
    + + + + +
    +
    + +

    replace method + Null safety +

    + +
    + + +Future<void> +replace(
    1. int index,
    2. +
    3. SportsGame? newGame
    4. +
    ) + + + +
    + +
    +

    Replaces a game with another and saves it to the database.

    +

    Since SportsGame objects are immutable, they cannot be changed in place. +Instead, they are replaced with a new one.

    +
    + + + +
    +

    Implementation

    +
    Future<void> replace(int index, SportsGame? newGame) async {
    +	if (newGame == null) {
    +		return;
    +	}
    +	games [index] = newGame;
    +	return saveGames();
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/saveGames.html b/docs/models/Sports/saveGames.html new file mode 100644 index 000000000..1ba3b9580 --- /dev/null +++ b/docs/models/Sports/saveGames.html @@ -0,0 +1,158 @@ + + + + + + + + saveGames method - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    saveGames
    + +
    + +
    + + + + +
    +
    + +

    saveGames method + Null safety +

    + +
    + + +Future<void> +saveGames() + + + +
    + +
    +

    Saves the games to the database.

    +

    Used in any database CRUD methods.

    +
    + + + +
    +

    Implementation

    +
    Future<void> saveGames() =>
    +	Services.instance.database.setSports(SportsGame.getJsonList(games));
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/timer.html b/docs/models/Sports/timer.html new file mode 100644 index 000000000..8630c7f1d --- /dev/null +++ b/docs/models/Sports/timer.html @@ -0,0 +1,154 @@ + + + + + + + + timer property - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    timer
    + +
    + +
    + + + + +
    +
    + +

    timer property + Null safety +

    + +
    + Timer + timer +
    read / write
    + +
    + +
    +

    A timer to refresh todayGames.

    +
    + + +
    +

    Implementation

    +
    late Timer timer;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/Sports/todayGames.html b/docs/models/Sports/todayGames.html new file mode 100644 index 000000000..73b17f1ea --- /dev/null +++ b/docs/models/Sports/todayGames.html @@ -0,0 +1,154 @@ + + + + + + + + todayGames property - Sports class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    todayGames
    + +
    + +
    + + + + +
    +
    + +

    todayGames property + Null safety +

    + +
    + List<int> + todayGames +
    read / write
    + +
    + +
    +

    A list of games being played today to be showed on the home screen.

    +
    + + +
    +

    Implementation

    +
    List<int> todayGames = [];
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel-class.html b/docs/models/SportsBuilderModel-class.html new file mode 100644 index 000000000..6c85aaf69 --- /dev/null +++ b/docs/models/SportsBuilderModel-class.html @@ -0,0 +1,468 @@ + + + + + + + + SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    SportsBuilderModel
    + +
    + +
    + + + + +
    +
    + +

    SportsBuilderModel class + Null safety + +

    + + +
    +

    A ViewModel for the Sports game builder.

    +
    + + +
    +
    + + +
    Mixed in types
    +
    + + + +
    +
    + +
    +

    Constructors

    + +
    +
    + SportsBuilderModel([SportsGame? parent]) +
    +
    + Creates a ViewModel for the sports game builder page. [...] +
    +
    +
    + +
    +

    Properties

    + +
    +
    + away + ↔ bool + +
    +
    + Whether this game is being played away. [...] +
    read / write
    + +
    + +
    + date + ↔ DateTime? + +
    +
    + The date this game takes place. [...] +
    read / write
    + +
    + +
    + end + TimeOfDay? + +
    +
    + The time this game ends. [...] +
    read / write
    + +
    + +
    + game + SportsGame + +
    +
    + The game being created. +
    read-only
    + +
    + +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    read-only, inherited
    + +
    + +
    + hasListeners + → bool + +
    +
    + Whether any listeners are currently registered. [...] +
    @protected, read-only, inherited
    + +
    + +
    + loading + ↔ bool + +
    +
    + Whether the page is loading. +
    read / write
    + +
    + +
    + opponent + ↔ String? + +
    +
    + The name of the opponent school. [...] +
    read / write
    + +
    + +
    + ready + → bool + +
    +
    + Whether this game is ready to submit. +
    read-only
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    + scores + Scores? + +
    +
    + The scores for this game. [...] +
    read / write
    + +
    + +
    + sport + Sport? + +
    +
    + The sport being played. [...] +
    read / write
    + +
    + +
    + start + TimeOfDay? + +
    +
    + The time this game starts. [...] +
    read / write
    + +
    + +
    + team + ↔ String? + +
    +
    + The (home) team playing this game. [...] +
    read / write
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + addListener(VoidCallback listener) + → void + + + +
    +
    + Register a closure to be called when the object changes. [...] +
    inherited
    + +
    + +
    + dispose() + → void + + + +
    +
    + Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
    @mustCallSuper, inherited
    + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + notifyListeners() + → void + + + +
    +
    + Call all the registered listeners. [...] + + +
    + +
    + removeListener(VoidCallback listener) + → void + + + +
    +
    + Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
    inherited
    + +
    + +
    + toString() + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    inherited
    + +
    + +
    +
    + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/SportsBuilderModel.html b/docs/models/SportsBuilderModel/SportsBuilderModel.html new file mode 100644 index 000000000..e5aa9427a --- /dev/null +++ b/docs/models/SportsBuilderModel/SportsBuilderModel.html @@ -0,0 +1,163 @@ + + + + + + + + SportsBuilderModel constructor - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    SportsBuilderModel
    + +
    + +
    + + + + +
    +
    + +

    SportsBuilderModel constructor + Null safety +

    + +
    + SportsBuilderModel(
    1. [SportsGame? parent]
    2. +
    ) +
    + + +
    +

    Creates a ViewModel for the sports game builder page.

    +

    Passing in a SportsGame for parent will fill this page with all the +relevant properties of parent before building.

    +
    + + + +
    +

    Implementation

    +
    SportsBuilderModel([SportsGame? parent]) :
    +	_scores = parent?.scores,
    +	_sport = parent?.sport,
    +	_date = parent?.date,
    +	_start = parent?.times.start.asTimeOfDay,
    +	_end = parent?.times.end.asTimeOfDay,
    +	_opponent = parent?.opponent,
    +	_team = parent?.team,
    +	_away = !(parent?.isHome ?? true);
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/away.html b/docs/models/SportsBuilderModel/away.html new file mode 100644 index 000000000..527510909 --- /dev/null +++ b/docs/models/SportsBuilderModel/away.html @@ -0,0 +1,184 @@ + + + + + + + + away property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    away
    + +
    + +
    + + + + +
    +
    + +

    away property + Null safety +

    + + + +
    + +
    + bool + away + + +
    + + +
    +

    Whether this game is being played away.

    +

    Changing this will update the page.

    +
    + + +
    +

    Implementation

    +
    bool get away => _away;
    +
    + +
    + + + +
    + +
    + void + away=(bool value) + + +
    + + + + +
    +

    Implementation

    +
    set away(bool value) {
    +	_away = value;
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/date.html b/docs/models/SportsBuilderModel/date.html new file mode 100644 index 000000000..f02cd45e9 --- /dev/null +++ b/docs/models/SportsBuilderModel/date.html @@ -0,0 +1,184 @@ + + + + + + + + date property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    date
    + +
    + +
    + + + + +
    +
    + +

    date property + Null safety +

    + + + +
    + +
    + DateTime? + date + + +
    + + +
    +

    The date this game takes place.

    +

    Changing this will update the page.

    +
    + + +
    +

    Implementation

    +
    DateTime? get date => _date;
    +
    + +
    + + + +
    + +
    + void + date=(DateTime? value) + + +
    + + + + +
    +

    Implementation

    +
    set date(DateTime? value) {
    +	_date = value;
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/end.html b/docs/models/SportsBuilderModel/end.html new file mode 100644 index 000000000..1af4ed48f --- /dev/null +++ b/docs/models/SportsBuilderModel/end.html @@ -0,0 +1,184 @@ + + + + + + + + end property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    end
    + +
    + +
    + + + + +
    +
    + +

    end property + Null safety +

    + + + +
    + +
    + TimeOfDay? + end + + +
    + + +
    +

    The time this game ends.

    +

    Changing this will update the page.

    +
    + + +
    +

    Implementation

    +
    TimeOfDay? get end => _end;
    +
    + +
    + + + +
    + +
    + void + end=(TimeOfDay? value) + + +
    + + + + +
    +

    Implementation

    +
    set end(TimeOfDay? value) {
    +	_end = value;
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/game.html b/docs/models/SportsBuilderModel/game.html new file mode 100644 index 000000000..d48eb4a65 --- /dev/null +++ b/docs/models/SportsBuilderModel/game.html @@ -0,0 +1,168 @@ + + + + + + + + game property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    game
    + +
    + +
    + + + + +
    +
    + +

    game property + Null safety +

    + + + +
    + +
    + SportsGame + game + + +
    + + +
    +

    The game being created.

    +
    + + +
    +

    Implementation

    +
    SportsGame get game => SportsGame(
    +	date: date!,
    +	isHome: !away,
    +	times: Range(start!.asTime, end!.asTime),
    +	team: team ?? "",
    +	opponent: opponent ?? "",
    +	sport: sport!,
    +	scores: scores,
    +);
    +
    + +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/loading.html b/docs/models/SportsBuilderModel/loading.html new file mode 100644 index 000000000..d9aafef05 --- /dev/null +++ b/docs/models/SportsBuilderModel/loading.html @@ -0,0 +1,183 @@ + + + + + + + + loading property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    loading
    + +
    + +
    + + + + +
    +
    + +

    loading property + Null safety +

    + + + +
    + +
    + bool + loading + + +
    + + +
    +

    Whether the page is loading.

    +
    + + +
    +

    Implementation

    +
    bool get loading => _loading;
    +
    + +
    + + + +
    + +
    + void + loading=(bool value) + + +
    + + + + +
    +

    Implementation

    +
    set loading(bool value) {
    +	_loading = value;
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/opponent.html b/docs/models/SportsBuilderModel/opponent.html new file mode 100644 index 000000000..0816bdf7a --- /dev/null +++ b/docs/models/SportsBuilderModel/opponent.html @@ -0,0 +1,184 @@ + + + + + + + + opponent property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    opponent
    + +
    + +
    + + + + +
    +
    + +

    opponent property + Null safety +

    + + + +
    + +
    + String? + opponent + + +
    + + +
    +

    The name of the opponent school.

    +

    Changing this will update the page.

    +
    + + +
    +

    Implementation

    +
    String? get opponent => _opponent;
    +
    + +
    + + + +
    + +
    + void + opponent=(String? value) + + +
    + + + + +
    +

    Implementation

    +
    set opponent(String? value) {
    +	_opponent = value;
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/ready.html b/docs/models/SportsBuilderModel/ready.html new file mode 100644 index 000000000..665f24f57 --- /dev/null +++ b/docs/models/SportsBuilderModel/ready.html @@ -0,0 +1,165 @@ + + + + + + + + ready property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    ready
    + +
    + +
    + + + + +
    +
    + +

    ready property + Null safety +

    + + + +
    + +
    + bool + ready + + +
    + + +
    +

    Whether this game is ready to submit.

    +
    + + +
    +

    Implementation

    +
    bool get ready => sport != null &&
    +	team != null &&
    +	date != null &&
    +	start != null &&
    +	end != null &&
    +	(opponent?.isNotEmpty ?? false);
    +
    + +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/scores.html b/docs/models/SportsBuilderModel/scores.html new file mode 100644 index 000000000..731d26e18 --- /dev/null +++ b/docs/models/SportsBuilderModel/scores.html @@ -0,0 +1,185 @@ + + + + + + + + scores property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    scores
    + +
    + +
    + + + + +
    +
    + +

    scores property + Null safety +

    + + + +
    + +
    + Scores? + scores + + +
    + + +
    +

    The scores for this game.

    +

    This only applies if the game has already been finished.

    +

    Changing this will update the page.

    +
    + + +
    +

    Implementation

    +
    Scores? get scores => _scores;
    +
    + +
    + + + +
    + +
    + void + scores=(Scores? value) + + +
    + + + + +
    +

    Implementation

    +
    set scores(Scores? value) {
    +	_scores = value;
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/sport.html b/docs/models/SportsBuilderModel/sport.html new file mode 100644 index 000000000..cc067b318 --- /dev/null +++ b/docs/models/SportsBuilderModel/sport.html @@ -0,0 +1,184 @@ + + + + + + + + sport property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    sport
    + +
    + +
    + + + + +
    +
    + +

    sport property + Null safety +

    + + + +
    + +
    + Sport? + sport + + +
    + + +
    +

    The sport being played.

    +

    Changing this will update the page.

    +
    + + +
    +

    Implementation

    +
    Sport? get sport => _sport;
    +
    + +
    + + + +
    + +
    + void + sport=(Sport? value) + + +
    + + + + +
    +

    Implementation

    +
    set sport(Sport? value) {
    +	_sport = value;
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/start.html b/docs/models/SportsBuilderModel/start.html new file mode 100644 index 000000000..1fd352d50 --- /dev/null +++ b/docs/models/SportsBuilderModel/start.html @@ -0,0 +1,184 @@ + + + + + + + + start property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    start
    + +
    + +
    + + + + +
    +
    + +

    start property + Null safety +

    + + + +
    + +
    + TimeOfDay? + start + + +
    + + +
    +

    The time this game starts.

    +

    Changing this will update the page.

    +
    + + +
    +

    Implementation

    +
    TimeOfDay? get start => _start;
    +
    + +
    + + + +
    + +
    + void + start=(TimeOfDay? value) + + +
    + + + + +
    +

    Implementation

    +
    set start(TimeOfDay? value) {
    +	_start = value;
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsBuilderModel/team.html b/docs/models/SportsBuilderModel/team.html new file mode 100644 index 000000000..ee1bd5a4b --- /dev/null +++ b/docs/models/SportsBuilderModel/team.html @@ -0,0 +1,184 @@ + + + + + + + + team property - SportsBuilderModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    team
    + +
    + +
    + + + + +
    +
    + +

    team property + Null safety +

    + + + +
    + +
    + String? + team + + +
    + + +
    +

    The (home) team playing this game.

    +

    Changing this will update the page.

    +
    + + +
    +

    Implementation

    +
    String? get team => _team;
    +
    + +
    + + + +
    + +
    + void + team=(String? value) + + +
    + + + + +
    +

    Implementation

    +
    set team(String? value) {
    +	_team = value;
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel-class.html b/docs/models/SportsModel-class.html new file mode 100644 index 000000000..b7813eecd --- /dev/null +++ b/docs/models/SportsModel-class.html @@ -0,0 +1,519 @@ + + + + + + + + SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    SportsModel
    + +
    + +
    + + + + +
    +
    + +

    SportsModel class + Null safety + +

    + + +
    +

    A view model for the sports page.

    +

    This class provides sorting methods for the games (sortGames) as well as +helpful properties for the admin version of this page (isAdmin and +loading).

    +
    + + +
    +
    + + +
    Mixed in types
    +
    + + + +
    +
    + +
    +

    Constructors

    + +
    +
    + SportsModel(Sports data) +
    +
    + Creates a view model for the sports page. +
    +
    +
    + +
    +

    Properties

    + +
    +
    + data + Sports + +
    +
    + The data model behind this view model. +
    final
    + +
    + +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    read-only, inherited
    + +
    + +
    + hasListeners + → bool + +
    +
    + Whether any listeners are currently registered. [...] +
    @protected, read-only, inherited
    + +
    + +
    + isAdmin + ↔ bool + +
    +
    + Whether the user is an admin. [...] +
    read / write
    + +
    + +
    + loading + ↔ bool + +
    +
    + Whether the page is loading. +
    read / write
    + +
    + +
    + recentBySport + ↔ Map<Sport, List<int>> + +
    +
    + Recent games sorted by sport. [...] +
    read / write
    + +
    + +
    + recents + ↔ List<int> + +
    +
    + A list of recent games. +
    read / write
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    + sortOption + SortOption + +
    +
    + The currently selected sorting option. +
    read / write
    + +
    + +
    + upcoming + ↔ List<int> + +
    +
    + A list of upcoming games. +
    read / write
    + +
    + +
    + upcomingBySport + ↔ Map<Sport, List<int>> + +
    +
    + Upcoming games sorted by sport. [...] +
    read / write
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + addListener(VoidCallback listener) + → void + + + +
    +
    + Register a closure to be called when the object changes. [...] +
    inherited
    + +
    + +
    + adminFunc(AsyncCallback func) + AsyncCallback + + + +
    +
    + Returns an function that shows loading animations while running. [...] + + +
    + +
    + dispose() + → void + + + +
    +
    + Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
    override
    + +
    + +
    + divideGames() + → void + + + +
    +
    + Divides Sports.games into recents and upcoming. + + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + notifyListeners() + → void + + + +
    +
    + Call all the registered listeners. [...] + + +
    + +
    + removeListener(VoidCallback listener) + → void + + + +
    +
    + Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
    inherited
    + +
    + +
    + setup() + → void + + + +
    +
    + Gathers data from data and prepares the page for building. + + +
    + +
    + sortByDate(int a, int b) + → int + + + +
    +
    + Helper function to sort games chronologically. [...] + + +
    + +
    + sortBySport(List<int> gamesList) + → Map<Sport, List<int>> + + + +
    +
    + Sorts a list of games by sports. [...] + + +
    + +
    + sortGames() + → void + + + +
    +
    + Sorts the page according to sortOption. [...] + + +
    + +
    + toString() + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    inherited
    + +
    + +
    +
    + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/SportsModel.html b/docs/models/SportsModel/SportsModel.html new file mode 100644 index 000000000..ccf170ed3 --- /dev/null +++ b/docs/models/SportsModel/SportsModel.html @@ -0,0 +1,165 @@ + + + + + + + + SportsModel constructor - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    SportsModel
    + +
    + +
    + + + + +
    +
    + +

    SportsModel constructor + Null safety +

    + +
    + SportsModel(
    1. Sports data
    2. +
    ) +
    + + +
    +

    Creates a view model for the sports page.

    +
    + + + +
    +

    Implementation

    +
    SportsModel(this.data) {
    +	Auth.isSportsAdmin.then(
    +		(bool value) {
    +			isAdmin = value;
    +			notifyListeners();
    +		}
    +	);
    +	data.addListener(setup);
    +	setup();
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/adminFunc.html b/docs/models/SportsModel/adminFunc.html new file mode 100644 index 000000000..7e31cb0ea --- /dev/null +++ b/docs/models/SportsModel/adminFunc.html @@ -0,0 +1,167 @@ + + + + + + + + adminFunc method - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    adminFunc
    + +
    + +
    + + + + +
    +
    + +

    adminFunc method + Null safety +

    + +
    + + +AsyncCallback +adminFunc(
    1. AsyncCallback func
    2. +
    ) + + + +
    + +
    +

    Returns an function that shows loading animations while running.

    +

    The newly-returned function will set loading to true, run func, +and then set loading to false. It can be used in the widget tree.

    +
    + + + +
    +

    Implementation

    +
    AsyncCallback adminFunc(AsyncCallback func) => () async {
    +	loading = true;
    +	await func();
    +	loading = false;
    +};
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/data.html b/docs/models/SportsModel/data.html new file mode 100644 index 000000000..ee58c112e --- /dev/null +++ b/docs/models/SportsModel/data.html @@ -0,0 +1,158 @@ + + + + + + + + data property - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    data
    + +
    + +
    + + + + +
    +
    + +

    data property + Null safety +

    + +
    + Sports + data +
    final
    + +
    + +
    +

    The data model behind this view model.

    +
    + + +
    +

    Implementation

    +
    final Sports data;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/dispose.html b/docs/models/SportsModel/dispose.html new file mode 100644 index 000000000..37481b358 --- /dev/null +++ b/docs/models/SportsModel/dispose.html @@ -0,0 +1,173 @@ + + + + + + + + dispose method - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    dispose
    + +
    + +
    + + + + +
    +
    + +

    dispose method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +void +dispose() + +
    override
    + +
    + +
    +

    Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed).

    +

    This method should only be called by the object's owner.

    +
    + + + +
    +

    Implementation

    +
    @override
    +void dispose() {
    +	data.removeListener(setup);
    +	super.dispose();
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/divideGames.html b/docs/models/SportsModel/divideGames.html new file mode 100644 index 000000000..b72eda790 --- /dev/null +++ b/docs/models/SportsModel/divideGames.html @@ -0,0 +1,169 @@ + + + + + + + + divideGames method - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    divideGames
    + +
    + +
    + + + + +
    +
    + +

    divideGames method + Null safety +

    + +
    + + +void +divideGames() + + + +
    + +
    +

    Divides Sports.games into recents and upcoming.

    +
    + + + +
    +

    Implementation

    +
    void divideGames() {
    +	recents = [];
    +	upcoming = [];
    +	final DateTime now = DateTime.now();
    +	for (final MapEntry<int, SportsGame> entry in data.games.asMap().entries) {
    +		(entry.value.dateTime.isAfter(now) ? upcoming : recents).add(entry.key);
    +	}
    +	recents.sort(sortByDate);
    +	upcoming.sort(sortByDate);
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/isAdmin.html b/docs/models/SportsModel/isAdmin.html new file mode 100644 index 000000000..0292e9121 --- /dev/null +++ b/docs/models/SportsModel/isAdmin.html @@ -0,0 +1,159 @@ + + + + + + + + isAdmin property - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    isAdmin
    + +
    + +
    + + + + +
    +
    + +

    isAdmin property + Null safety +

    + +
    + bool + isAdmin +
    read / write
    + +
    + +
    +

    Whether the user is an admin.

    +

    This will allow widgets to give the user options to change some entries.

    +
    + + +
    +

    Implementation

    +
    bool isAdmin = false;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/loading.html b/docs/models/SportsModel/loading.html new file mode 100644 index 000000000..9d5323d5f --- /dev/null +++ b/docs/models/SportsModel/loading.html @@ -0,0 +1,186 @@ + + + + + + + + loading property - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    loading
    + +
    + +
    + + + + +
    +
    + +

    loading property + Null safety +

    + + + +
    + +
    + bool + loading + + +
    + + +
    +

    Whether the page is loading.

    +
    + + +
    +

    Implementation

    +
    bool get loading => _loading;
    +
    + +
    + + + +
    + +
    + void + loading=(bool value) + + +
    + + + + +
    +

    Implementation

    +
    set loading(bool value) {
    +	_loading = value;
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/recentBySport.html b/docs/models/SportsModel/recentBySport.html new file mode 100644 index 000000000..d8d0c2db7 --- /dev/null +++ b/docs/models/SportsModel/recentBySport.html @@ -0,0 +1,159 @@ + + + + + + + + recentBySport property - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    recentBySport
    + +
    + +
    + + + + +
    +
    + +

    recentBySport property + Null safety +

    + +
    + Map<Sport, List<int>> + recentBySport +
    read / write
    + +
    + +
    +

    Recent games sorted by sport.

    +

    Generated by calling sortBySport with recents.

    +
    + + +
    +

    Implementation

    +
    Map<Sport, List<int>> recentBySport = {};
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/recents.html b/docs/models/SportsModel/recents.html new file mode 100644 index 000000000..097bdd665 --- /dev/null +++ b/docs/models/SportsModel/recents.html @@ -0,0 +1,158 @@ + + + + + + + + recents property - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    recents
    + +
    + +
    + + + + +
    +
    + +

    recents property + Null safety +

    + +
    + List<int> + recents +
    read / write
    + +
    + +
    +

    A list of recent games.

    +
    + + +
    +

    Implementation

    +
    List<int> recents = [];
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/setup.html b/docs/models/SportsModel/setup.html new file mode 100644 index 000000000..801dcf193 --- /dev/null +++ b/docs/models/SportsModel/setup.html @@ -0,0 +1,164 @@ + + + + + + + + setup method - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    setup
    + +
    + +
    + + + + +
    +
    + +

    setup method + Null safety +

    + +
    + + +void +setup() + + + +
    + +
    +

    Gathers data from data and prepares the page for building.

    +
    + + + +
    +

    Implementation

    +
    void setup() {
    +	divideGames();
    +	sortGames();
    +	notifyListeners();
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/sortByDate.html b/docs/models/SportsModel/sortByDate.html new file mode 100644 index 000000000..24460e39e --- /dev/null +++ b/docs/models/SportsModel/sortByDate.html @@ -0,0 +1,164 @@ + + + + + + + + sortByDate method - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    sortByDate
    + +
    + +
    + + + + +
    +
    + +

    sortByDate method + Null safety +

    + +
    + + +int +sortByDate(
    1. int a,
    2. +
    3. int b
    4. +
    ) + + + +
    + +
    +

    Helper function to sort games chronologically.

    +

    See Comparator and Comparable.compareTo for how to sort in Dart.

    +
    + + + +
    +

    Implementation

    +
    int sortByDate(int a, int b) =>
    +	data.games [a].dateTime.compareTo(data.games [b].dateTime);
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/sortBySport.html b/docs/models/SportsModel/sortBySport.html new file mode 100644 index 000000000..4833b6a84 --- /dev/null +++ b/docs/models/SportsModel/sortBySport.html @@ -0,0 +1,177 @@ + + + + + + + + sortBySport method - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    sortBySport
    + +
    + +
    + + + + +
    +
    + +

    sortBySport method + Null safety +

    + +
    + + +Map<Sport, List<int>> +sortBySport(
    1. List<int> gamesList
    2. +
    ) + + + +
    + +
    +

    Sorts a list of games by sports.

    +

    The resulting map has all the sports as keys, and a list of games with +that sport as its values.

    +
    + + + +
    +

    Implementation

    +
    Map<Sport, List<int>> sortBySport(List<int> gamesList) {
    +	final Map<Sport, List<int>> result = {};
    +	for (final int index in gamesList) {
    +		final SportsGame game = data.games [index];
    +		if (!result.containsKey(game.sport)) {
    +			result [game.sport] = [index];
    +		} else {
    +			result [game.sport]!.add(index);
    +		}
    +	}
    +	for (final List<int> gamesList in result.values) {
    +		gamesList.sort(sortByDate);  // sort chronologically in place
    +	}
    +	return result;
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/sortGames.html b/docs/models/SportsModel/sortGames.html new file mode 100644 index 000000000..85d1ddc3f --- /dev/null +++ b/docs/models/SportsModel/sortGames.html @@ -0,0 +1,170 @@ + + + + + + + + sortGames method - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    sortGames
    + +
    + +
    + + + + +
    +
    + +

    sortGames method + Null safety +

    + +
    + + +void +sortGames() + + + +
    + +
    +

    Sorts the page according to sortOption.

    +

    By the time this function is called, recents and upcoming are already +sorted chronologically, so if sortOption equals +SortOption.chronological, nothing happens.

    +
    + + + +
    +

    Implementation

    +
    void sortGames() {
    +	switch (sortOption) {
    +		case SortOption.chronological: break;  // already sorted
    +		case SortOption.sport:
    +			recentBySport = sortBySport(recents);
    +			upcomingBySport = sortBySport(upcoming);
    +	}
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/sortOption.html b/docs/models/SportsModel/sortOption.html new file mode 100644 index 000000000..e396abc23 --- /dev/null +++ b/docs/models/SportsModel/sortOption.html @@ -0,0 +1,187 @@ + + + + + + + + sortOption property - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    sortOption
    + +
    + +
    + + + + +
    +
    + +

    sortOption property + Null safety +

    + + + +
    + +
    + SortOption + sortOption + + +
    + + +
    +

    The currently selected sorting option.

    +
    + + +
    +

    Implementation

    +
    SortOption get sortOption => _sortOption;
    +
    + +
    + + + +
    + +
    + void + sortOption=(SortOption value) + + +
    + + + + +
    +

    Implementation

    +
    set sortOption(SortOption value) {
    +	_sortOption = value;
    +	sortGames();
    +	notifyListeners();
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/upcoming.html b/docs/models/SportsModel/upcoming.html new file mode 100644 index 000000000..06554c54f --- /dev/null +++ b/docs/models/SportsModel/upcoming.html @@ -0,0 +1,158 @@ + + + + + + + + upcoming property - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    upcoming
    + +
    + +
    + + + + +
    +
    + +

    upcoming property + Null safety +

    + +
    + List<int> + upcoming +
    read / write
    + +
    + +
    +

    A list of upcoming games.

    +
    + + +
    +

    Implementation

    +
    List<int> upcoming = [];
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/SportsModel/upcomingBySport.html b/docs/models/SportsModel/upcomingBySport.html new file mode 100644 index 000000000..f3e3ff500 --- /dev/null +++ b/docs/models/SportsModel/upcomingBySport.html @@ -0,0 +1,159 @@ + + + + + + + + upcomingBySport property - SportsModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    upcomingBySport
    + +
    + +
    + + + + +
    +
    + +

    upcomingBySport property + Null safety +

    + +
    + Map<Sport, List<int>> + upcomingBySport +
    read / write
    + +
    + +
    +

    Upcoming games sorted by sport.

    +

    Generated by calling sortBySport with upcoming.

    +
    + + +
    +

    Implementation

    +
    Map<Sport, List<int>> upcomingBySport = {};
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/UserModel-class.html b/docs/models/UserModel-class.html new file mode 100644 index 000000000..75d53bb48 --- /dev/null +++ b/docs/models/UserModel-class.html @@ -0,0 +1,389 @@ + + + + + + + + UserModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    UserModel
    + +
    + +
    + + + + +
    +
    + +

    UserModel class + Null safety + +

    + + +
    +

    A data model to hold and initialize the User object.

    +

    This data model doesn't really update, however it's a convenient place to +keep the user object. Any functionality relating to the admin is also +implemented here, so that the code for updating both the database and the +UI is in one place.

    +
    + + + +
    +

    Constructors

    + +
    +
    + UserModel() +
    +
    + +
    +
    +
    + +
    +

    Properties

    + +
    +
    + adminScopes + ↔ List<AdminScope>? + +
    +
    + The permissions this user has, if they are an administrator. +
    read / write
    + +
    + +
    + data + User + +
    +
    + The user object. +
    read / write
    + +
    + +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    read-only, inherited
    + +
    + +
    + hasListeners + → bool + +
    +
    + Whether any listeners are currently registered. [...] +
    @protected, read-only, inherited
    + +
    + +
    + isAdmin + → bool + +
    +
    + Whether this user is an admin. [...] +
    read-only
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    + subjects + ↔ Map<String, Subject> + +
    +
    + The subjects this user has. [...] +
    read / write
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + addListener(VoidCallback listener) + → void + + + +
    +
    + Register a closure to be called when the object changes. [...] +
    inherited
    + +
    + +
    + dispose() + → void + + + +
    +
    + Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener and removeListener will throw after the object is +disposed). [...] +
    @mustCallSuper, inherited
    + +
    + +
    + init() + → Future<void> + + + +
    +
    + Gets whatever data is needed by this model from a service. [...] + + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + notifyListeners() + → void + + + +
    +
    + Call all the registered listeners. [...] + + +
    + +
    + removeListener(VoidCallback listener) + → void + + + +
    +
    + Remove a previously registered closure from the list of closures that are +notified when the object changes. [...] +
    inherited
    + +
    + +
    + toString() + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    inherited
    + +
    + +
    +
    + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/UserModel/UserModel.html b/docs/models/UserModel/UserModel.html new file mode 100644 index 000000000..18c893fa6 --- /dev/null +++ b/docs/models/UserModel/UserModel.html @@ -0,0 +1,139 @@ + + + + + + + + UserModel constructor - UserModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    UserModel
    + +
    + +
    + + + + +
    +
    + +

    UserModel constructor + Null safety +

    + +
    + UserModel() +
    + + + + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/UserModel/adminScopes.html b/docs/models/UserModel/adminScopes.html new file mode 100644 index 000000000..f49f09a67 --- /dev/null +++ b/docs/models/UserModel/adminScopes.html @@ -0,0 +1,149 @@ + + + + + + + + adminScopes property - UserModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    adminScopes
    + +
    + +
    + + + + +
    +
    + +

    adminScopes property + Null safety +

    + +
    + List<AdminScope>? + adminScopes +
    read / write
    + +
    + +
    +

    The permissions this user has, if they are an administrator.

    +
    + + +
    +

    Implementation

    +
    List<AdminScope>? adminScopes;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/UserModel/data.html b/docs/models/UserModel/data.html new file mode 100644 index 000000000..8fbca5626 --- /dev/null +++ b/docs/models/UserModel/data.html @@ -0,0 +1,149 @@ + + + + + + + + data property - UserModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    data
    + +
    + +
    + + + + +
    +
    + +

    data property + Null safety +

    + +
    + User + data +
    read / write
    + +
    + +
    +

    The user object.

    +
    + + +
    +

    Implementation

    +
    late User data;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/UserModel/init.html b/docs/models/UserModel/init.html new file mode 100644 index 000000000..6bee674b4 --- /dev/null +++ b/docs/models/UserModel/init.html @@ -0,0 +1,168 @@ + + + + + + + + init method - UserModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    init
    + +
    + +
    + + + + +
    +
    + +

    init method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +Future<void> +init() + + + +
    + +
    +

    Gets whatever data is needed by this model from a service.

    +

    This model may not function properly if this function is not called.

    +
    + + + +
    +

    Implementation

    +
    @override
    +Future<void> init() async {
    +	data = User.fromJson(await Services.instance.database.user);
    +	subjects = Subject.getSubjects(
    +		await Services.instance.database.getSections(data.sectionIDs)
    +	);
    +	final List<String>? scopeStrings = await Auth.adminScopes;
    +	adminScopes = scopeStrings == null ? null : [
    +		for (final String scope in scopeStrings)
    +			parseAdminScope(scope)
    +	];
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/UserModel/isAdmin.html b/docs/models/UserModel/isAdmin.html new file mode 100644 index 000000000..d6a6f61ee --- /dev/null +++ b/docs/models/UserModel/isAdmin.html @@ -0,0 +1,156 @@ + + + + + + + + isAdmin property - UserModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    isAdmin
    + +
    + +
    + + + + +
    +
    + +

    isAdmin property + Null safety +

    + + + +
    + +
    + bool + isAdmin + + +
    + + +
    +

    Whether this user is an admin.

    +

    Unlike Auth.isAdmin, which authenticates with the server, this getter +simply checks to see if adminScopes was initialized.

    +
    + + +
    +

    Implementation

    +
    bool get isAdmin => adminScopes != null;
    +
    + +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/UserModel/subjects.html b/docs/models/UserModel/subjects.html new file mode 100644 index 000000000..02116a050 --- /dev/null +++ b/docs/models/UserModel/subjects.html @@ -0,0 +1,151 @@ + + + + + + + + subjects property - UserModel class - models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    subjects
    + +
    + +
    + + + + +
    +
    + +

    subjects property + Null safety +

    + +
    + Map<String, Subject> + subjects +
    read / write
    + +
    + +
    +

    The subjects this user has.

    +

    For students this will be the courses they attend. For teachers, this +will be the courses they teach.

    +
    + + +
    +

    Implementation

    +
    late Map<String, Subject> subjects;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/models/models-library.html b/docs/models/models-library.html new file mode 100644 index 000000000..8923b90a1 --- /dev/null +++ b/docs/models/models-library.html @@ -0,0 +1,321 @@ + + + + + + + + models library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    models
    + +
    + +
    + + + + +
    +
    + +

    models library + Null safety + +

    + + +
    +

    An abstraction over data handling.

    +

    This library can be split into two separate components:

    +
      +
    1. +

      Data models.

      +

      Data models maintain the global state of the app. These models are +responsible for pulling data from data sources (using services), and +using that raw data to initialize data classes.

      +

      By canonicalizing a single source of truth for all data, code duplication +and race conditions are avoided.

      +
    2. +
    3. +

      View models.

      +

      View models maintain the state of a single part of the UI, for example, +a page, or dialog. These models dictate what properties and methods a +UI element needs, and provides them, as well as how and when to update +the UI. Pages, for example, can now be stateless, and simply rely on +the logic inherent in the view model to control their state.

      +

      The point of a view model is to map fields to static UI elements and +methods to interactive ones. Every button and label that depends on +state should depend on their corresponding view model.

      +
    4. +
    +
    + + +
    +

    Classes

    + +
    +
    + AdminScheduleModel + +
    +
    + +
    + +
    + CalendarDay + +
    +
    + +
    + +
    + CalendarEditor + +
    +
    + A model to manage the calendar. [...] +
    + +
    + DayBuilderModel + +
    +
    + A view model for the creating a new Day. +
    + +
    + FeedbackModel + +
    +
    + A view model for the feedback page. +
    + +
    + HomeModel + +
    +
    + A view model for the home page. [...] +
    + +
    + Models + +
    +
    + Bundles all the data models together. [...] +
    + +
    + Reminders + +
    +
    + A DataModel that keeps the state of the user's reminders. [...] +
    + +
    + RemindersBuilderModel + +
    +
    + A view model for the dialog that allows the user to build a reminder. +
    + +
    + ScheduleBuilderModel + +
    +
    + A view model to create a Schedule. +
    + +
    + ScheduleModel + +
    +
    + A data model for the user's schedule. +
    + +
    + ScheduleViewModel + +
    +
    + A view model for the schedule page. +
    + +
    + Sports + +
    +
    + A data model for sports games. [...] +
    + +
    + SportsBuilderModel + +
    +
    + A ViewModel for the Sports game builder. +
    + +
    + SportsModel + +
    +
    + A view model for the sports page. [...] +
    + +
    + UserModel + +
    +
    + A data model to hold and initialize the User object. [...] +
    + +
    +
    + + + + + + +
    +

    Enums

    + +
    +
    + SortOption + +
    +
    + Different ways to sort the sports calendar. +
    + +
    +
    + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarPage-class.html b/docs/pages/AdminCalendarPage-class.html new file mode 100644 index 000000000..a3d9374bf --- /dev/null +++ b/docs/pages/AdminCalendarPage-class.html @@ -0,0 +1,406 @@ + + + + + + + + AdminCalendarPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    AdminCalendarPage
    + +
    + +
    + + + + +
    +
    + +

    AdminCalendarPage class + Null safety + +

    + + +
    +

    A page for admins to modify the calendar in the database.

    +
    + + +
    +
    +
    Inheritance
    +
    + + + + + +
    +
    + +
    +

    Constructors

    + +
    +
    + AdminCalendarPage() +
    +
    + +
    const
    +
    +
    +
    + +
    +

    Properties

    + +
    +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    @nonVirtual, read-only, inherited
    + +
    + +
    + key + Key? + +
    +
    + Controls how one widget replaces another widget in the tree. [...] +
    final, inherited
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + createElement() + StatefulElement + + + +
    +
    + Creates a StatefulElement to manage this widget's location in the tree. [...] +
    inherited
    + +
    + +
    + createState() + AdminCalendarState + + + +
    +
    + Creates the mutable state for this widget at a given location in the tree. [...] +
    override
    + +
    + +
    + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
    +
    + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
    @protected, inherited
    + +
    + +
    + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
    +
    + Add additional properties associated with the node. [...] +
    inherited
    + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
    +
    + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
    inherited
    + +
    + +
    + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a string representation of this node and its descendants. [...] +
    inherited
    + +
    + +
    + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a one-line detailed description of the object. [...] +
    inherited
    + +
    + +
    + toStringShort() + → String + + + +
    +
    + A short, textual description of this widget. +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    @nonVirtual, inherited
    + +
    + +
    +
    + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarPage/AdminCalendarPage.html b/docs/pages/AdminCalendarPage/AdminCalendarPage.html new file mode 100644 index 000000000..6423709d7 --- /dev/null +++ b/docs/pages/AdminCalendarPage/AdminCalendarPage.html @@ -0,0 +1,142 @@ + + + + + + + + AdminCalendarPage constructor - AdminCalendarPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    AdminCalendarPage
    + +
    + +
    + + + + +
    +
    + +

    AdminCalendarPage constructor + Null safety +

    + +
    const + AdminCalendarPage() +
    + + + + + +
    +

    Implementation

    +
    const AdminCalendarPage();
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarPage/createState.html b/docs/pages/AdminCalendarPage/createState.html new file mode 100644 index 000000000..0f10133d4 --- /dev/null +++ b/docs/pages/AdminCalendarPage/createState.html @@ -0,0 +1,168 @@ + + + + + + + + createState method - AdminCalendarPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    createState
    + +
    + +
    + + + + +
    +
    + +

    createState method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +AdminCalendarState +createState() + +
    override
    + +
    + +
    +

    Creates the mutable state for this widget at a given location in the tree.

    +

    Subclasses should override this method to return a newly created +instance of their associated State subclass:

    +
    @override
    +_MyState createState() => _MyState();
    +
    +

    The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

    +
    + + + +
    +

    Implementation

    +
    @override
    +AdminCalendarState createState() => AdminCalendarState();
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState-class.html b/docs/pages/AdminCalendarState-class.html new file mode 100644 index 000000000..d7dc42fd3 --- /dev/null +++ b/docs/pages/AdminCalendarState-class.html @@ -0,0 +1,558 @@ + + + + + + + + AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    AdminCalendarState
    + +
    + +
    + + + + +
    +
    + +

    AdminCalendarState class + Null safety + +

    + + + + +
    +
    +
    Inheritance
    +
    + + + + + +
    +
    + +
    +

    Constructors

    + +
    +
    + AdminCalendarState() +
    +
    + +
    +
    +
    + +
    +

    Properties

    + +
    +
    + context + BuildContext + +
    +
    + The location in the tree where this widget builds. [...] +
    read-only, inherited
    + +
    + +
    + currentMonth + ↔ int + +
    +
    + +
    read / write
    + +
    + +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    read-only, inherited
    + +
    + +
    + model + CalendarEditor + +
    +
    + +
    final
    + +
    + +
    + mounted + → bool + +
    +
    + Whether this State object is currently in a tree. [...] +
    read-only, inherited
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    + widget + AdminCalendarPage + +
    +
    + The current configuration. [...] +
    read-only, inherited
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + build(BuildContext context) + Widget + + + +
    +
    + Describes the part of the user interface represented by this widget. [...] +
    override
    + +
    + +
    + deactivate() + → void + + + +
    +
    + Called when this object is removed from the tree. [...] +
    @mustCallSuper, @protected, inherited
    + +
    + +
    + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
    +
    + Add additional properties associated with the node. [...] +
    inherited
    + +
    + +
    + didChangeDependencies() + → void + + + +
    +
    + Called when a dependency of this State object changes. [...] +
    @mustCallSuper, @protected, inherited
    + +
    + +
    + didUpdateWidget(covariant AdminCalendarPage oldWidget) + → void + + + +
    +
    + Called whenever the widget configuration changes. [...] +
    @mustCallSuper, @protected, inherited
    + +
    + +
    + dispose() + → void + + + +
    +
    + Called when this object is removed from the tree permanently. [...] +
    override
    + +
    + +
    + initState() + → void + + + +
    +
    + Called when this object is inserted into the tree. [...] +
    override
    + +
    + +
    + listener() + → void + + + +
    +
    + + + +
    + +
    + loopMonth(int val) + → int + + + +
    +
    + + + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + reassemble() + → void + + + +
    +
    + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
    @mustCallSuper, @protected, inherited
    + +
    + +
    + setState(VoidCallback fn) + → void + + + +
    +
    + Notify the framework that the internal state of this object has changed. [...] +
    @protected, inherited
    + +
    + +
    + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
    +
    + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
    inherited
    + +
    + +
    + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    + toStringShort() + → String + + + +
    +
    + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    inherited
    + +
    + +
    +
    + + + +
    +

    Constants

    + +
    +
    + months + → const List<String> + + +
    +
    + The months of the year. [...] + + +
    + ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", &… +
    +
    + +
    + weekdays + → const List<String> + + +
    +
    + The days of the week. [...] + + +
    + ["Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat"] +
    +
    + +
    +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState/AdminCalendarState.html b/docs/pages/AdminCalendarState/AdminCalendarState.html new file mode 100644 index 000000000..6a2dc1754 --- /dev/null +++ b/docs/pages/AdminCalendarState/AdminCalendarState.html @@ -0,0 +1,150 @@ + + + + + + + + AdminCalendarState constructor - AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    AdminCalendarState
    + +
    + +
    + + + + +
    +
    + +

    AdminCalendarState constructor + Null safety +

    + +
    + AdminCalendarState() +
    + + + + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState/build.html b/docs/pages/AdminCalendarState/build.html new file mode 100644 index 000000000..d46238ff5 --- /dev/null +++ b/docs/pages/AdminCalendarState/build.html @@ -0,0 +1,326 @@ + + + + + + + + build method - AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    build
    + +
    + +
    + + + + +
    +
    + +

    build method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +Widget +build(
    1. BuildContext context
    2. +
    ) + +
    override
    + +
    + +
    +

    Describes the part of the user interface represented by this widget.

    +

    The framework calls this method in a number of different situations. For +example:

    + +

    This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

    +

    The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

    +

    Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

    +

    The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

    +

    Design discussion

    +

    Why is the build method on State, and not StatefulWidget?

    +

    Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

    +

    For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

    +

    Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

    +

    Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

    +
    class MyButton extends StatefulWidget {
    +  ...
    +  final Color color;
    +
    +  @override
    +  Widget build(BuildContext context, MyButtonState state) {
    +    ... () { print("color: $color"); } ...
    +  }
    +}
    +
    +

    For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

    +

    In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

    +
    class MyButtonState extends State<MyButton> {
    +  ...
    +  @override
    +  Widget build(BuildContext context) {
    +    ... () { print("color: ${widget.color}"); } ...
    +  }
    +}
    +
    +

    Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

    +

    See also:

    +
      +
    • StatefulWidget, which contains the discussion on performance considerations.
    • +
    +
    + + + +
    +

    Implementation

    +
    @override
    +Widget build(BuildContext context) => ResponsiveScaffold(
    +	drawer: const NavigationDrawer(),
    +	appBar: AppBar(title: const Text("Calendar")),
    +	bodyBuilder: (_) => Center(
    +		child: Column(
    +			mainAxisSize: MainAxisSize.min,
    +			mainAxisAlignment: MainAxisAlignment.center,
    +			children: [
    +				const SizedBox(height: 24),
    +				Row(
    +					children: [
    +						const Spacer(flex: 3),
    +						TextButton.icon(
    +							icon: const Icon(Icons.arrow_back),
    +							onPressed: () => currentMonth--,
    +							label: Text(months [loopMonth(currentMonth - 1)]),
    +						),
    +						const Spacer(flex: 2),
    +						Text(
    +							"${months [currentMonth]} ${model.years [currentMonth]}",
    +							style: Theme.of(context).textTheme.headline4,
    +						),
    +						const Spacer(flex: 2),
    +						TextButton.icon(
    +							// icon always goes to the left of the label
    +							// since they're both widgets, we can swap them
    +							label: const Icon(Icons.arrow_forward),
    +							icon: Text(months [loopMonth(currentMonth + 1)]),
    +							onPressed: () => currentMonth++,
    +						),
    +						const Spacer(flex: 3),
    +					]
    +				),
    +				const SizedBox(height: 16),
    +				Row(
    +					mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    +					children: [
    +						for (final String weekday in weekdays)
    +							Text(weekday),
    +					]
    +				),
    +				Flexible(
    +					child: model.calendar [currentMonth] == null
    +						? const Center(child: CircularProgressIndicator())
    +						: GridView.count(
    +							padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
    +							shrinkWrap: true,
    +							childAspectRatio: 1.25,
    +							crossAxisCount: 7,
    +							children: [
    +								for (final CalendarDay? day in model.calendar [currentMonth]!)
    +									if (day == null) CalendarTile.blank
    +									else GestureDetector(
    +										onTap: () => showDialog(
    +											context: context,
    +											builder: (_) => DayBuilder(
    +												day: day.schoolDay,
    +												date: day.date,
    +												upload: (Day? value) => model.updateDay(
    +													day: value,
    +													date: day.date
    +												),
    +											)
    +										),
    +										child: CalendarTile(day: day.schoolDay, date: day.date),
    +									)
    +							]
    +						),
    +				)
    +			]
    +		)
    +	)
    +);
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState/currentMonth.html b/docs/pages/AdminCalendarState/currentMonth.html new file mode 100644 index 000000000..9193ca7f9 --- /dev/null +++ b/docs/pages/AdminCalendarState/currentMonth.html @@ -0,0 +1,186 @@ + + + + + + + + currentMonth property - AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    currentMonth
    + +
    + +
    + + + + +
    +
    + +

    currentMonth property + Null safety +

    + + + +
    + +
    + int + currentMonth + + +
    + + + + +
    +

    Implementation

    +
    int get currentMonth => _currentMonth;
    +
    + +
    + + + +
    + +
    + void + currentMonth=(int value) + + +
    + + + + +
    +

    Implementation

    +
    set currentMonth(int value) {
    +	_currentMonth = loopMonth(value);
    +	model.loadMonth(_currentMonth);  // will update later
    +	setState(() {});
    +}
    +
    + +
    + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState/dispose.html b/docs/pages/AdminCalendarState/dispose.html new file mode 100644 index 000000000..cfb0e4eaf --- /dev/null +++ b/docs/pages/AdminCalendarState/dispose.html @@ -0,0 +1,198 @@ + + + + + + + + dispose method - AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    dispose
    + +
    + +
    + + + + +
    +
    + +

    dispose method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +void +dispose() + +
    override
    + +
    + +
    +

    Called when this object is removed from the tree permanently.

    +

    The framework calls this method when this State object will never +build again. After the framework calls dispose, the State object is +considered unmounted and the mounted property is false. It is an error +to call setState at this point. This stage of the lifecycle is terminal: +there is no way to remount a State object that has been disposed.

    +

    Subclasses should override this method to release any resources retained +by this object (e.g., stop any active animations).

    +

    If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

    +
      +
    • In initState, subscribe to the object.
    • +
    • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
    • +
    • In dispose, unsubscribe from the object.
    • +
    +

    If you override this, make sure to end your method with a call to +super.dispose().

    +

    See also:

    + +
    + + + +
    +

    Implementation

    +
    @override
    +void dispose() {
    +	model
    +		..removeListener(listener)
    +		..dispose();
    +	super.dispose();
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState/initState.html b/docs/pages/AdminCalendarState/initState.html new file mode 100644 index 000000000..06e9e6562 --- /dev/null +++ b/docs/pages/AdminCalendarState/initState.html @@ -0,0 +1,196 @@ + + + + + + + + initState method - AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    initState
    + +
    + +
    + + + + +
    +
    + +

    initState method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +void +initState() + +
    override
    + +
    + +
    +

    Called when this object is inserted into the tree.

    +

    The framework will call this method exactly once for each State object +it creates.

    +

    Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

    +

    If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

    +
      +
    • In initState, subscribe to the object.
    • +
    • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
    • +
    • In dispose, unsubscribe from the object.
    • +
    +

    You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

    +

    If you override this, make sure your method starts with a call to +super.initState().

    +
    + + + +
    +

    Implementation

    +
    @override
    +void initState() {
    +	super.initState();
    +	model
    +		..addListener(listener)
    +		..loadMonth(_currentMonth);
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState/listener.html b/docs/pages/AdminCalendarState/listener.html new file mode 100644 index 000000000..45568152e --- /dev/null +++ b/docs/pages/AdminCalendarState/listener.html @@ -0,0 +1,159 @@ + + + + + + + + listener method - AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    listener
    + +
    + +
    + + + + +
    +
    + +

    listener method + Null safety +

    + +
    + + +void +listener() + + + +
    + + + + +
    +

    Implementation

    +
    void listener() => setState(() {});
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState/loopMonth.html b/docs/pages/AdminCalendarState/loopMonth.html new file mode 100644 index 000000000..d413a91b3 --- /dev/null +++ b/docs/pages/AdminCalendarState/loopMonth.html @@ -0,0 +1,168 @@ + + + + + + + + loopMonth method - AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    loopMonth
    + +
    + +
    + + + + +
    +
    + +

    loopMonth method + Null safety +

    + +
    + + +int +loopMonth(
    1. int val
    2. +
    ) + + + +
    + + + + +
    +

    Implementation

    +
    int loopMonth(int val) {
    +	if (val == 12) {
    +		return 0;
    +	} else if (val == -1) {
    +		return 11;
    +	} else {
    +		return val;
    +	}
    +}
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState/model.html b/docs/pages/AdminCalendarState/model.html new file mode 100644 index 000000000..a8be4747c --- /dev/null +++ b/docs/pages/AdminCalendarState/model.html @@ -0,0 +1,157 @@ + + + + + + + + model property - AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    model
    + +
    + +
    + + + + +
    +
    + +

    model property + Null safety +

    + +
    + CalendarEditor + model +
    final
    + +
    + + + +
    +

    Implementation

    +
    final CalendarEditor model = CalendarEditor();
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState/months-constant.html b/docs/pages/AdminCalendarState/months-constant.html new file mode 100644 index 000000000..64a99cc8c --- /dev/null +++ b/docs/pages/AdminCalendarState/months-constant.html @@ -0,0 +1,165 @@ + + + + + + + + months constant - AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    months
    + +
    + +
    + + + + +
    +
    + +

    months constant + Null safety +

    + +
    + List<String> + const months + + +
    + +
    +

    The months of the year.

    +

    These will be the headers of all the months.

    +
    + + +
    +

    Implementation

    +
    static const List<String> months = [
    +	"January", "February", "March", "April", "May",
    +	"June", "July", "August", "September", "October",
    +	"November", "December"
    +];
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminCalendarState/weekdays-constant.html b/docs/pages/AdminCalendarState/weekdays-constant.html new file mode 100644 index 000000000..e8833c96a --- /dev/null +++ b/docs/pages/AdminCalendarState/weekdays-constant.html @@ -0,0 +1,163 @@ + + + + + + + + weekdays constant - AdminCalendarState class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    weekdays
    + +
    + +
    + + + + +
    +
    + +

    weekdays constant + Null safety +

    + +
    + List<String> + const weekdays + + +
    + +
    +

    The days of the week.

    +

    This will be used as the labels of the calendar.

    +
    + + +
    +

    Implementation

    +
    static const List<String> weekdays = [
    +	"Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat"
    +];
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminSchedulesPage-class.html b/docs/pages/AdminSchedulesPage-class.html new file mode 100644 index 000000000..bc7dcee74 --- /dev/null +++ b/docs/pages/AdminSchedulesPage-class.html @@ -0,0 +1,406 @@ + + + + + + + + AdminSchedulesPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    AdminSchedulesPage
    + +
    + +
    + + + + +
    +
    + +

    AdminSchedulesPage class + Null safety + +

    + + +
    +

    A page to show the admin's custom schedules.

    +
    + + +
    +
    +
    Inheritance
    +
    + + + + + +
    +
    + +
    +

    Constructors

    + +
    +
    + AdminSchedulesPage() +
    +
    + +
    const
    +
    +
    +
    + +
    +

    Properties

    + +
    +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    @nonVirtual, read-only, inherited
    + +
    + +
    + key + Key? + +
    +
    + Controls how one widget replaces another widget in the tree. [...] +
    final, inherited
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + build(BuildContext context) + Widget + + + +
    +
    + Describes the part of the user interface represented by this widget. [...] +
    override
    + +
    + +
    + createElement() + StatelessElement + + + +
    +
    + Creates a StatelessElement to manage this widget's location in the tree. [...] +
    inherited
    + +
    + +
    + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
    +
    + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
    @protected, inherited
    + +
    + +
    + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
    +
    + Add additional properties associated with the node. [...] +
    inherited
    + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
    +
    + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
    inherited
    + +
    + +
    + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a string representation of this node and its descendants. [...] +
    inherited
    + +
    + +
    + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a one-line detailed description of the object. [...] +
    inherited
    + +
    + +
    + toStringShort() + → String + + + +
    +
    + A short, textual description of this widget. +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    @nonVirtual, inherited
    + +
    + +
    +
    + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminSchedulesPage/AdminSchedulesPage.html b/docs/pages/AdminSchedulesPage/AdminSchedulesPage.html new file mode 100644 index 000000000..b464eb8c5 --- /dev/null +++ b/docs/pages/AdminSchedulesPage/AdminSchedulesPage.html @@ -0,0 +1,142 @@ + + + + + + + + AdminSchedulesPage constructor - AdminSchedulesPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    AdminSchedulesPage
    + +
    + +
    + + + + +
    +
    + +

    AdminSchedulesPage constructor + Null safety +

    + +
    const + AdminSchedulesPage() +
    + + + + + +
    +

    Implementation

    +
    const AdminSchedulesPage();
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/AdminSchedulesPage/build.html b/docs/pages/AdminSchedulesPage/build.html new file mode 100644 index 000000000..5f54bf510 --- /dev/null +++ b/docs/pages/AdminSchedulesPage/build.html @@ -0,0 +1,231 @@ + + + + + + + + build method - AdminSchedulesPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    build
    + +
    + +
    + + + + +
    +
    + +

    build method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +Widget +build(
    1. BuildContext context
    2. +
    ) + +
    override
    + +
    + +
    +

    Describes the part of the user interface represented by this widget.

    +

    The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

    +

    The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

    +

    Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

    +

    The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

    +

    The implementation of this method must only depend on:

    + +

    If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

    +

    See also:

    +
      +
    • StatelessWidget, which contains the discussion on performance considerations.
    • +
    +
    + + + +
    +

    Implementation

    +
    @override
    +Widget build(BuildContext context) => ModelListener(
    +	model: () => AdminScheduleModel(),
    +	builder: (_, AdminScheduleModel model, __) => ResponsiveScaffold(
    +		appBar: AppBar(title: const Text("Custom schedules")),
    +		drawer: const NavigationDrawer(),
    +		floatingActionButton: FloatingActionButton(
    +			onPressed: () async {
    +				final Schedule? schedule = await ScheduleBuilder.buildSchedule(context);
    +				if (schedule == null) {
    +					return;
    +				}
    +				await model.createSchedule(schedule);
    +			},
    +			child: const Icon(Icons.add),
    +		),
    +		bodyBuilder: (_) => Padding(
    +			padding: const EdgeInsets.all(20),
    +			child: model.schedules.isEmpty
    +				? const Center (
    +					child: Text (
    +						"There are no schedules yet. Feel free to add one.",
    +						textScaleFactor: 1.5,
    +						textAlign: TextAlign.center,
    +					)
    +				)
    +				: ListView(
    +					children: [
    +						for (final Schedule schedule in model.schedules)
    +							ListTile(
    +								title: Text(schedule.name),
    +								onTap: () async {
    +									final Schedule? newSchedule =
    +										await ScheduleBuilder.buildSchedule(context, schedule);
    +									if (newSchedule != null) {
    +										await model.createSchedule(newSchedule);
    +									}
    +								},
    +							)
    +					]
    +			)
    +		)
    +	)
    +);
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/DayBuilder-class.html b/docs/pages/DayBuilder-class.html new file mode 100644 index 000000000..5b425a5e5 --- /dev/null +++ b/docs/pages/DayBuilder-class.html @@ -0,0 +1,446 @@ + + + + + + + + DayBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    DayBuilder
    + +
    + +
    + + + + +
    +
    + +

    DayBuilder class + Null safety + +

    + + +
    +

    A widget to guide the admin in modifying a day in the calendar.

    +

    Creates a pop-up that allows the admin to set the dayName and Schedule +for a given day in the calendar.

    +

    If day is provided, then the fields DayBuilderModel.name, +DayBuilderModel.schedule, are set to Day.name and Day.schedule.

    +
    + + +
    +
    +
    Inheritance
    +
    + + + + + +
    +
    + +
    +

    Constructors

    + +
    +
    + DayBuilder({required Day? day, required DateTime date, required Future<void> upload(Day?)}) +
    +
    + Creates a widget to guide the user in creating a Day +
    const
    +
    +
    +
    + +
    +

    Properties

    + +
    +
    + date + → DateTime + +
    +
    + +
    final
    + +
    + +
    + day + Day? + +
    +
    + The day to edit, if it already exists. +
    final
    + +
    + +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    @nonVirtual, read-only, inherited
    + +
    + +
    + key + Key? + +
    +
    + Controls how one widget replaces another widget in the tree. [...] +
    final, inherited
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    + upload + → Future<void> Function(Day?) + +
    +
    + +
    final
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + build(BuildContext context) + Widget + + + +
    +
    + Describes the part of the user interface represented by this widget. [...] +
    override
    + +
    + +
    + createElement() + StatelessElement + + + +
    +
    + Creates a StatelessElement to manage this widget's location in the tree. [...] +
    inherited
    + +
    + +
    + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
    +
    + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
    @protected, inherited
    + +
    + +
    + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
    +
    + Add additional properties associated with the node. [...] +
    inherited
    + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
    +
    + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
    inherited
    + +
    + +
    + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a string representation of this node and its descendants. [...] +
    inherited
    + +
    + +
    + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a one-line detailed description of the object. [...] +
    inherited
    + +
    + +
    + toStringShort() + → String + + + +
    +
    + A short, textual description of this widget. +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    @nonVirtual, inherited
    + +
    + +
    +
    + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/DayBuilder/DayBuilder.html b/docs/pages/DayBuilder/DayBuilder.html new file mode 100644 index 000000000..e0b65ffd6 --- /dev/null +++ b/docs/pages/DayBuilder/DayBuilder.html @@ -0,0 +1,157 @@ + + + + + + + + DayBuilder constructor - DayBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    DayBuilder
    + +
    + +
    + + + + +
    +
    + +

    DayBuilder constructor + Null safety +

    + +
    const + DayBuilder(
    1. {required Day? day,
    2. +
    3. required DateTime date,
    4. +
    5. required Future<void> upload(
      1. Day?
      2. +
      +)}
    6. +
    ) +
    + + +
    +

    Creates a widget to guide the user in creating a Day

    +
    + + + +
    +

    Implementation

    +
    const DayBuilder({
    +	required this.day,
    +	required this.date,
    +	required this.upload
    +});
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/DayBuilder/build.html b/docs/pages/DayBuilder/build.html new file mode 100644 index 000000000..05fd16138 --- /dev/null +++ b/docs/pages/DayBuilder/build.html @@ -0,0 +1,272 @@ + + + + + + + + build method - DayBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    build
    + +
    + +
    + + + + +
    +
    + +

    build method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +Widget +build(
    1. BuildContext context
    2. +
    ) + +
    override
    + +
    + +
    +

    Describes the part of the user interface represented by this widget.

    +

    The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

    +

    The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

    +

    Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

    +

    The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

    +

    The implementation of this method must only depend on:

    + +

    If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

    +

    See also:

    +
      +
    • StatelessWidget, which contains the discussion on performance considerations.
    • +
    +
    + + + +
    +

    Implementation

    +
    @override
    +Widget build(BuildContext context) => ModelListener<DayBuilderModel>(
    +	model: () => DayBuilderModel(day: day, date: date),
    +	// ignore: sort_child_properties_last
    +	child: TextButton(
    +		onPressed: () => Navigator.of(context).pop(),
    +		child: const Text("Cancel"),
    +	),
    +	builder: (_, DayBuilderModel model, Widget? cancel) => AlertDialog(
    +		title: const Text("Edit day"),
    +		content: Column (
    +			mainAxisSize: MainAxisSize.min,
    +			children: [
    +				Text("Date: ${date.month}/${date.day}"),
    +				const SizedBox(height: 20),
    +				SwitchListTile(
    +					title: const Text("School?"),
    +					value: model.hasSchool,
    +					onChanged: (bool value) => model.hasSchool = value,
    +				),
    +				Container(
    +					width: double.infinity,
    +					child: Wrap (
    +						alignment: WrapAlignment.spaceBetween,
    +						crossAxisAlignment: WrapCrossAlignment.center,
    +						children: [
    +							const Text("Day", textAlign: TextAlign.center),
    +							DropdownButton<String>(
    +								value: model.name,
    +								hint: const Text("Day"),
    +								onChanged: !model.hasSchool ? null :
    +									(String? value) => model.name = value,
    +								items: [
    +									for (final String dayName in Models.instance.schedule.user.dayNames)
    +										DropdownMenuItem<String>(
    +											value: dayName,
    +											child: Text(dayName),
    +										)
    +								],
    +							)
    +						]
    +					),
    +				),
    +				const SizedBox(height: 20),
    +				Container(
    +					width: double.infinity,
    +					child: Wrap (
    +						runSpacing: 3,
    +						children: [
    +							const Text("Schedule"),
    +							DropdownButton<String>(
    +								value: model.schedule?.name,
    +								hint: const Text("Schedule"),
    +								onChanged: !model.hasSchool ? null : (String? value) =>
    +									model.schedule = Schedule.schedules.firstWhere(
    +										(Schedule schedule) => schedule.name == value
    +									),
    +								items: [
    +									for (final Schedule schedule in Schedule.schedules)
    +										DropdownMenuItem(
    +											value: schedule.name,
    +											child: Text(schedule.name),
    +										),
    +								],
    +							)
    +						]
    +					)
    +				)
    +			]
    +		),
    +		actions: [
    +			cancel!,
    +			ElevatedButton(
    +				onPressed: !model.ready ? null : () async {
    +					await upload(model.day);
    +					Navigator.of(context).pop();
    +				},
    +				child: const Text("Save", style: TextStyle(color: Colors.white)),
    +			)
    +		]
    +	),
    +);
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/DayBuilder/date.html b/docs/pages/DayBuilder/date.html new file mode 100644 index 000000000..b95caea94 --- /dev/null +++ b/docs/pages/DayBuilder/date.html @@ -0,0 +1,148 @@ + + + + + + + + date property - DayBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    date
    + +
    + +
    + + + + +
    +
    + +

    date property + Null safety +

    + +
    + DateTime + date +
    final
    + +
    + + + +
    +

    Implementation

    +
    final DateTime date;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/DayBuilder/day.html b/docs/pages/DayBuilder/day.html new file mode 100644 index 000000000..4123542f1 --- /dev/null +++ b/docs/pages/DayBuilder/day.html @@ -0,0 +1,151 @@ + + + + + + + + day property - DayBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    day
    + +
    + +
    + + + + +
    +
    + +

    day property + Null safety +

    + +
    + Day? + day +
    final
    + +
    + +
    +

    The day to edit, if it already exists.

    +
    + + +
    +

    Implementation

    +
    final Day? day;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/DayBuilder/upload.html b/docs/pages/DayBuilder/upload.html new file mode 100644 index 000000000..c3aa3365c --- /dev/null +++ b/docs/pages/DayBuilder/upload.html @@ -0,0 +1,148 @@ + + + + + + + + upload property - DayBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    upload
    + +
    + +
    + + + + +
    +
    + +

    upload property + Null safety +

    + +
    + Future<void> Function(Day?) + upload +
    final
    + +
    + + + +
    +

    Implementation

    +
    final Future<void> Function(Day?) upload;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FeedbackPage-class.html b/docs/pages/FeedbackPage-class.html new file mode 100644 index 000000000..6d210b9d3 --- /dev/null +++ b/docs/pages/FeedbackPage-class.html @@ -0,0 +1,406 @@ + + + + + + + + FeedbackPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    FeedbackPage
    + +
    + +
    + + + + +
    +
    + +

    FeedbackPage class + Null safety + +

    + + +
    +

    A page to submit feedback.

    +
    + + +
    +
    +
    Inheritance
    +
    + + + + + +
    +
    + +
    +

    Constructors

    + +
    +
    + FeedbackPage() +
    +
    + +
    const
    +
    +
    +
    + +
    +

    Properties

    + +
    +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    @nonVirtual, read-only, inherited
    + +
    + +
    + key + Key? + +
    +
    + Controls how one widget replaces another widget in the tree. [...] +
    final, inherited
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + build(BuildContext context) + Widget + + + +
    +
    + Describes the part of the user interface represented by this widget. [...] +
    override
    + +
    + +
    + createElement() + StatelessElement + + + +
    +
    + Creates a StatelessElement to manage this widget's location in the tree. [...] +
    inherited
    + +
    + +
    + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
    +
    + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
    @protected, inherited
    + +
    + +
    + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
    +
    + Add additional properties associated with the node. [...] +
    inherited
    + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
    +
    + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
    inherited
    + +
    + +
    + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a string representation of this node and its descendants. [...] +
    inherited
    + +
    + +
    + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a one-line detailed description of the object. [...] +
    inherited
    + +
    + +
    + toStringShort() + → String + + + +
    +
    + A short, textual description of this widget. +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    @nonVirtual, inherited
    + +
    + +
    +
    + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FeedbackPage/FeedbackPage.html b/docs/pages/FeedbackPage/FeedbackPage.html new file mode 100644 index 000000000..30fe626e8 --- /dev/null +++ b/docs/pages/FeedbackPage/FeedbackPage.html @@ -0,0 +1,142 @@ + + + + + + + + FeedbackPage constructor - FeedbackPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    FeedbackPage
    + +
    + +
    + + + + +
    +
    + +

    FeedbackPage constructor + Null safety +

    + +
    const + FeedbackPage() +
    + + + + + +
    +

    Implementation

    +
    const FeedbackPage();
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FeedbackPage/build.html b/docs/pages/FeedbackPage/build.html new file mode 100644 index 000000000..ccb6fa0b2 --- /dev/null +++ b/docs/pages/FeedbackPage/build.html @@ -0,0 +1,232 @@ + + + + + + + + build method - FeedbackPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    build
    + +
    + +
    + + + + +
    +
    + +

    build method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +Widget +build(
    1. BuildContext context
    2. +
    ) + +
    override
    + +
    + +
    +

    Describes the part of the user interface represented by this widget.

    +

    The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

    +

    The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

    +

    Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

    +

    The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

    +

    The implementation of this method must only depend on:

    + +

    If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

    +

    See also:

    +
      +
    • StatelessWidget, which contains the discussion on performance considerations.
    • +
    +
    + + + +
    +

    Implementation

    +
    @override
    +Widget build (BuildContext context) => ResponsiveScaffold(
    +	drawer: const NavigationDrawer(),
    +	appBar: AppBar(title: const Text ("Send Feedback")),
    +	bodyBuilder: (_) => ModelListener<FeedbackModel>(
    +		model: () => FeedbackModel(),
    +		builder: (BuildContext context, FeedbackModel model, _) => Center(
    +			child: SizedBox(
    +				width: 400,
    +				child: Column(
    +			mainAxisAlignment: MainAxisAlignment.center,
    +			crossAxisAlignment: CrossAxisAlignment.center,
    +			children: [
    +				TextField(
    +					autofocus: true,
    +					maxLength: 500,
    +					onChanged: (String text) => model.message = text,
    +					textCapitalization: TextCapitalization.sentences,
    +				),
    +				const SizedBox(height: 20),
    +				CheckboxListTile(
    +					value: model.anonymous,
    +					// If tristate == false (default), value != null
    +					onChanged: (bool? value) => model.anonymous = value!,
    +					title: const Text("Anonymous"),
    +					subtitle: const Text(
    +						"To keep your name and email hidden, check this box."
    +					)
    +				),
    +				const SizedBox(height: 50),
    +				ElevatedButton.icon(
    +					label: const Text ("Submit"),
    +					icon: const Icon(Icons.send),
    +					onPressed: !model.ready
    +						? null
    +						: () {
    +							model.send();
    +							Navigator.of(context).pop();
    +						}
    +					)
    +				]
    +			)
    +		)
    +	))
    +);
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FormRow-class.html b/docs/pages/FormRow-class.html new file mode 100644 index 000000000..624002777 --- /dev/null +++ b/docs/pages/FormRow-class.html @@ -0,0 +1,462 @@ + + + + + + + + FormRow class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    FormRow
    + +
    + +
    + + + + +
    +
    + +

    FormRow class + Null safety + +

    + + +
    +

    A row in a form.

    +

    Displays a title or header on the left, and a picker on the right.

    +
    + + +
    +
    +
    Inheritance
    +
    + + + + + +
    +
    + +
    +

    Constructors

    + +
    +
    + FormRow(String title, Widget picker, {bool sized = false}) +
    +
    + Creates a row in a form. +
    const
    +
    +
    + FormRow.editable({required String title, required VoidCallback setNewValue, required IconData whenNull, String? value}) +
    +
    + A FormRow where the right side is represented by an Icon [...] +
    +
    +
    + +
    +

    Properties

    + +
    +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    @nonVirtual, read-only, inherited
    + +
    + +
    + key + Key? + +
    +
    + Controls how one widget replaces another widget in the tree. [...] +
    final, inherited
    + +
    + +
    + moreSpace + → bool + +
    +
    + Whether this widget needs more space on the bottom. [...] +
    final
    + +
    + +
    + picker + Widget + +
    +
    + The picker for user input. +
    final
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    + sized + → bool + +
    +
    + Whether to constrict picker's size. +
    final
    + +
    + +
    + title + → String + +
    +
    + The title to show. +
    final
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + build(BuildContext context) + Widget + + + +
    +
    + Describes the part of the user interface represented by this widget. [...] +
    override
    + +
    + +
    + createElement() + StatelessElement + + + +
    +
    + Creates a StatelessElement to manage this widget's location in the tree. [...] +
    inherited
    + +
    + +
    + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
    +
    + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
    @protected, inherited
    + +
    + +
    + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
    +
    + Add additional properties associated with the node. [...] +
    inherited
    + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
    +
    + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
    inherited
    + +
    + +
    + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a string representation of this node and its descendants. [...] +
    inherited
    + +
    + +
    + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a one-line detailed description of the object. [...] +
    inherited
    + +
    + +
    + toStringShort() + → String + + + +
    +
    + A short, textual description of this widget. +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    @nonVirtual, inherited
    + +
    + +
    +
    + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FormRow/FormRow.editable.html b/docs/pages/FormRow/FormRow.editable.html new file mode 100644 index 000000000..197f81f16 --- /dev/null +++ b/docs/pages/FormRow/FormRow.editable.html @@ -0,0 +1,176 @@ + + + + + + + + FormRow.editable constructor - FormRow class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    FormRow.editable
    + +
    + +
    + + + + +
    +
    + +

    FormRow.editable constructor + Null safety +

    + +
    + FormRow.editable(
    1. {required String title,
    2. +
    3. required VoidCallback setNewValue,
    4. +
    5. required IconData whenNull,
    6. +
    7. String? value}
    8. +
    ) +
    + + +
    +

    A FormRow where the right side is represented by an Icon

    +

    When value is null, whenNull is displayed. Otherwise, value is +displayed in a Text widget. Both widgets, when tapped, call +setNewValue.

    +
    + + + +
    +

    Implementation

    +
    FormRow.editable({
    +	required this.title,
    +	required VoidCallback setNewValue,
    +	required IconData whenNull,
    +	String? value,
    +}) :
    +	sized = false,
    +	moreSpace = true,
    +	picker = value == null
    +		? IconButton(
    +			icon: Icon(whenNull),
    +			onPressed: setNewValue
    +		)
    +		: InkWell(
    +			onTap: setNewValue,
    +			child: Text(
    +				value,
    +				style: const TextStyle(color: Colors.blue),
    +			),
    +		);
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FormRow/FormRow.html b/docs/pages/FormRow/FormRow.html new file mode 100644 index 000000000..c09d3fa11 --- /dev/null +++ b/docs/pages/FormRow/FormRow.html @@ -0,0 +1,154 @@ + + + + + + + + FormRow constructor - FormRow class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    FormRow
    + +
    + +
    + + + + +
    +
    + +

    FormRow constructor + Null safety +

    + +
    const + FormRow(
    1. String title,
    2. +
    3. Widget picker,
    4. +
    5. {bool sized = false}
    6. +
    ) +
    + + +
    +

    Creates a row in a form.

    +
    + + + +
    +

    Implementation

    +
    const FormRow(this.title, this.picker, {this.sized = false}) :
    +	moreSpace = false;
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FormRow/build.html b/docs/pages/FormRow/build.html new file mode 100644 index 000000000..94bf4d974 --- /dev/null +++ b/docs/pages/FormRow/build.html @@ -0,0 +1,213 @@ + + + + + + + + build method - FormRow class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    build
    + +
    + +
    + + + + +
    +
    + +

    build method + Null safety +

    + +
    + +
    +
      +
    1. @override
    2. +
    +
    + +Widget +build(
    1. BuildContext context
    2. +
    ) + +
    override
    + +
    + +
    +

    Describes the part of the user interface represented by this widget.

    +

    The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

    +

    The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

    +

    Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

    +

    The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

    +

    The implementation of this method must only depend on:

    + +

    If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

    +

    See also:

    +
      +
    • StatelessWidget, which contains the discussion on performance considerations.
    • +
    +
    + + + +
    +

    Implementation

    +
    @override
    +Widget build(BuildContext context) => Column(
    +	children: [
    +		Row(
    +			mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    +			children: [
    +				Text(title),
    +				const Spacer(),
    +				if (sized) Container(
    +					constraints: const BoxConstraints(
    +						maxWidth: 200,
    +						maxHeight: 75,
    +					),
    +					child: picker,
    +				)
    +				else picker
    +			]
    +		),
    +		SizedBox(height: moreSpace ? 25 : 15),
    +	]
    +);
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FormRow/moreSpace.html b/docs/pages/FormRow/moreSpace.html new file mode 100644 index 000000000..afc37b482 --- /dev/null +++ b/docs/pages/FormRow/moreSpace.html @@ -0,0 +1,157 @@ + + + + + + + + moreSpace property - FormRow class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    moreSpace
    + +
    + +
    + + + + +
    +
    + +

    moreSpace property + Null safety +

    + +
    + bool + moreSpace +
    final
    + +
    + +
    +

    Whether this widget needs more space on the bottom.

    +

    Widgets that use sized don't need this, since their picker is big +enough to provide padding on the bottom as well. Hence, this is only +set to true for widgets created with FormRow.editable(), since those +never use a big picker.

    +
    + + +
    +

    Implementation

    +
    final bool moreSpace;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FormRow/picker.html b/docs/pages/FormRow/picker.html new file mode 100644 index 000000000..15670fa2e --- /dev/null +++ b/docs/pages/FormRow/picker.html @@ -0,0 +1,153 @@ + + + + + + + + picker property - FormRow class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    picker
    + +
    + +
    + + + + +
    +
    + +

    picker property + Null safety +

    + +
    + Widget + picker +
    final
    + +
    + +
    +

    The picker for user input.

    +
    + + +
    +

    Implementation

    +
    final Widget picker;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FormRow/sized.html b/docs/pages/FormRow/sized.html new file mode 100644 index 000000000..960cecd49 --- /dev/null +++ b/docs/pages/FormRow/sized.html @@ -0,0 +1,153 @@ + + + + + + + + sized property - FormRow class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    sized
    + +
    + +
    + + + + +
    +
    + +

    sized property + Null safety +

    + +
    + bool + sized +
    final
    + +
    + +
    +

    Whether to constrict picker's size.

    +
    + + +
    +

    Implementation

    +
    final bool sized;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/FormRow/title.html b/docs/pages/FormRow/title.html new file mode 100644 index 000000000..d99c99424 --- /dev/null +++ b/docs/pages/FormRow/title.html @@ -0,0 +1,153 @@ + + + + + + + + title property - FormRow class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    title
    + +
    + +
    + + + + +
    +
    + +

    title property + Null safety +

    + +
    + String + title +
    final
    + +
    + +
    +

    The title to show.

    +
    + + +
    +

    Implementation

    +
    final String title;
    +
    +
    +
    + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/GenericSportsView-class.html b/docs/pages/GenericSportsView-class.html new file mode 100644 index 000000000..657e9b467 --- /dev/null +++ b/docs/pages/GenericSportsView-class.html @@ -0,0 +1,469 @@ + + + + + + + + GenericSportsView class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    GenericSportsView
    + +
    + +
    + + + + +
    +
    + +

    GenericSportsView<T> class + Null safety + +

    + + +
    +

    A Swipe to Refresh list of SportsGames.

    +

    This is used to simplify the logic between games that are sorted +chronologically and by sport, since both will be split by past and +future games.

    +
    + + +
    +
    +
    Inheritance
    +
    + + + + + +
    +
    + +
    +

    Constructors

    + +
    +
    + GenericSportsView({required List<T> upcoming, required List<T> recents, required Widget builder(T), required Future<void> onRefresh(), required bool loading}) +
    +
    + Creates a list of SportsTiles. +
    const
    +
    +
    +
    + +
    +

    Properties

    + +
    +
    + builder + Widget Function(T) + +
    +
    + Builds a list of SportsTiles using upcoming and recents. +
    final
    + +
    + +
    + hashCode + → int + +
    +
    + The hash code for this object. [...] +
    @nonVirtual, read-only, inherited
    + +
    + +
    + key + Key? + +
    +
    + Controls how one widget replaces another widget in the tree. [...] +
    final, inherited
    + +
    + +
    + loading + → bool + +
    +
    + Whether to show a loading indicator. +
    final
    + +
    + +
    + onRefresh + → Future<void> Function() + +
    +
    + The function to call when the user refreshes the page. +
    final
    + +
    + +
    + recents + → List<T> + +
    +
    + A list of past games. [...] +
    final
    + +
    + +
    + runtimeType + → Type + +
    +
    + A representation of the runtime type of the object. +
    read-only, inherited
    + +
    + +
    + upcoming + → List<T> + +
    +
    + A list of upcoming games. [...] +
    final
    + +
    + +
    +
    + +
    +

    Methods

    +
    +
    + build(BuildContext context) + Widget + + + +
    +
    + Describes the part of the user interface represented by this widget. [...] +
    override
    + +
    + +
    + createElement() + StatelessElement + + + +
    +
    + Creates a StatelessElement to manage this widget's location in the tree. [...] +
    inherited
    + +
    + +
    + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
    +
    + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
    @protected, inherited
    + +
    + +
    + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
    +
    + Add additional properties associated with the node. [...] +
    inherited
    + +
    + +
    + noSuchMethod(Invocation invocation) + → dynamic + + + +
    +
    + Invoked when a non-existent method or property is accessed. [...] +
    inherited
    + +
    + +
    + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
    +
    + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
    inherited
    + +
    + +
    + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
    +
    + A string representation of this object. [...] +
    inherited
    + +
    + +
    + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a string representation of this node and its descendants. [...] +
    inherited
    + +
    + +
    + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
    +
    + Returns a one-line detailed description of the object. [...] +
    inherited
    + +
    + +
    + toStringShort() + → String + + + +
    +
    + A short, textual description of this widget. +
    inherited
    + +
    + +
    +
    + +
    +

    Operators

    +
    +
    + operator ==(Object other) + → bool + + + +
    +
    + The equality operator. [...] +
    @nonVirtual, inherited
    + +
    + +
    +
    + + + + +
    + + + +
    + +
    + + ramaz + 2.1.1+1 + + + +
    + + + + + + + + + + + diff --git a/docs/pages/GenericSportsView/GenericSportsView.html b/docs/pages/GenericSportsView/GenericSportsView.html new file mode 100644 index 000000000..566ec66ca --- /dev/null +++ b/docs/pages/GenericSportsView/GenericSportsView.html @@ -0,0 +1,164 @@ + + + + + + + + GenericSportsView constructor - GenericSportsView class - pages library - Dart API + + + + + + + + + + + + + + + + +
    + +
    + + +
    GenericSportsView
    + +
    + +
    + + + + +
    +
    + +

    GenericSportsView<T> constructor + Null safety +

    + +
    const + GenericSportsView<T>(
    1. {required List<T> upcoming,
    2. +
    3. required List<T> recents,
    4. +
    5. required Widget builder(
      1. T
      2. +
      +),
    6. +
    7. required Future<void> onRefresh(
        +),
      1. +
      2. required bool loading}
      3. +
      ) +
      + + +
      +

      Creates a list of SportsTiles.

      +
      + + + +
      +

      Implementation

      +
      const GenericSportsView({
      +	required this.upcoming,
      +	required this.recents,
      +	required this.builder,
      +	required this.onRefresh,
      +	required this.loading,
      +});
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/GenericSportsView/build.html b/docs/pages/GenericSportsView/build.html new file mode 100644 index 000000000..fc6492e35 --- /dev/null +++ b/docs/pages/GenericSportsView/build.html @@ -0,0 +1,209 @@ + + + + + + + + build method - GenericSportsView class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      build
      + +
      + +
      + + + + +
      +
      + +

      build method + Null safety +

      + +
      + +
      +
        +
      1. @override
      2. +
      +
      + +Widget +build(
      1. BuildContext context
      2. +
      ) + +
      override
      + +
      + +
      +

      Describes the part of the user interface represented by this widget.

      +

      The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

      +

      The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

      +

      Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

      +

      The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

      +

      The implementation of this method must only depend on:

      + +

      If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

      +

      See also:

      +
        +
      • StatelessWidget, which contains the discussion on performance considerations.
      • +
      +
      + + + +
      +

      Implementation

      +
      @override
      +Widget build(BuildContext context) => TabBarView(
      +	children: [
      +		for (final List<T> gamesList in [upcoming, recents])
      +			RefreshIndicator(
      +				onRefresh: onRefresh,
      +				child: ListView(
      +					children: [
      +						if (loading)
      +							const LinearProgressIndicator(),
      +						for (final T game in gamesList)
      +							builder(game)
      +					]
      +				)
      +			)
      +	]
      +);
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/GenericSportsView/builder.html b/docs/pages/GenericSportsView/builder.html new file mode 100644 index 000000000..5fbe05c33 --- /dev/null +++ b/docs/pages/GenericSportsView/builder.html @@ -0,0 +1,153 @@ + + + + + + + + builder property - GenericSportsView class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      builder
      + +
      + +
      + + + + +
      +
      + +

      builder property + Null safety +

      + +
      + Widget Function(T) + builder +
      final
      + +
      + +
      +

      Builds a list of SportsTiles using upcoming and recents.

      +
      + + +
      +

      Implementation

      +
      final Widget Function(T) builder;
      +
      +
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/GenericSportsView/loading.html b/docs/pages/GenericSportsView/loading.html new file mode 100644 index 000000000..747b49770 --- /dev/null +++ b/docs/pages/GenericSportsView/loading.html @@ -0,0 +1,153 @@ + + + + + + + + loading property - GenericSportsView class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      loading
      + +
      + +
      + + + + +
      +
      + +

      loading property + Null safety +

      + +
      + bool + loading +
      final
      + +
      + +
      +

      Whether to show a loading indicator.

      +
      + + +
      +

      Implementation

      +
      final bool loading;
      +
      +
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/GenericSportsView/onRefresh.html b/docs/pages/GenericSportsView/onRefresh.html new file mode 100644 index 000000000..3f3cc1d8d --- /dev/null +++ b/docs/pages/GenericSportsView/onRefresh.html @@ -0,0 +1,153 @@ + + + + + + + + onRefresh property - GenericSportsView class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      onRefresh
      + +
      + +
      + + + + +
      +
      + +

      onRefresh property + Null safety +

      + +
      + Future<void> Function() + onRefresh +
      final
      + +
      + +
      +

      The function to call when the user refreshes the page.

      +
      + + +
      +

      Implementation

      +
      final Future<void> Function() onRefresh;
      +
      +
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/GenericSportsView/recents.html b/docs/pages/GenericSportsView/recents.html new file mode 100644 index 000000000..c62abe4df --- /dev/null +++ b/docs/pages/GenericSportsView/recents.html @@ -0,0 +1,155 @@ + + + + + + + + recents property - GenericSportsView class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      recents
      + +
      + +
      + + + + +
      +
      + +

      recents property + Null safety +

      + +
      + List<T> + recents +
      final
      + +
      + +
      +

      A list of past games.

      +

      This can be any type as long as it can be used in builder to build +SportsTiles.

      +
      + + +
      +

      Implementation

      +
      final List<T> recents;
      +
      +
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/GenericSportsView/upcoming.html b/docs/pages/GenericSportsView/upcoming.html new file mode 100644 index 000000000..7ee16da75 --- /dev/null +++ b/docs/pages/GenericSportsView/upcoming.html @@ -0,0 +1,155 @@ + + + + + + + + upcoming property - GenericSportsView class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      upcoming
      + +
      + +
      + + + + +
      +
      + +

      upcoming property + Null safety +

      + +
      + List<T> + upcoming +
      final
      + +
      + +
      +

      A list of upcoming games.

      +

      This can be any type as long as it can be used in builder to build +SportsTiles.

      +
      + + +
      +

      Implementation

      +
      final List<T> upcoming;
      +
      +
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/HomePage-class.html b/docs/pages/HomePage-class.html new file mode 100644 index 000000000..006bc237b --- /dev/null +++ b/docs/pages/HomePage-class.html @@ -0,0 +1,415 @@ + + + + + + + + HomePage class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      HomePage
      + +
      + +
      + + + + +
      +
      + +

      HomePage class + Null safety + +

      + + + + +
      +
      +
      Inheritance
      +
      + + + + + +
      +
      + +
      +

      Constructors

      + +
      +
      + HomePage({int? pageIndex}) +
      +
      + +
      const
      +
      +
      +
      + +
      +

      Properties

      + +
      +
      + hashCode + → int + +
      +
      + The hash code for this object. [...] +
      @nonVirtual, read-only, inherited
      + +
      + +
      + key + Key? + +
      +
      + Controls how one widget replaces another widget in the tree. [...] +
      final, inherited
      + +
      + +
      + pageIndex + → int? + +
      +
      + +
      final
      + +
      + +
      + runtimeType + → Type + +
      +
      + A representation of the runtime type of the object. +
      read-only, inherited
      + +
      + +
      +
      + +
      +

      Methods

      +
      +
      + createElement() + StatefulElement + + + +
      +
      + Creates a StatefulElement to manage this widget's location in the tree. [...] +
      inherited
      + +
      + +
      + createState() + HomePageState + + + +
      +
      + Creates the mutable state for this widget at a given location in the tree. [...] +
      override
      + +
      + +
      + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
      +
      + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
      @protected, inherited
      + +
      + +
      + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
      +
      + Add additional properties associated with the node. [...] +
      inherited
      + +
      + +
      + noSuchMethod(Invocation invocation) + → dynamic + + + +
      +
      + Invoked when a non-existent method or property is accessed. [...] +
      inherited
      + +
      + +
      + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
      +
      + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
      inherited
      + +
      + +
      + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
      +
      + A string representation of this object. [...] +
      inherited
      + +
      + +
      + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
      +
      + Returns a string representation of this node and its descendants. [...] +
      inherited
      + +
      + +
      + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
      +
      + Returns a one-line detailed description of the object. [...] +
      inherited
      + +
      + +
      + toStringShort() + → String + + + +
      +
      + A short, textual description of this widget. +
      inherited
      + +
      + +
      +
      + +
      +

      Operators

      +
      +
      + operator ==(Object other) + → bool + + + +
      +
      + The equality operator. [...] +
      @nonVirtual, inherited
      + +
      + +
      +
      + + + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/HomePage/HomePage.html b/docs/pages/HomePage/HomePage.html new file mode 100644 index 000000000..ad3078ae7 --- /dev/null +++ b/docs/pages/HomePage/HomePage.html @@ -0,0 +1,144 @@ + + + + + + + + HomePage constructor - HomePage class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      HomePage
      + +
      + +
      + + + + +
      +
      + +

      HomePage constructor + Null safety +

      + +
      const + HomePage(
      1. {int? pageIndex}
      2. +
      ) +
      + + + + + +
      +

      Implementation

      +
      const HomePage({this.pageIndex});
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/HomePage/createState.html b/docs/pages/HomePage/createState.html new file mode 100644 index 000000000..a82236c34 --- /dev/null +++ b/docs/pages/HomePage/createState.html @@ -0,0 +1,169 @@ + + + + + + + + createState method - HomePage class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      createState
      + +
      + +
      + + + + +
      +
      + +

      createState method + Null safety +

      + +
      + +
      +
        +
      1. @override
      2. +
      +
      + +HomePageState +createState() + +
      override
      + +
      + +
      +

      Creates the mutable state for this widget at a given location in the tree.

      +

      Subclasses should override this method to return a newly created +instance of their associated State subclass:

      +
      @override
      +_MyState createState() => _MyState();
      +
      +

      The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

      +
      + + + +
      +

      Implementation

      +
      @override
      +HomePageState createState() => HomePageState();
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/HomePage/pageIndex.html b/docs/pages/HomePage/pageIndex.html new file mode 100644 index 000000000..7d956d206 --- /dev/null +++ b/docs/pages/HomePage/pageIndex.html @@ -0,0 +1,146 @@ + + + + + + + + pageIndex property - HomePage class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      pageIndex
      + +
      + +
      + + + + +
      +
      + +

      pageIndex property + Null safety +

      + +
      + int? + pageIndex +
      final
      + +
      + + + +
      +

      Implementation

      +
      final int? pageIndex;
      +
      +
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/HomePageState-class.html b/docs/pages/HomePageState-class.html new file mode 100644 index 000000000..cf9b64e5e --- /dev/null +++ b/docs/pages/HomePageState-class.html @@ -0,0 +1,491 @@ + + + + + + + + HomePageState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      HomePageState
      + +
      + +
      + + + + +
      +
      + +

      HomePageState class + Null safety + +

      + + + + +
      +
      +
      Inheritance
      +
      + + + + + +
      +
      + +
      +

      Constructors

      + +
      +
      + HomePageState() +
      +
      + +
      +
      +
      + +
      +

      Properties

      + +
      +
      + context + BuildContext + +
      +
      + The location in the tree where this widget builds. [...] +
      read-only, inherited
      + +
      + +
      + hashCode + → int + +
      +
      + The hash code for this object. [...] +
      read-only, inherited
      + +
      + +
      + index + ↔ int + +
      +
      + +
      read / write
      + +
      + +
      + mounted + → bool + +
      +
      + Whether this State object is currently in a tree. [...] +
      read-only, inherited
      + +
      + + +
      + +
      final
      + +
      + +
      + runtimeType + → Type + +
      +
      + A representation of the runtime type of the object. +
      read-only, inherited
      + +
      + +
      + widget + HomePage + +
      +
      + The current configuration. [...] +
      read-only, inherited
      + +
      + +
      +
      + +
      +

      Methods

      +
      +
      + build(BuildContext context) + Widget + + + +
      +
      + Describes the part of the user interface represented by this widget. [...] +
      override
      + +
      + +
      + deactivate() + → void + + + +
      +
      + Called when this object is removed from the tree. [...] +
      @mustCallSuper, @protected, inherited
      + +
      + +
      + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
      +
      + Add additional properties associated with the node. [...] +
      inherited
      + +
      + +
      + didChangeDependencies() + → void + + + +
      +
      + Called when a dependency of this State object changes. [...] +
      @mustCallSuper, @protected, inherited
      + +
      + +
      + didUpdateWidget(covariant HomePage oldWidget) + → void + + + +
      +
      + Called whenever the widget configuration changes. [...] +
      @mustCallSuper, @protected, inherited
      + +
      + +
      + dispose() + → void + + + +
      +
      + Called when this object is removed from the tree permanently. [...] +
      @mustCallSuper, @protected, inherited
      + +
      + +
      + initState() + → void + + + +
      +
      + Called when this object is inserted into the tree. [...] +
      override
      + +
      + +
      + noSuchMethod(Invocation invocation) + → dynamic + + + +
      +
      + Invoked when a non-existent method or property is accessed. [...] +
      inherited
      + +
      + +
      + reassemble() + → void + + + +
      +
      + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
      @mustCallSuper, @protected, inherited
      + +
      + +
      + setState(VoidCallback fn) + → void + + + +
      +
      + Notify the framework that the internal state of this object has changed. [...] +
      @protected, inherited
      + +
      + +
      + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
      +
      + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
      inherited
      + +
      + +
      + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
      +
      + A string representation of this object. [...] +
      inherited
      + +
      + +
      + toStringShort() + → String + + + +
      +
      + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
      inherited
      + +
      + +
      +
      + +
      +

      Operators

      +
      +
      + operator ==(Object other) + → bool + + + +
      +
      + The equality operator. [...] +
      inherited
      + +
      + +
      +
      + + + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/HomePageState/HomePageState.html b/docs/pages/HomePageState/HomePageState.html new file mode 100644 index 000000000..3e0cc1564 --- /dev/null +++ b/docs/pages/HomePageState/HomePageState.html @@ -0,0 +1,145 @@ + + + + + + + + HomePageState constructor - HomePageState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      HomePageState
      + +
      + +
      + + + + +
      +
      + +

      HomePageState constructor + Null safety +

      + +
      + HomePageState() +
      + + + + + + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/HomePageState/build.html b/docs/pages/HomePageState/build.html new file mode 100644 index 000000000..4faecd0bb --- /dev/null +++ b/docs/pages/HomePageState/build.html @@ -0,0 +1,257 @@ + + + + + + + + build method - HomePageState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      build
      + +
      + +
      + + + + +
      +
      + +

      build method + Null safety +

      + +
      + +
      +
        +
      1. @override
      2. +
      +
      + +Widget +build(
      1. BuildContext context
      2. +
      ) + +
      override
      + +
      + +
      +

      Describes the part of the user interface represented by this widget.

      +

      The framework calls this method in a number of different situations. For +example:

      + +

      This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

      +

      The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

      +

      Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

      +

      The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

      +

      Design discussion

      +

      Why is the build method on State, and not StatefulWidget?

      +

      Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

      +

      For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

      +

      Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

      +

      Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

      +
      class MyButton extends StatefulWidget {
      +  ...
      +  final Color color;
      +
      +  @override
      +  Widget build(BuildContext context, MyButtonState state) {
      +    ... () { print("color: $color"); } ...
      +  }
      +}
      +
      +

      For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

      +

      In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

      +
      class MyButtonState extends State<MyButton> {
      +  ...
      +  @override
      +  Widget build(BuildContext context) {
      +    ... () { print("color: ${widget.color}"); } ...
      +  }
      +}
      +
      +

      Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

      +

      See also:

      +
        +
      • StatefulWidget, which contains the discussion on performance considerations.
      • +
      +
      + + + +
      +

      Implementation

      +
      @override
      +Widget build(BuildContext context) => ResponsiveBuilder(
      +	builder: (_, LayoutInfo layout, __) => ResponsiveScaffold.navBar(
      +		navItems: navItems,
      +		navIndex: index,
      +		onNavIndexChanged: (int value) => setState(() => index = value),
      +		drawer: const NavigationDrawer(),
      +		secondaryDrawer: const NavigationDrawer(),
      +	)
      +);
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/HomePageState/index.html b/docs/pages/HomePageState/index.html new file mode 100644 index 000000000..d0758e789 --- /dev/null +++ b/docs/pages/HomePageState/index.html @@ -0,0 +1,152 @@ + + + + + + + + index property - HomePageState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      index
      + +
      + +
      + + + + +
      +
      + +

      index property + Null safety +

      + +
      + int + index +
      read / write
      + +
      + + + +
      +

      Implementation

      +
      late int index;
      +
      +
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/HomePageState/initState.html b/docs/pages/HomePageState/initState.html new file mode 100644 index 000000000..7a0c03c4f --- /dev/null +++ b/docs/pages/HomePageState/initState.html @@ -0,0 +1,189 @@ + + + + + + + + initState method - HomePageState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      initState
      + +
      + +
      + + + + +
      +
      + +

      initState method + Null safety +

      + +
      + +
      +
        +
      1. @override
      2. +
      +
      + +void +initState() + +
      override
      + +
      + +
      +

      Called when this object is inserted into the tree.

      +

      The framework will call this method exactly once for each State object +it creates.

      +

      Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

      +

      If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

      +
        +
      • In initState, subscribe to the object.
      • +
      • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
      • +
      • In dispose, unsubscribe from the object.
      • +
      +

      You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

      +

      If you override this, make sure your method starts with a call to +super.initState().

      +
      + + + +
      +

      Implementation

      +
      @override
      +void initState() {
      +	super.initState();
      +	index = widget.pageIndex ?? 0;
      +}
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/HomePageState/navItems.html b/docs/pages/HomePageState/navItems.html new file mode 100644 index 000000000..d26f34a06 --- /dev/null +++ b/docs/pages/HomePageState/navItems.html @@ -0,0 +1,156 @@ + + + + + + + + navItems property - HomePageState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      navItems
      + +
      + +
      + + + + +
      +
      + +

      navItems property + Null safety +

      + +
      + List<NavigationItem> + navItems +
      final
      + +
      + + + +
      +

      Implementation

      +
      final List<NavigationItem> navItems = [
      +	Dashboard(),
      +	ResponsiveSchedule(),
      +	ResponsiveReminders(),
      +];
      +
      +
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/Login-class.html b/docs/pages/Login-class.html new file mode 100644 index 000000000..469ccc8f7 --- /dev/null +++ b/docs/pages/Login-class.html @@ -0,0 +1,425 @@ + + + + + + + + Login class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      Login
      + +
      + +
      + + + + +
      +
      + +

      Login class + Null safety + +

      + + +
      +

      The login page.

      +

      This widget is only stateful so it doesn't get disposed when +the theme changes, and then we can keep using the BuildContext. +Otherwise, if the theme is changed, the Scaffold cannot be accessed.

      +

      This page is the only page where errors from the backend are expected. +As such, more helpful measures than simply closing the app are needed. +This page holds methods that can safely clean the errors away before +prompting the user to try again.

      +
      + + +
      +
      +
      Inheritance
      +
      + + + + + +
      +
      + +
      +

      Constructors

      + +
      +
      + Login({String destination = Routes.home}) +
      +
      + Builds the login page +
      const
      +
      +
      +
      + +
      +

      Properties

      + +
      +
      + destination + → String + +
      +
      + The page to navigate to after a successful login. +
      final
      + +
      + +
      + hashCode + → int + +
      +
      + The hash code for this object. [...] +
      @nonVirtual, read-only, inherited
      + +
      + +
      + key + Key? + +
      +
      + Controls how one widget replaces another widget in the tree. [...] +
      final, inherited
      + +
      + +
      + runtimeType + → Type + +
      +
      + A representation of the runtime type of the object. +
      read-only, inherited
      + +
      + +
      +
      + +
      +

      Methods

      +
      +
      + createElement() + StatefulElement + + + +
      +
      + Creates a StatefulElement to manage this widget's location in the tree. [...] +
      inherited
      + +
      + +
      + createState() + LoginState + + + +
      +
      + Creates the mutable state for this widget at a given location in the tree. [...] +
      override
      + +
      + +
      + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
      +
      + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
      @protected, inherited
      + +
      + +
      + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
      +
      + Add additional properties associated with the node. [...] +
      inherited
      + +
      + +
      + noSuchMethod(Invocation invocation) + → dynamic + + + +
      +
      + Invoked when a non-existent method or property is accessed. [...] +
      inherited
      + +
      + +
      + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
      +
      + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
      inherited
      + +
      + +
      + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
      +
      + A string representation of this object. [...] +
      inherited
      + +
      + +
      + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
      +
      + Returns a string representation of this node and its descendants. [...] +
      inherited
      + +
      + +
      + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
      +
      + Returns a one-line detailed description of the object. [...] +
      inherited
      + +
      + +
      + toStringShort() + → String + + + +
      +
      + A short, textual description of this widget. +
      inherited
      + +
      + +
      +
      + +
      +

      Operators

      +
      +
      + operator ==(Object other) + → bool + + + +
      +
      + The equality operator. [...] +
      @nonVirtual, inherited
      + +
      + +
      +
      + + + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/Login/Login.html b/docs/pages/Login/Login.html new file mode 100644 index 000000000..8a08b4c86 --- /dev/null +++ b/docs/pages/Login/Login.html @@ -0,0 +1,147 @@ + + + + + + + + Login constructor - Login class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      Login
      + +
      + +
      + + + + +
      +
      + +

      Login constructor + Null safety +

      + +
      const + Login(
      1. {String destination = Routes.home}
      2. +
      ) +
      + + +
      +

      Builds the login page

      +
      + + + +
      +

      Implementation

      +
      const Login({this.destination = Routes.home});
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/Login/createState.html b/docs/pages/Login/createState.html new file mode 100644 index 000000000..a77c6d54c --- /dev/null +++ b/docs/pages/Login/createState.html @@ -0,0 +1,169 @@ + + + + + + + + createState method - Login class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      createState
      + +
      + +
      + + + + +
      +
      + +

      createState method + Null safety +

      + +
      + +
      +
        +
      1. @override
      2. +
      +
      + +LoginState +createState() + +
      override
      + +
      + +
      +

      Creates the mutable state for this widget at a given location in the tree.

      +

      Subclasses should override this method to return a newly created +instance of their associated State subclass:

      +
      @override
      +_MyState createState() => _MyState();
      +
      +

      The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

      +
      + + + +
      +

      Implementation

      +
      @override
      +LoginState createState() => LoginState();
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/Login/destination.html b/docs/pages/Login/destination.html new file mode 100644 index 000000000..5a2b55044 --- /dev/null +++ b/docs/pages/Login/destination.html @@ -0,0 +1,149 @@ + + + + + + + + destination property - Login class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      destination
      + +
      + +
      + + + + +
      +
      + +

      destination property + Null safety +

      + +
      + String + destination +
      final
      + +
      + +
      +

      The page to navigate to after a successful login.

      +
      + + +
      +

      Implementation

      +
      final String destination;
      +
      +
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/LoginState-class.html b/docs/pages/LoginState-class.html new file mode 100644 index 000000000..cc114a012 --- /dev/null +++ b/docs/pages/LoginState-class.html @@ -0,0 +1,525 @@ + + + + + + + + LoginState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      LoginState
      + +
      + +
      + + + + +
      +
      + +

      LoginState class + Null safety + +

      + + +
      +

      A state for the login page.

      +

      This state keeps a reference to the BuildContext.

      +
      + + +
      +
      +
      Inheritance
      +
      + + + + + +
      +
      + +
      +

      Constructors

      + +
      +
      + LoginState() +
      +
      + +
      +
      +
      + +
      +

      Properties

      + +
      +
      + context + BuildContext + +
      +
      + The location in the tree where this widget builds. [...] +
      read-only, inherited
      + +
      + +
      + hashCode + → int + +
      +
      + The hash code for this object. [...] +
      read-only, inherited
      + +
      + +
      + isLoading + ↔ bool + +
      +
      + Whether the page is loading. +
      read / write
      + +
      + +
      + mounted + → bool + +
      +
      + Whether this State object is currently in a tree. [...] +
      read-only, inherited
      + +
      + +
      + runtimeType + → Type + +
      +
      + A representation of the runtime type of the object. +
      read-only, inherited
      + +
      + +
      + widget + Login + +
      +
      + The current configuration. [...] +
      read-only, inherited
      + +
      + +
      +
      + +
      +

      Methods

      +
      +
      + build(BuildContext context) + Widget + + + +
      +
      + Describes the part of the user interface represented by this widget. [...] +
      override
      + +
      + +
      + deactivate() + → void + + + +
      +
      + Called when this object is removed from the tree. [...] +
      @mustCallSuper, @protected, inherited
      + +
      + +
      + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
      +
      + Add additional properties associated with the node. [...] +
      inherited
      + +
      + +
      + didChangeDependencies() + → void + + + +
      +
      + Called when a dependency of this State object changes. [...] +
      @mustCallSuper, @protected, inherited
      + +
      + +
      + didUpdateWidget(covariant Login oldWidget) + → void + + + +
      +
      + Called whenever the widget configuration changes. [...] +
      @mustCallSuper, @protected, inherited
      + +
      + +
      + dispose() + → void + + + +
      +
      + Called when this object is removed from the tree permanently. [...] +
      @mustCallSuper, @protected, inherited
      + +
      + +
      + initState() + → void + + + +
      +
      + Called when this object is inserted into the tree. [...] +
      override
      + +
      + +
      + noSuchMethod(Invocation invocation) + → dynamic + + + +
      +
      + Invoked when a non-existent method or property is accessed. [...] +
      inherited
      + +
      + +
      + onError(dynamic error, StackTrace stack) + → Future<void> + + + +
      +
      + A function that runs whenever there is an error. [...] + + +
      + +
      + reassemble() + → void + + + +
      +
      + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
      @mustCallSuper, @protected, inherited
      + +
      + +
      + safely({required Future<void> function(), required void onSuccess(), required BuildContext scaffoldContext}) + → Future<void> + + + +
      +
      + Safely execute a function. [...] + + +
      + +
      + setState(VoidCallback fn) + → void + + + +
      +
      + Notify the framework that the internal state of this object has changed. [...] +
      @protected, inherited
      + +
      + +
      + signIn(BuildContext scaffoldContext) + → Future<void> + + + +
      +
      + Signs the user in. [...] + + +
      + +
      + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
      +
      + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
      inherited
      + +
      + +
      + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
      +
      + A string representation of this object. [...] +
      inherited
      + +
      + +
      + toStringShort() + → String + + + +
      +
      + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
      inherited
      + +
      + +
      +
      + +
      +

      Operators

      +
      +
      + operator ==(Object other) + → bool + + + +
      +
      + The equality operator. [...] +
      inherited
      + +
      + +
      +
      + + + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/LoginState/LoginState.html b/docs/pages/LoginState/LoginState.html new file mode 100644 index 000000000..5520249b4 --- /dev/null +++ b/docs/pages/LoginState/LoginState.html @@ -0,0 +1,147 @@ + + + + + + + + LoginState constructor - LoginState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      LoginState
      + +
      + +
      + + + + +
      +
      + +

      LoginState constructor + Null safety +

      + +
      + LoginState() +
      + + + + + + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/LoginState/build.html b/docs/pages/LoginState/build.html new file mode 100644 index 000000000..a07e575b3 --- /dev/null +++ b/docs/pages/LoginState/build.html @@ -0,0 +1,283 @@ + + + + + + + + build method - LoginState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      build
      + +
      + +
      + + + + +
      +
      + +

      build method + Null safety +

      + +
      + +
      +
        +
      1. @override
      2. +
      +
      + +Widget +build(
      1. BuildContext context
      2. +
      ) + +
      override
      + +
      + +
      +

      Describes the part of the user interface represented by this widget.

      +

      The framework calls this method in a number of different situations. For +example:

      + +

      This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

      +

      The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

      +

      Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

      +

      The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

      +

      Design discussion

      +

      Why is the build method on State, and not StatefulWidget?

      +

      Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

      +

      For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

      +

      Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

      +

      Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

      +
      class MyButton extends StatefulWidget {
      +  ...
      +  final Color color;
      +
      +  @override
      +  Widget build(BuildContext context, MyButtonState state) {
      +    ... () { print("color: $color"); } ...
      +  }
      +}
      +
      +

      For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

      +

      In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

      +
      class MyButtonState extends State<MyButton> {
      +  ...
      +  @override
      +  Widget build(BuildContext context) {
      +    ... () { print("color: ${widget.color}"); } ...
      +  }
      +}
      +
      +

      Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

      +

      See also:

      +
        +
      • StatefulWidget, which contains the discussion on performance considerations.
      • +
      +
      + + + +
      +

      Implementation

      +
      @override
      +Widget build (BuildContext context) => Scaffold (
      +	appBar: AppBar (
      +		title: const Text ("Login"),
      +		actions: [
      +			BrightnessChanger.iconButton(),
      +		],
      +	),
      +	body: Center(
      +		child: Column(
      +			children: [
      +				if (isLoading) const LinearProgressIndicator(minHeight: 8),
      +				const Spacer(flex: 2),
      +				SizedBox(
      +					height: 300,
      +					width: 300,
      +					child: ThemeChanger.of(context).brightness == Brightness.light
      +						? ClipRRect(
      +							borderRadius: BorderRadius.circular(20),
      +							child: RamazLogos.teal
      +						) : RamazLogos.ramSquareWords
      +				),
      +				// const SizedBox(height: 100),
      +				const Spacer(flex: 1),
      +				TextButton.icon(
      +					icon: Logos.google,
      +					label: const Text("Sign in with Google"),
      +					onPressed: () => signIn(context),
      +				),
      +				const Spacer(flex: 2),
      +			]
      +		)
      +	)
      +);
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/LoginState/initState.html b/docs/pages/LoginState/initState.html new file mode 100644 index 000000000..8e43b00e1 --- /dev/null +++ b/docs/pages/LoginState/initState.html @@ -0,0 +1,194 @@ + + + + + + + + initState method - LoginState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      initState
      + +
      + +
      + + + + +
      +
      + +

      initState method + Null safety +

      + +
      + +
      +
        +
      1. @override
      2. +
      +
      + +void +initState() + +
      override
      + +
      + +
      +

      Called when this object is inserted into the tree.

      +

      The framework will call this method exactly once for each State object +it creates.

      +

      Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

      +

      If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

      +
        +
      • In initState, subscribe to the object.
      • +
      • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
      • +
      • In dispose, unsubscribe from the object.
      • +
      +

      You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

      +

      If you override this, make sure your method starts with a call to +super.initState().

      +
      + + + +
      +

      Implementation

      +
      @override
      +void initState() {
      +	super.initState();
      +	// "To log in, one must first log out"
      +	// -- Levi Lesches, class of '21, creator of this app, 2019
      +	Services.instance.database.signOut();
      +	Models.instance.dispose();
      +}
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/LoginState/isLoading.html b/docs/pages/LoginState/isLoading.html new file mode 100644 index 000000000..7914e99d7 --- /dev/null +++ b/docs/pages/LoginState/isLoading.html @@ -0,0 +1,157 @@ + + + + + + + + isLoading property - LoginState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      isLoading
      + +
      + +
      + + + + +
      +
      + +

      isLoading property + Null safety +

      + +
      + bool + isLoading +
      read / write
      + +
      + +
      +

      Whether the page is loading.

      +
      + + +
      +

      Implementation

      +
      bool isLoading = false;
      +
      +
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/LoginState/onError.html b/docs/pages/LoginState/onError.html new file mode 100644 index 000000000..a6a44760a --- /dev/null +++ b/docs/pages/LoginState/onError.html @@ -0,0 +1,199 @@ + + + + + + + + onError method - LoginState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      onError
      + +
      + +
      + + + + +
      +
      + +

      onError method + Null safety +

      + +
      + + +Future<void> +onError(
      1. dynamic error,
      2. +
      3. StackTrace stack
      4. +
      ) + + + +
      + +
      +

      A function that runs whenever there is an error.

      +

      Unlike other screens, this screen can expect an error to be thrown by the +backend, so special care must be taken to present these errors in a +user-friendly way, while at the same time making sure they don't prevent +the user from logging in.

      +
      + + + +
      +

      Implementation

      +
      Future<void> onError(dynamic error, StackTrace stack) async {
      +	setState(() => isLoading = false);
      +	final Crashlytics crashlytics = Services.instance.crashlytics;
      +	await crashlytics.log("Login failed");
      +	final String? email = Auth.email;
      +	if (email != null) {
      +		await crashlytics.setEmail(email);
      +	}
      +	// ignore: unawaited_futures
      +	showDialog (
      +		context: context,
      +		builder: (dialogContext) => AlertDialog (
      +			title: const Text ("Cannot connect"),
      +			content: const Text (
      +				"Due to technical difficulties, your account cannot be accessed.\n\n"
      +				"If the problem persists, please contact Levi Lesches "
      +				"(class of '21) for help"
      +			),
      +			actions: [
      +				TextButton(
      +					onPressed: () => Navigator.of(dialogContext).pop(),
      +					child: const Text ("Cancel"),
      +				),
      +				ElevatedButton(
      +					onPressed: () => launch("mailto:leschesl@ramaz.org"),
      +					child: const Text ("leschesl@ramaz.org"),
      +				)
      +			]
      +		)
      +	).then((_) async {
      +		await Services.instance.database.signOut();
      +		Models.instance.dispose();
      +	});
      +	await crashlytics.recordError(error, stack);
      +}
      +
      + + +
      + + + +
      + +
      + + ramaz + 2.1.1+1 + + + +
      + + + + + + + + + + + diff --git a/docs/pages/LoginState/safely.html b/docs/pages/LoginState/safely.html new file mode 100644 index 000000000..d9dc6160c --- /dev/null +++ b/docs/pages/LoginState/safely.html @@ -0,0 +1,188 @@ + + + + + + + + safely method - LoginState class - pages library - Dart API + + + + + + + + + + + + + + + + +
      + +
      + + +
      safely
      + +
      + +
      + + + + +
      +
      + +

      safely method + Null safety +

      + +
      + + +Future<void> +safely(
      1. {required Future<void> function(
          +),
        1. +
        2. required void onSuccess(
            +),
          1. +
          2. required BuildContext scaffoldContext}
          3. +
          ) + + + +
          + +
          +

          Safely execute a function.

          +

          This function holds all the try-catch logic needed to properly debug +errors. If a network error occurs, a simple SnackBar is shown. +Otherwise, the error pop-up is shown (see onError).

          +
          + + + +
          +

          Implementation

          +
          Future<void> safely({
          +	required Future<void> Function() function,
          +	required void Function() onSuccess,
          +	required BuildContext scaffoldContext,
          +}) async {
          +	try {await function();}
          +	on PlatformException catch (error, stack) {
          +		if (error.code == "ERROR_NETWORK_REQUEST_FAILED") {
          +			ScaffoldMessenger.of(scaffoldContext).showSnackBar(
          +				const SnackBar (content: Text ("No Internet")),
          +			);
          +			return setState(() => isLoading = false);
          +		} else {
          +			return onError(error, stack);
          +		}
          +	} on NoAccountException {
          +		return setState(() => isLoading = false);
          +	} catch (error, stack) {  // ignore: avoid_catches_without_on_clauses
          +		return onError(error, stack);
          +	}
          +	onSuccess();
          +}
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/LoginState/signIn.html b/docs/pages/LoginState/signIn.html new file mode 100644 index 000000000..25839e7dc --- /dev/null +++ b/docs/pages/LoginState/signIn.html @@ -0,0 +1,172 @@ + + + + + + + + signIn method - LoginState class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          signIn
          + +
          + +
          + + + + +
          +
          + +

          signIn method + Null safety +

          + +
          + + +Future<void> +signIn(
          1. BuildContext scaffoldContext
          2. +
          ) + + + +
          + +
          +

          Signs the user in.

          +

          Calls Services.signIn and Models.init.

          +
          + + + +
          +

          Implementation

          +
          Future<void> signIn(BuildContext scaffoldContext) => safely(
          +	scaffoldContext: scaffoldContext,
          +	function: () async {
          +		setState(() => isLoading = true);
          +		await Services.instance.signIn();
          +		await Models.instance.init();
          +	},
          +	onSuccess: () {
          +		setState(() => isLoading = false);
          +		Navigator.of(context).pushReplacementNamed(widget.destination);
          +	},
          +);
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/NavigationDrawer-class.html b/docs/pages/NavigationDrawer-class.html new file mode 100644 index 000000000..a606ded46 --- /dev/null +++ b/docs/pages/NavigationDrawer-class.html @@ -0,0 +1,464 @@ + + + + + + + + NavigationDrawer class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          NavigationDrawer
          + +
          + +
          + + + + +
          +
          + +

          NavigationDrawer class + Null safety + +

          + + +
          +

          A drawer to show throughout the app.

          +
          + + +
          +
          +
          Inheritance
          +
          + + + + + +
          +
          + +
          +

          Constructors

          + +
          + +
          + +
          const
          +
          +
          +
          + +
          +

          Properties

          + +
          +
          + hashCode + → int + +
          +
          + The hash code for this object. [...] +
          @nonVirtual, read-only, inherited
          + +
          + +
          + isScheduleAdmin + → bool + +
          +
          + +
          read-only
          + +
          + +
          + isSportsAdmin + → bool + +
          +
          + +
          read-only
          + +
          + +
          + key + Key? + +
          +
          + Controls how one widget replaces another widget in the tree. [...] +
          final, inherited
          + +
          + +
          + runtimeType + → Type + +
          +
          + A representation of the runtime type of the object. +
          read-only, inherited
          + +
          + +
          +
          + +
          +

          Methods

          +
          +
          + build(BuildContext context) + Widget + + + +
          +
          + Describes the part of the user interface represented by this widget. [...] +
          override
          + +
          + +
          + createElement() + StatelessElement + + + +
          +
          + Creates a StatelessElement to manage this widget's location in the tree. [...] +
          inherited
          + +
          + +
          + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
          +
          + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
          @protected, inherited
          + +
          + +
          + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
          +
          + Add additional properties associated with the node. [...] +
          inherited
          + +
          + +
          + getRouteName(BuildContext context) + → String? + + + +
          +
          + + + +
          + +
          + noSuchMethod(Invocation invocation) + → dynamic + + + +
          +
          + Invoked when a non-existent method or property is accessed. [...] +
          inherited
          + +
          + +
          + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
          +
          + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
          inherited
          + +
          + +
          + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
          +
          + A string representation of this object. [...] +
          inherited
          + +
          + +
          + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a string representation of this node and its descendants. [...] +
          inherited
          + +
          + +
          + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a one-line detailed description of the object. [...] +
          inherited
          + +
          + +
          + toStringShort() + → String + + + +
          +
          + A short, textual description of this widget. +
          inherited
          + +
          + +
          +
          + +
          +

          Operators

          +
          +
          + operator ==(Object other) + → bool + + + +
          +
          + The equality operator. [...] +
          @nonVirtual, inherited
          + +
          + +
          +
          + + +
          +

          Static Methods

          +
          +
          + pushRoute(BuildContext context, String name) + → Future<void> Function() + + + +
          +
          + Uses the navigator to launch a page by name. + + +
          + +
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/NavigationDrawer/NavigationDrawer.html b/docs/pages/NavigationDrawer/NavigationDrawer.html new file mode 100644 index 000000000..88cea2dae --- /dev/null +++ b/docs/pages/NavigationDrawer/NavigationDrawer.html @@ -0,0 +1,147 @@ + + + + + + + + NavigationDrawer constructor - NavigationDrawer class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          NavigationDrawer
          + +
          + +
          + + + + +
          +
          + +

          NavigationDrawer constructor + Null safety +

          + +
          const + NavigationDrawer() +
          + + + + + +
          +

          Implementation

          +
          const NavigationDrawer();
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/NavigationDrawer/build.html b/docs/pages/NavigationDrawer/build.html new file mode 100644 index 000000000..6f572041c --- /dev/null +++ b/docs/pages/NavigationDrawer/build.html @@ -0,0 +1,314 @@ + + + + + + + + build method - NavigationDrawer class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          build
          + +
          + +
          + + + + +
          +
          + +

          build method + Null safety +

          + +
          + +
          +
            +
          1. @override
          2. +
          +
          + +Widget +build(
          1. BuildContext context
          2. +
          ) + +
          override
          + +
          + +
          +

          Describes the part of the user interface represented by this widget.

          +

          The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

          +

          The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

          +

          Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

          +

          The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

          +

          The implementation of this method must only depend on:

          + +

          If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

          +

          See also:

          +
            +
          • StatelessWidget, which contains the discussion on performance considerations.
          • +
          +
          + + + +
          +

          Implementation

          +
          @override
          +Widget build (BuildContext context) => ResponsiveBuilder(
          +	builder: (_, LayoutInfo layout, __) => Drawer (
          +		child: LayoutBuilder(
          +			builder: (
          +				BuildContext context,
          +				BoxConstraints constraints
          +			) => SingleChildScrollView(
          +				child: ConstrainedBox(
          +					constraints: BoxConstraints(
          +						minHeight: constraints.maxHeight,
          +					),
          +					child: IntrinsicHeight(
          +						child: Column(
          +							children: [
          +								DrawerHeader(child: RamazLogos.ramSquare),
          +								if (layout.isDesktop || getRouteName(context) != Routes.home)
          +									ListTile (
          +										title: const Text ("Dashboard"),
          +										leading: Icon (Icons.dashboard),
          +										onTap: pushRoute(context, Routes.home),
          +									),
          +								if (layout.isDesktop || getRouteName(context) != Routes.schedule)
          +									ListTile (
          +										title: const Text ("Schedule"),
          +										leading: Icon (Icons.schedule),
          +										onTap: pushRoute(context, Routes.schedule),
          +									),
          +								if (layout.isDesktop || getRouteName(context) != Routes.reminders)
          +									ListTile (
          +										title: const Text ("Reminders"),
          +										leading: Icon (Icons.notifications),
          +										onTap: pushRoute(context, Routes.reminders),
          +									),
          +								// ListTile (
          +								// 	title: Text ("Sports"),
          +								// 	leading: Icon (Icons.sports),
          +								// 	onTap: pushRoute(context, Routes.sports),
          +								// ),
          +								if (Models.instance.user.isAdmin) ExpansionTile(
          +									leading: Icon(Icons.admin_panel_settings),
          +									title: const Text("Admin options"),
          +									children: [
          +										if (isScheduleAdmin) ...[
          +											ListTile(
          +												title: Text("Calendar"),
          +												leading: Icon(Icons.calendar_today),
          +												onTap: pushRoute(context, Routes.calendar),
          +											),
          +											ListTile(
          +												title: Text("Custom schedules"),
          +												leading: Icon(Icons.schedule),
          +												onTap: pushRoute(context, Routes.schedules),
          +											),
          +										],
          +										if (isSportsAdmin)
          +											ListTile(
          +												title: Text("Sports"),
          +												leading: Icon(Icons.sports),
          +												onTap: pushRoute(context, Routes.sports),
          +											)
          +									]
          +								),
          +								BrightnessChanger.dropdown(),
          +								ListTile (
          +									title: const Text ("Logout"),
          +									leading: Icon (Icons.lock),
          +									onTap: pushRoute(context, Routes.login)
          +								),
          +								ListTile (
          +									title: const Text ("Send Feedback"),
          +									leading: Icon (Icons.feedback),
          +									onTap: pushRoute(context, Routes.feedback),
          +								),
          +								const AboutListTile (
          +									icon: Icon (Icons.info),
          +									// ignore: sort_child_properties_last
          +									child: Text ("About"),
          +									applicationName: "Ramaz Student Life",
          +									applicationVersion: "0.5",
          +									applicationIcon: Logos.ramazIcon,
          +									aboutBoxChildren: [
          +										Text (
          +											"Created by the Ramaz Coding Club (Levi Lesches and Sophia "
          +											"Kremer) with the support of the Ramaz administration. "
          +										),
          +										SizedBox (height: 20),
          +										Text (
          +											"A special thanks to Mr. Vovsha for helping us go from idea to "
          +											"reality."
          +										),
          +									]
          +								),
          +								const Spacer(),
          +								Align (
          +									alignment: Alignment.bottomCenter,
          +									child: Column (
          +										children: [
          +											const Divider(),
          +											SingleChildScrollView (
          +												scrollDirection: Axis.horizontal,
          +												child: Row (
          +													children: const [
          +														Logos.ramazIcon,
          +														Logos.outlook,
          +														Logos.schoology,
          +														Logos.drive,
          +														Logos.seniorSystems
          +													]
          +												)
          +											)
          +										]
          +									)
          +								)
          +							]
          +						)
          +					)
          +				)
          +			)
          +		)
          +	)
          +);
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/NavigationDrawer/getRouteName.html b/docs/pages/NavigationDrawer/getRouteName.html new file mode 100644 index 000000000..cd22ffdb9 --- /dev/null +++ b/docs/pages/NavigationDrawer/getRouteName.html @@ -0,0 +1,154 @@ + + + + + + + + getRouteName method - NavigationDrawer class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          getRouteName
          + +
          + +
          + + + + +
          +
          + +

          getRouteName method + Null safety +

          + +
          + + +String? +getRouteName(
          1. BuildContext context
          2. +
          ) + + + +
          + + + + +
          +

          Implementation

          +
          String? getRouteName(BuildContext context) =>
          +	ModalRoute.of(context)!.settings.name;
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/NavigationDrawer/isScheduleAdmin.html b/docs/pages/NavigationDrawer/isScheduleAdmin.html new file mode 100644 index 000000000..8ac256821 --- /dev/null +++ b/docs/pages/NavigationDrawer/isScheduleAdmin.html @@ -0,0 +1,156 @@ + + + + + + + + isScheduleAdmin property - NavigationDrawer class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          isScheduleAdmin
          + +
          + +
          + + + + +
          +
          + +

          isScheduleAdmin property + Null safety +

          + + + +
          + +
          + bool + isScheduleAdmin + + +
          + + + + +
          +

          Implementation

          +
          bool get isScheduleAdmin => Models.instance.user
          +	.adminScopes!.contains(AdminScope.calendar);
          +
          + +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/NavigationDrawer/isSportsAdmin.html b/docs/pages/NavigationDrawer/isSportsAdmin.html new file mode 100644 index 000000000..ec903ed7e --- /dev/null +++ b/docs/pages/NavigationDrawer/isSportsAdmin.html @@ -0,0 +1,156 @@ + + + + + + + + isSportsAdmin property - NavigationDrawer class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          isSportsAdmin
          + +
          + +
          + + + + +
          +
          + +

          isSportsAdmin property + Null safety +

          + + + +
          + +
          + bool + isSportsAdmin + + +
          + + + + +
          +

          Implementation

          +
          bool get isSportsAdmin => Models.instance.user
          +	.adminScopes!.contains(AdminScope.sports);
          +
          + +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/NavigationDrawer/pushRoute.html b/docs/pages/NavigationDrawer/pushRoute.html new file mode 100644 index 000000000..d9b5c5a47 --- /dev/null +++ b/docs/pages/NavigationDrawer/pushRoute.html @@ -0,0 +1,158 @@ + + + + + + + + pushRoute method - NavigationDrawer class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          pushRoute
          + +
          + +
          + + + + +
          +
          + +

          pushRoute method + Null safety +

          + +
          + + +Future<void> Function() +pushRoute(
          1. BuildContext context,
          2. +
          3. String name
          4. +
          ) + + + +
          + +
          +

          Uses the navigator to launch a page by name.

          +
          + + + +
          +

          Implementation

          +
          static Future<void> Function() pushRoute(BuildContext context, String name) =>
          +	() => Navigator.of(context).pushReplacementNamed(name);
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/OldCalendarWidget-class.html b/docs/pages/OldCalendarWidget-class.html new file mode 100644 index 000000000..7539dbb92 --- /dev/null +++ b/docs/pages/OldCalendarWidget-class.html @@ -0,0 +1,411 @@ + + + + + + + + OldCalendarWidget class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          OldCalendarWidget
          + +
          + +
          + + + + +
          +
          + +

          OldCalendarWidget class + Null safety + +

          + + +
          +

          A widget to represent a calendar icon.

          +

          Due to "budget cuts", poor Levi Lesches ('21) had to recreate the calendar +icon from scratch, instead of Googling for a png. What a loser.

          +

          This widget is not used, rather left here as a token of appreciation for +all the time Levi has wasted designing (and scrapping said designs) +the UI and backend code for this app. That dude deserves a raise.

          +
          + + +
          +
          +
          Inheritance
          +
          + + + + + +
          +
          + +
          +

          Constructors

          + +
          +
          + OldCalendarWidget() +
          +
          + Creates a widget to look like the calendar icon. +
          const
          +
          +
          +
          + +
          +

          Properties

          + +
          +
          + hashCode + → int + +
          +
          + The hash code for this object. [...] +
          @nonVirtual, read-only, inherited
          + +
          + +
          + key + Key? + +
          +
          + Controls how one widget replaces another widget in the tree. [...] +
          final, inherited
          + +
          + +
          + runtimeType + → Type + +
          +
          + A representation of the runtime type of the object. +
          read-only, inherited
          + +
          + +
          +
          + +
          +

          Methods

          +
          +
          + build(BuildContext context) + Widget + + + +
          +
          + Describes the part of the user interface represented by this widget. [...] +
          override
          + +
          + +
          + createElement() + StatelessElement + + + +
          +
          + Creates a StatelessElement to manage this widget's location in the tree. [...] +
          inherited
          + +
          + +
          + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
          +
          + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
          @protected, inherited
          + +
          + +
          + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
          +
          + Add additional properties associated with the node. [...] +
          inherited
          + +
          + +
          + noSuchMethod(Invocation invocation) + → dynamic + + + +
          +
          + Invoked when a non-existent method or property is accessed. [...] +
          inherited
          + +
          + +
          + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
          +
          + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
          inherited
          + +
          + +
          + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
          +
          + A string representation of this object. [...] +
          inherited
          + +
          + +
          + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a string representation of this node and its descendants. [...] +
          inherited
          + +
          + +
          + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a one-line detailed description of the object. [...] +
          inherited
          + +
          + +
          + toStringShort() + → String + + + +
          +
          + A short, textual description of this widget. +
          inherited
          + +
          + +
          +
          + +
          +

          Operators

          +
          +
          + operator ==(Object other) + → bool + + + +
          +
          + The equality operator. [...] +
          @nonVirtual, inherited
          + +
          + +
          +
          + + + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/OldCalendarWidget/OldCalendarWidget.html b/docs/pages/OldCalendarWidget/OldCalendarWidget.html new file mode 100644 index 000000000..b23f4680b --- /dev/null +++ b/docs/pages/OldCalendarWidget/OldCalendarWidget.html @@ -0,0 +1,145 @@ + + + + + + + + OldCalendarWidget constructor - OldCalendarWidget class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          OldCalendarWidget
          + +
          + +
          + + + + +
          +
          + +

          OldCalendarWidget constructor + Null safety +

          + +
          const + OldCalendarWidget() +
          + + +
          +

          Creates a widget to look like the calendar icon.

          +
          + + + +
          +

          Implementation

          +
          const OldCalendarWidget();
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/OldCalendarWidget/build.html b/docs/pages/OldCalendarWidget/build.html new file mode 100644 index 000000000..ed920d69c --- /dev/null +++ b/docs/pages/OldCalendarWidget/build.html @@ -0,0 +1,221 @@ + + + + + + + + build method - OldCalendarWidget class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          build
          + +
          + +
          + + + + +
          +
          + +

          build method + Null safety +

          + +
          + +
          +
            +
          1. @override
          2. +
          +
          + +Widget +build(
          1. BuildContext context
          2. +
          ) + +
          override
          + +
          + +
          +

          Describes the part of the user interface represented by this widget.

          +

          The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

          +

          The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

          +

          Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

          +

          The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

          +

          The implementation of this method must only depend on:

          + +

          If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

          +

          See also:

          +
            +
          • StatelessWidget, which contains the discussion on performance considerations.
          • +
          +
          + + + +
          +

          Implementation

          +
          @override
          +Widget build(BuildContext context) => InkWell(
          +	onTap: () => Navigator.pushReplacementNamed(context, Routes.calendar),
          +	child: Container(
          +	    decoration: BoxDecoration(border: Border.all()),
          +	    padding: const EdgeInsets.symmetric(horizontal: 25),
          +	    child: Column(
          +	      mainAxisAlignment: MainAxisAlignment.center,
          +	      crossAxisAlignment: CrossAxisAlignment.center,
          +	      children: [
          +	        const Spacer(flex: 1),
          +	        Expanded(
          +	          flex: 1,
          +	          child: Container(
          +	            decoration: BoxDecoration(border: Border.all()),
          +	            child: const Center(
          +	              child: Text("Monday")
          +	            ),
          +	          ),
          +	        ),
          +	        Expanded(
          +	          flex: 4,
          +	          child: Container(
          +	            decoration: BoxDecoration(border: Border.all()),
          +	            child: const Center(
          +	              child: Text("01", textScaleFactor: 2),
          +	            )
          +	          )
          +	        ),
          +	        const Spacer(flex: 1),
          +	      ]
          +	    )
          +  )
          +);
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilder-class.html b/docs/pages/ReminderBuilder-class.html new file mode 100644 index 000000000..29ce0c314 --- /dev/null +++ b/docs/pages/ReminderBuilder-class.html @@ -0,0 +1,454 @@ + + + + + + + + ReminderBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          ReminderBuilder
          + +
          + +
          + + + + +
          +
          + +

          ReminderBuilder class + Null safety + +

          + + +
          +

          A widget to help the user create a Reminder.

          +

          This widget must be a StatefulWidget in order to avoid recreating a +TextEditingController every time the widget tree is rebuilt.

          +
          + + +
          +
          +
          Inheritance
          +
          + + + + + +
          +
          + +
          +

          Constructors

          + +
          +
          + ReminderBuilder(Reminder? reminder) +
          +
          + Creates a widget to create or modify a Reminder. +
          const
          +
          +
          +
          + +
          +

          Properties

          + +
          +
          + hashCode + → int + +
          +
          + The hash code for this object. [...] +
          @nonVirtual, read-only, inherited
          + +
          + +
          + key + Key? + +
          +
          + Controls how one widget replaces another widget in the tree. [...] +
          final, inherited
          + +
          + +
          + reminder + Reminder? + +
          +
          + A reminder to modify. [...] +
          final
          + +
          + +
          + runtimeType + → Type + +
          +
          + A representation of the runtime type of the object. +
          read-only, inherited
          + +
          + +
          +
          + +
          +

          Methods

          +
          +
          + createElement() + StatefulElement + + + +
          +
          + Creates a StatefulElement to manage this widget's location in the tree. [...] +
          inherited
          + +
          + +
          + createState() + ReminderBuilderState + + + +
          +
          + Creates the mutable state for this widget at a given location in the tree. [...] +
          override
          + +
          + +
          + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
          +
          + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
          @protected, inherited
          + +
          + +
          + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
          +
          + Add additional properties associated with the node. [...] +
          inherited
          + +
          + +
          + noSuchMethod(Invocation invocation) + → dynamic + + + +
          +
          + Invoked when a non-existent method or property is accessed. [...] +
          inherited
          + +
          + +
          + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
          +
          + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
          inherited
          + +
          + +
          + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
          +
          + A string representation of this object. [...] +
          inherited
          + +
          + +
          + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a string representation of this node and its descendants. [...] +
          inherited
          + +
          + +
          + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a one-line detailed description of the object. [...] +
          inherited
          + +
          + +
          + toStringShort() + → String + + + +
          +
          + A short, textual description of this widget. +
          inherited
          + +
          + +
          +
          + +
          +

          Operators

          +
          +
          + operator ==(Object other) + → bool + + + +
          +
          + The equality operator. [...] +
          @nonVirtual, inherited
          + +
          + +
          +
          + + +
          +

          Static Methods

          +
          +
          + buildReminder(BuildContext context, [Reminder? reminder]) + → Future<Reminder?> + + + +
          +
          + Opens a ReminderBuilder pop-up to create or modify a Reminder. + + +
          + +
          + trimString(String text, int length) + → String + + + +
          +
          + Trims a string down to a certain length. [...] + + +
          + +
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilder/ReminderBuilder.html b/docs/pages/ReminderBuilder/ReminderBuilder.html new file mode 100644 index 000000000..493262ada --- /dev/null +++ b/docs/pages/ReminderBuilder/ReminderBuilder.html @@ -0,0 +1,150 @@ + + + + + + + + ReminderBuilder constructor - ReminderBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          ReminderBuilder
          + +
          + +
          + + + + +
          +
          + +

          ReminderBuilder constructor + Null safety +

          + +
          const + ReminderBuilder(
          1. Reminder? reminder
          2. +
          ) +
          + + +
          +

          Creates a widget to create or modify a Reminder.

          +
          + + + +
          +

          Implementation

          +
          const ReminderBuilder(this.reminder);
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilder/buildReminder.html b/docs/pages/ReminderBuilder/buildReminder.html new file mode 100644 index 000000000..24c7ffa50 --- /dev/null +++ b/docs/pages/ReminderBuilder/buildReminder.html @@ -0,0 +1,161 @@ + + + + + + + + buildReminder method - ReminderBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          buildReminder
          + +
          + +
          + + + + +
          +
          + +

          buildReminder method + Null safety +

          + +
          + + +Future<Reminder?> +buildReminder(
          1. BuildContext context,
          2. +
          3. [Reminder? reminder]
          4. +
          ) + + + +
          + +
          +

          Opens a ReminderBuilder pop-up to create or modify a Reminder.

          +
          + + + +
          +

          Implementation

          +
          static Future<Reminder?> buildReminder(
          +	BuildContext context, [Reminder? reminder]
          +) => showDialog(
          +	context: context,
          +	builder: (_) => ReminderBuilder(reminder),
          +);
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilder/createState.html b/docs/pages/ReminderBuilder/createState.html new file mode 100644 index 000000000..421240af0 --- /dev/null +++ b/docs/pages/ReminderBuilder/createState.html @@ -0,0 +1,172 @@ + + + + + + + + createState method - ReminderBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          createState
          + +
          + +
          + + + + +
          +
          + +

          createState method + Null safety +

          + +
          + +
          +
            +
          1. @override
          2. +
          +
          + +ReminderBuilderState +createState() + +
          override
          + +
          + +
          +

          Creates the mutable state for this widget at a given location in the tree.

          +

          Subclasses should override this method to return a newly created +instance of their associated State subclass:

          +
          @override
          +_MyState createState() => _MyState();
          +
          +

          The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

          +
          + + + +
          +

          Implementation

          +
          @override
          +ReminderBuilderState createState() => ReminderBuilderState();
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilder/reminder.html b/docs/pages/ReminderBuilder/reminder.html new file mode 100644 index 000000000..689b1d76b --- /dev/null +++ b/docs/pages/ReminderBuilder/reminder.html @@ -0,0 +1,154 @@ + + + + + + + + reminder property - ReminderBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          reminder
          + +
          + +
          + + + + +
          +
          + +

          reminder property + Null safety +

          + +
          + Reminder? + reminder +
          final
          + +
          + +
          +

          A reminder to modify.

          +

          A ReminderBuilder can either create a new Reminder from scratch or +modify an existing reminder (auto-fill its properties).

          +
          + + +
          +

          Implementation

          +
          final Reminder? reminder;
          +
          +
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilder/trimString.html b/docs/pages/ReminderBuilder/trimString.html new file mode 100644 index 000000000..bf4db75b8 --- /dev/null +++ b/docs/pages/ReminderBuilder/trimString.html @@ -0,0 +1,159 @@ + + + + + + + + trimString method - ReminderBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          trimString
          + +
          + +
          + + + + +
          +
          + +

          trimString method + Null safety +

          + +
          + + +String +trimString(
          1. String text,
          2. +
          3. int length
          4. +
          ) + + + +
          + +
          +

          Trims a string down to a certain length.

          +

          This function is needed since calling String.substring with an end +argument greater than the length of the string will throw an error.

          +
          + + + +
          +

          Implementation

          +
          static String trimString (String text, int length) => text.length > length
          +	? text.substring(0, length) : text;
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilderState-class.html b/docs/pages/ReminderBuilderState-class.html new file mode 100644 index 000000000..f37e25338 --- /dev/null +++ b/docs/pages/ReminderBuilderState-class.html @@ -0,0 +1,484 @@ + + + + + + + + ReminderBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          ReminderBuilderState
          + +
          + +
          + + + + +
          +
          + +

          ReminderBuilderState class + Null safety + +

          + + +
          +

          A state for a ReminderBuilder.

          +

          State.initState is needed to instantiate a TextEditingController +exactly once.

          +
          + + +
          +
          +
          Inheritance
          +
          + + + + + +
          +
          + +
          +

          Constructors

          + +
          +
          + ReminderBuilderState() +
          +
          + +
          +
          +
          + +
          +

          Properties

          + +
          +
          + context + BuildContext + +
          +
          + The location in the tree where this widget builds. [...] +
          read-only, inherited
          + +
          + +
          + controller + TextEditingController + +
          +
          + The text controller to hold the message of the Reminder. +
          final
          + +
          + +
          + hashCode + → int + +
          +
          + The hash code for this object. [...] +
          read-only, inherited
          + +
          + +
          + mounted + → bool + +
          +
          + Whether this State object is currently in a tree. [...] +
          read-only, inherited
          + +
          + +
          + runtimeType + → Type + +
          +
          + A representation of the runtime type of the object. +
          read-only, inherited
          + +
          + +
          + widget + ReminderBuilder + +
          +
          + The current configuration. [...] +
          read-only, inherited
          + +
          + +
          +
          + +
          +

          Methods

          +
          +
          + build(BuildContext context) + Widget + + + +
          +
          + Describes the part of the user interface represented by this widget. [...] +
          override
          + +
          + +
          + deactivate() + → void + + + +
          +
          + Called when this object is removed from the tree. [...] +
          @mustCallSuper, @protected, inherited
          + +
          + +
          + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
          +
          + Add additional properties associated with the node. [...] +
          inherited
          + +
          + +
          + didChangeDependencies() + → void + + + +
          +
          + Called when a dependency of this State object changes. [...] +
          @mustCallSuper, @protected, inherited
          + +
          + +
          + didUpdateWidget(covariant ReminderBuilder oldWidget) + → void + + + +
          +
          + Called whenever the widget configuration changes. [...] +
          @mustCallSuper, @protected, inherited
          + +
          + +
          + dispose() + → void + + + +
          +
          + Called when this object is removed from the tree permanently. [...] +
          @mustCallSuper, @protected, inherited
          + +
          + +
          + initState() + → void + + + +
          +
          + Called when this object is inserted into the tree. [...] +
          override
          + +
          + +
          + noSuchMethod(Invocation invocation) + → dynamic + + + +
          +
          + Invoked when a non-existent method or property is accessed. [...] +
          inherited
          + +
          + +
          + reassemble() + → void + + + +
          +
          + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
          @mustCallSuper, @protected, inherited
          + +
          + +
          + setState(VoidCallback fn) + → void + + + +
          +
          + Notify the framework that the internal state of this object has changed. [...] +
          @protected, inherited
          + +
          + +
          + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
          +
          + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
          inherited
          + +
          + +
          + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
          +
          + A string representation of this object. [...] +
          inherited
          + +
          + +
          + toStringShort() + → String + + + +
          +
          + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
          inherited
          + +
          + +
          +
          + +
          +

          Operators

          +
          +
          + operator ==(Object other) + → bool + + + +
          +
          + The equality operator. [...] +
          inherited
          + +
          + +
          +
          + + + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilderState/ReminderBuilderState.html b/docs/pages/ReminderBuilderState/ReminderBuilderState.html new file mode 100644 index 000000000..827ebe862 --- /dev/null +++ b/docs/pages/ReminderBuilderState/ReminderBuilderState.html @@ -0,0 +1,144 @@ + + + + + + + + ReminderBuilderState constructor - ReminderBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          ReminderBuilderState
          + +
          + +
          + + + + +
          +
          + +

          ReminderBuilderState constructor + Null safety +

          + +
          + ReminderBuilderState() +
          + + + + + + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilderState/build.html b/docs/pages/ReminderBuilderState/build.html new file mode 100644 index 000000000..5a4933d51 --- /dev/null +++ b/docs/pages/ReminderBuilderState/build.html @@ -0,0 +1,364 @@ + + + + + + + + build method - ReminderBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          build
          + +
          + +
          + + + + +
          +
          + +

          build method + Null safety +

          + +
          + +
          +
            +
          1. @override
          2. +
          +
          + +Widget +build(
          1. BuildContext context
          2. +
          ) + +
          override
          + +
          + +
          +

          Describes the part of the user interface represented by this widget.

          +

          The framework calls this method in a number of different situations. For +example:

          + +

          This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

          +

          The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

          +

          Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

          +

          The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

          +

          Design discussion

          +

          Why is the build method on State, and not StatefulWidget?

          +

          Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

          +

          For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

          +

          Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

          +

          Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

          +
          class MyButton extends StatefulWidget {
          +  ...
          +  final Color color;
          +
          +  @override
          +  Widget build(BuildContext context, MyButtonState state) {
          +    ... () { print("color: $color"); } ...
          +  }
          +}
          +
          +

          For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

          +

          In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

          +
          class MyButtonState extends State<MyButton> {
          +  ...
          +  @override
          +  Widget build(BuildContext context) {
          +    ... () { print("color: ${widget.color}"); } ...
          +  }
          +}
          +
          +

          Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

          +

          See also:

          +
            +
          • StatefulWidget, which contains the discussion on performance considerations.
          • +
          +
          + + + +
          +

          Implementation

          +
          @override
          +Widget build(BuildContext context) => ModelListener<RemindersBuilderModel>(
          +	model: () => RemindersBuilderModel(widget.reminder),
          +	// ignore: sort_child_properties_last
          +	child: TextButton(
          +		onPressed: Navigator.of(context).pop,
          +		child: const Text("Cancel"),
          +	),
          +	builder: (BuildContext context, RemindersBuilderModel model, Widget? back) =>
          +		AlertDialog(
          +			title: Text (widget.reminder == null ? "Create reminder" : "Edit reminder"),
          +			actions: [
          +				back!,
          +				ElevatedButton(
          +					onPressed: model.ready
          +						? () => Navigator.of(context).pop(model.build())
          +						: null,
          +					child: const Text("Save"),
          +				)
          +			],
          +			content: Column (
          +				mainAxisSize: MainAxisSize.min,
          +				children: [
          +					TextField (
          +						controller: controller,
          +						onChanged: model.onMessageChanged,
          +						textCapitalization: TextCapitalization.sentences,
          +					),
          +					const SizedBox (height: 20),
          +					RadioListTile<ReminderTimeType> (
          +						value: ReminderTimeType.period,
          +						groupValue: model.type,
          +						// if toggleable is false (default), the value can never be null
          +						onChanged: (value) => model.toggleRepeatType(value!),
          +						title: Text (
          +							"${model.shouldRepeat ? 'Repeats every' : 'On'} period"
          +						),
          +					),
          +					RadioListTile<ReminderTimeType> (
          +						value: ReminderTimeType.subject,
          +						groupValue: model.type,
          +						// if toggleable is false (default), the value can never be null
          +						onChanged: (value) => model.toggleRepeatType(value!),
          +						title: Text (
          +							"${model.shouldRepeat ? 'Repeats every' : 'On'} subject"
          +						),
          +					),
          +					const SizedBox (height: 20),
          +					if (model.type == ReminderTimeType.period) ...[
          +						ListTile (
          +							title: const Text ("Day"),
          +							trailing: DropdownButton<String>(
          +								items: [
          +									for (final String dayName in Models.instance.schedule.user.dayNames)
          +										DropdownMenuItem(
          +											value: dayName,
          +											child: Text(dayName),
          +										),
          +								],
          +								onChanged: (String? value) {
          +									if (value != null) {
          +										model.changeDay(value);
          +									}
          +								},
          +								value: model.dayName,
          +								hint: const Text("Day"),
          +							),
          +						),
          +						ListTile (
          +							title: const Text ("Period"),
          +							trailing: DropdownButton<String> (
          +								items: [
          +									for (final String period in model.periods ?? [])
          +										DropdownMenuItem(
          +											value: period,
          +											child: Text (period),
          +										)
          +								],
          +								onChanged: (String? value) {
          +									if (value != null) {
          +										model.changePeriod(value);
          +									}
          +								},
          +								value: model.period,
          +								hint: const Text ("Period"),
          +							)
          +						)
          +					] else if (model.type == ReminderTimeType.subject)
          +						ListTile (
          +							title: const Text ("Class"),
          +							trailing: DropdownButton<String>(
          +								items: [
          +									for (final String course in model.courses)
          +										DropdownMenuItem(
          +											value: course,
          +											child: Text("${ReminderBuilder.trimString(course, 14)}..."),
          +										)
          +								],
          +								onChanged: (String? value) {
          +									if (value != null) {
          +										model.changeCourse(value);
          +									}
          +								},
          +								value: model.course,
          +								isDense: true,
          +								hint: const Text ("Class"),
          +							)
          +						),
          +					SwitchListTile (
          +						value: model.shouldRepeat,
          +						onChanged: model.toggleRepeat,
          +						title: const Text ("Repeat"),
          +						secondary: const Icon (Icons.repeat),
          +					),
          +				]
          +			)
          +		)
          +);
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilderState/controller.html b/docs/pages/ReminderBuilderState/controller.html new file mode 100644 index 000000000..c6583f0b4 --- /dev/null +++ b/docs/pages/ReminderBuilderState/controller.html @@ -0,0 +1,154 @@ + + + + + + + + controller property - ReminderBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          controller
          + +
          + +
          + + + + +
          +
          + +

          controller property + Null safety +

          + +
          + TextEditingController + controller +
          final
          + +
          + +
          +

          The text controller to hold the message of the Reminder.

          +
          + + +
          +

          Implementation

          +
          final TextEditingController controller = TextEditingController();
          +
          +
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ReminderBuilderState/initState.html b/docs/pages/ReminderBuilderState/initState.html new file mode 100644 index 000000000..d49ad3f8f --- /dev/null +++ b/docs/pages/ReminderBuilderState/initState.html @@ -0,0 +1,188 @@ + + + + + + + + initState method - ReminderBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          initState
          + +
          + +
          + + + + +
          +
          + +

          initState method + Null safety +

          + +
          + +
          +
            +
          1. @override
          2. +
          +
          + +void +initState() + +
          override
          + +
          + +
          +

          Called when this object is inserted into the tree.

          +

          The framework will call this method exactly once for each State object +it creates.

          +

          Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

          +

          If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

          +
            +
          • In initState, subscribe to the object.
          • +
          • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
          • +
          • In dispose, unsubscribe from the object.
          • +
          +

          You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

          +

          If you override this, make sure your method starts with a call to +super.initState().

          +
          + + + +
          +

          Implementation

          +
          @override
          +void initState() {
          +	super.initState();
          +	controller.text = widget.reminder?.message ?? "";
          +}
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveReminders-class.html b/docs/pages/ResponsiveReminders-class.html new file mode 100644 index 000000000..33e53dfc5 --- /dev/null +++ b/docs/pages/ResponsiveReminders-class.html @@ -0,0 +1,511 @@ + + + + + + + + ResponsiveReminders class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          ResponsiveReminders
          + +
          + +
          + + + + +
          +
          + +

          ResponsiveReminders class + Null safety + +

          + + + + +
          +
          +
          Inheritance
          +
          + + + + + +
          +
          + +
          +

          Constructors

          + +
          +
          + ResponsiveReminders() +
          +
          + +
          +
          +
          + +
          +

          Properties

          + +
          +
          + appBar + AppBar + +
          +
          + +
          read-only, override
          + +
          + +
          + bottomNavBar + BottomNavigationBarItem + +
          +
          + Generates an item for BottomNavigationBar. +
          read-only, inherited
          + +
          + +
          + floatingActionButton + Widget + +
          +
          + +
          read-only, override
          + +
          + +
          + floatingActionButtonLocation + FloatingActionButtonLocation? + +
          +
          + +
          read-only, inherited
          + +
          + +
          + hashCode + → int + +
          +
          + The hash code for this object. [...] +
          @nonVirtual, read-only, inherited
          + +
          + +
          + icon + Widget + +
          +
          + The icon for this item. +
          final, inherited
          + +
          + +
          + key + Key? + +
          +
          + Controls how one widget replaces another widget in the tree. [...] +
          final, inherited
          + +
          + +
          + label + → String + +
          +
          + The label for this item. [...] +
          final, inherited
          + +
          + +
          + model + Reminders + +
          +
          + +
          final
          + +
          + + +
          + Generates an item for NavigationRail. +
          read-only, inherited
          + +
          + +
          + runtimeType + → Type + +
          +
          + A representation of the runtime type of the object. +
          read-only, inherited
          + +
          + +
          + sideSheet + Widget? + +
          +
          + +
          read-only, inherited
          + +
          + +
          +
          + +
          +

          Methods

          +
          +
          + build(BuildContext context) + Widget + + + +
          +
          + Describes the part of the user interface represented by this widget. [...] +
          override
          + +
          + +
          + createElement() + StatelessElement + + + +
          +
          + Creates a StatelessElement to manage this widget's location in the tree. [...] +
          inherited
          + +
          + +
          + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
          +
          + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
          @protected, inherited
          + +
          + +
          + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
          +
          + Add additional properties associated with the node. [...] +
          inherited
          + +
          + +
          + noSuchMethod(Invocation invocation) + → dynamic + + + +
          +
          + Invoked when a non-existent method or property is accessed. [...] +
          inherited
          + +
          + +
          + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
          +
          + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
          inherited
          + +
          + +
          + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
          +
          + A string representation of this object. [...] +
          inherited
          + +
          + +
          + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a string representation of this node and its descendants. [...] +
          inherited
          + +
          + +
          + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a one-line detailed description of the object. [...] +
          inherited
          + +
          + +
          + toStringShort() + → String + + + +
          +
          + A short, textual description of this widget. +
          inherited
          + +
          + +
          +
          + +
          +

          Operators

          +
          +
          + operator ==(Object other) + → bool + + + +
          +
          + The equality operator. [...] +
          @nonVirtual, inherited
          + +
          + +
          +
          + + + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveReminders/ResponsiveReminders.html b/docs/pages/ResponsiveReminders/ResponsiveReminders.html new file mode 100644 index 000000000..8ccd62f62 --- /dev/null +++ b/docs/pages/ResponsiveReminders/ResponsiveReminders.html @@ -0,0 +1,152 @@ + + + + + + + + ResponsiveReminders constructor - ResponsiveReminders class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          ResponsiveReminders
          + +
          + +
          + + + + +
          +
          + +

          ResponsiveReminders constructor + Null safety +

          + +
          + ResponsiveReminders() +
          + + + + + +
          +

          Implementation

          +
          ResponsiveReminders() :
          +	super(label: "Reminders", icon: const Icon(Icons.notifications));
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveReminders/appBar.html b/docs/pages/ResponsiveReminders/appBar.html new file mode 100644 index 000000000..08220b6a1 --- /dev/null +++ b/docs/pages/ResponsiveReminders/appBar.html @@ -0,0 +1,160 @@ + + + + + + + + appBar property - ResponsiveReminders class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          appBar
          + +
          + +
          + + + + +
          +
          + +

          appBar property + Null safety +

          + + + +
          + +
          + AppBar + appBar +
          override
          + +
          + + + + +
          +

          Implementation

          +
          @override
          +AppBar get appBar => AppBar(title: const Text ("Reminders"));
          +
          + +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveReminders/build.html b/docs/pages/ResponsiveReminders/build.html new file mode 100644 index 000000000..554a6107f --- /dev/null +++ b/docs/pages/ResponsiveReminders/build.html @@ -0,0 +1,217 @@ + + + + + + + + build method - ResponsiveReminders class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          build
          + +
          + +
          + + + + +
          +
          + +

          build method + Null safety +

          + +
          + +
          +
            +
          1. @override
          2. +
          +
          + +Widget +build(
          1. BuildContext context
          2. +
          ) + +
          override
          + +
          + +
          +

          Describes the part of the user interface represented by this widget.

          +

          The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

          +

          The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

          +

          Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

          +

          The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

          +

          The implementation of this method must only depend on:

          + +

          If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

          +

          See also:

          +
            +
          • StatelessWidget, which contains the discussion on performance considerations.
          • +
          +
          + + + +
          +

          Implementation

          +
          @override
          +Widget build(BuildContext context) => ModelListener<Reminders>(
          +	model: () => Models.instance.reminders,
          +	dispose: false,
          +	// ignore: sort_child_properties_last
          +	child: const Center (
          +		child: Text (
          +			"You don't have any reminders yet",
          +			textScaleFactor: 1.5,
          +			textAlign: TextAlign.center,
          +		),
          +	),
          +	builder: (_, Reminders model, Widget? empty) => model.reminders.isEmpty
          +		? empty!  // widget is supplied above
          +		: ListView.separated (
          +			itemCount: model.reminders.length,
          +			separatorBuilder: (_, __) => const Divider(),
          +			itemBuilder: (BuildContext context, int index) =>
          +				ReminderTile(index: index),
          +		)
          +);
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveReminders/floatingActionButton.html b/docs/pages/ResponsiveReminders/floatingActionButton.html new file mode 100644 index 000000000..857b932c2 --- /dev/null +++ b/docs/pages/ResponsiveReminders/floatingActionButton.html @@ -0,0 +1,166 @@ + + + + + + + + floatingActionButton property - ResponsiveReminders class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          floatingActionButton
          + +
          + +
          + + + + +
          +
          + +

          floatingActionButton property + Null safety +

          + + + +
          + +
          + Widget + floatingActionButton +
          override
          + +
          + + + + +
          +

          Implementation

          +
          @override
          +Widget get floatingActionButton => Builder(
          +	builder: (BuildContext context) => FloatingActionButton(
          +		onPressed: () async => model
          +			.addReminder(await ReminderBuilder.buildReminder(context)),
          +		child: const Icon (Icons.note_add),
          +	)
          +);
          +
          + +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveReminders/model.html b/docs/pages/ResponsiveReminders/model.html new file mode 100644 index 000000000..542cb87a9 --- /dev/null +++ b/docs/pages/ResponsiveReminders/model.html @@ -0,0 +1,154 @@ + + + + + + + + model property - ResponsiveReminders class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          model
          + +
          + +
          + + + + +
          +
          + +

          model property + Null safety +

          + +
          + Reminders + model +
          final
          + +
          + + + +
          +

          Implementation

          +
          final Reminders model = Models.instance.reminders;
          +
          +
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveSchedule-class.html b/docs/pages/ResponsiveSchedule-class.html new file mode 100644 index 000000000..bb84193b1 --- /dev/null +++ b/docs/pages/ResponsiveSchedule-class.html @@ -0,0 +1,539 @@ + + + + + + + + ResponsiveSchedule class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          ResponsiveSchedule
          + +
          + +
          + + + + +
          +
          + +

          ResponsiveSchedule class + Null safety + +

          + + + + +
          +
          +
          Inheritance
          +
          + + + + + +
          +
          + +
          +

          Constructors

          + +
          +
          + ResponsiveSchedule() +
          +
          + +
          +
          +
          + +
          +

          Properties

          + +
          +
          + appBar + AppBar + +
          +
          + +
          read-only, override
          + +
          + +
          + bottomNavBar + BottomNavigationBarItem + +
          +
          + Generates an item for BottomNavigationBar. +
          read-only, inherited
          + +
          + +
          + floatingActionButton + Widget? + +
          +
          + +
          read-only, override
          + +
          + +
          + floatingActionButtonLocation + FloatingActionButtonLocation? + +
          +
          + +
          read-only, inherited
          + +
          + +
          + hashCode + → int + +
          +
          + The hash code for this object. [...] +
          @nonVirtual, read-only, inherited
          + +
          + +
          + icon + Widget + +
          +
          + The icon for this item. +
          final, inherited
          + +
          + +
          + key + Key? + +
          +
          + Controls how one widget replaces another widget in the tree. [...] +
          final, inherited
          + +
          + +
          + label + → String + +
          +
          + The label for this item. [...] +
          final, inherited
          + +
          + +
          + model + ScheduleViewModel + +
          +
          + +
          final
          + +
          + + +
          + Generates an item for NavigationRail. +
          read-only, inherited
          + +
          + +
          + runtimeType + → Type + +
          +
          + A representation of the runtime type of the object. +
          read-only, inherited
          + +
          + +
          + sideSheet + Widget? + +
          +
          + +
          read-only, inherited
          + +
          + +
          +
          + +
          +

          Methods

          +
          +
          + build(BuildContext context) + Widget + + + +
          +
          + Describes the part of the user interface represented by this widget. [...] +
          override
          + +
          + +
          + createElement() + StatelessElement + + + +
          +
          + Creates a StatelessElement to manage this widget's location in the tree. [...] +
          inherited
          + +
          + +
          + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
          +
          + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
          @protected, inherited
          + +
          + +
          + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
          +
          + Add additional properties associated with the node. [...] +
          inherited
          + +
          + +
          + handleInvalidSchedule(BuildContext context) + → void + + + +
          +
          + Lets the user know that they chose an invalid schedule combination. + + +
          + +
          + noSuchMethod(Invocation invocation) + → dynamic + + + +
          +
          + Invoked when a non-existent method or property is accessed. [...] +
          inherited
          + +
          + +
          + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
          +
          + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
          inherited
          + +
          + +
          + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
          +
          + A string representation of this object. [...] +
          inherited
          + +
          + +
          + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a string representation of this node and its descendants. [...] +
          inherited
          + +
          + +
          + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a one-line detailed description of the object. [...] +
          inherited
          + +
          + +
          + toStringShort() + → String + + + +
          +
          + A short, textual description of this widget. +
          inherited
          + +
          + +
          + viewDay(ScheduleViewModel model, BuildContext context) + → Future<void> + + + +
          +
          + Allows the user to select a day in the calendar to view. [...] + + +
          + +
          +
          + +
          +

          Operators

          +
          +
          + operator ==(Object other) + → bool + + + +
          +
          + The equality operator. [...] +
          @nonVirtual, inherited
          + +
          + +
          +
          + + + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveSchedule/ResponsiveSchedule.html b/docs/pages/ResponsiveSchedule/ResponsiveSchedule.html new file mode 100644 index 000000000..e76c58cbf --- /dev/null +++ b/docs/pages/ResponsiveSchedule/ResponsiveSchedule.html @@ -0,0 +1,154 @@ + + + + + + + + ResponsiveSchedule constructor - ResponsiveSchedule class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          ResponsiveSchedule
          + +
          + +
          + + + + +
          +
          + +

          ResponsiveSchedule constructor + Null safety +

          + +
          + ResponsiveSchedule() +
          + + + + + +
          +

          Implementation

          +
          ResponsiveSchedule() :
          +	super(label: "Schedule", icon: const Icon(Icons.schedule));
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveSchedule/appBar.html b/docs/pages/ResponsiveSchedule/appBar.html new file mode 100644 index 000000000..6d5beee53 --- /dev/null +++ b/docs/pages/ResponsiveSchedule/appBar.html @@ -0,0 +1,162 @@ + + + + + + + + appBar property - ResponsiveSchedule class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          appBar
          + +
          + +
          + + + + +
          +
          + +

          appBar property + Null safety +

          + + + +
          + +
          + AppBar + appBar +
          override
          + +
          + + + + +
          +

          Implementation

          +
          @override
          +AppBar get appBar => AppBar(title: const Text("Schedule"));
          +
          + +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveSchedule/build.html b/docs/pages/ResponsiveSchedule/build.html new file mode 100644 index 000000000..d8a1171ae --- /dev/null +++ b/docs/pages/ResponsiveSchedule/build.html @@ -0,0 +1,250 @@ + + + + + + + + build method - ResponsiveSchedule class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          build
          + +
          + +
          + + + + +
          +
          + +

          build method + Null safety +

          + +
          + +
          +
            +
          1. @override
          2. +
          +
          + +Widget +build(
          1. BuildContext context
          2. +
          ) + +
          override
          + +
          + +
          +

          Describes the part of the user interface represented by this widget.

          +

          The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

          +

          The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

          +

          Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

          +

          The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

          +

          The implementation of this method must only depend on:

          + +

          If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

          +

          See also:

          +
            +
          • StatelessWidget, which contains the discussion on performance considerations.
          • +
          +
          + + + +
          +

          Implementation

          +
          @override
          +Widget build (BuildContext context) => ModelListener(
          +	model: () => model,
          +	dispose: false,
          +	builder: (_, ScheduleViewModel model, __) => Column(
          +		children: [
          +			ListTile (
          +				title: const Text ("Day"),
          +				trailing: DropdownButton<String> (
          +					value: model.day.name,
          +					onChanged: (String? value) => model.update(
          +						newName: value,
          +						onInvalidSchedule: () => handleInvalidSchedule(context),
          +					),
          +					items: [
          +						for (final String dayName in Models.instance.schedule.user.dayNames)
          +							DropdownMenuItem(
          +								value: dayName,
          +								child: Text(dayName),
          +							)
          +					]
          +				)
          +			),
          +			ListTile (
          +				title: const Text ("Schedule"),
          +				trailing: DropdownButton<Schedule> (
          +					value: model.day.schedule,
          +					onChanged: (Schedule? schedule) => model.update(
          +						newSchedule: schedule,
          +						onInvalidSchedule: () => handleInvalidSchedule(context),
          +					),
          +					items: [
          +						for (final Schedule schedule in Schedule.schedules)
          +							DropdownMenuItem(
          +								value: schedule,
          +								child: Text (schedule.name),
          +							),
          +					]
          +				)
          +			),
          +			const SizedBox (height: 20),
          +			const Divider(),
          +			const SizedBox (height: 20),
          +			Expanded(
          +				child: ClassList(
          +					day: model.day,
          +					periods: Models.instance.user.data.getPeriods(model.day)
          +				)
          +			),
          +		]
          +	)
          +);
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveSchedule/floatingActionButton.html b/docs/pages/ResponsiveSchedule/floatingActionButton.html new file mode 100644 index 000000000..48c27ef53 --- /dev/null +++ b/docs/pages/ResponsiveSchedule/floatingActionButton.html @@ -0,0 +1,167 @@ + + + + + + + + floatingActionButton property - ResponsiveSchedule class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          floatingActionButton
          + +
          + +
          + + + + +
          +
          + +

          floatingActionButton property + Null safety +

          + + + +
          + +
          + Widget? + floatingActionButton +
          override
          + +
          + + + + +
          +

          Implementation

          +
          @override
          +Widget? get floatingActionButton => Builder(
          +	builder: (BuildContext context) => FloatingActionButton(
          +		onPressed: () => viewDay(model, context),
          +		child: const Icon(Icons.calendar_today),
          +	)
          +);
          +
          + +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveSchedule/handleInvalidSchedule.html b/docs/pages/ResponsiveSchedule/handleInvalidSchedule.html new file mode 100644 index 000000000..c7ac4bab6 --- /dev/null +++ b/docs/pages/ResponsiveSchedule/handleInvalidSchedule.html @@ -0,0 +1,165 @@ + + + + + + + + handleInvalidSchedule method - ResponsiveSchedule class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          handleInvalidSchedule
          + +
          + +
          + + + + +
          +
          + +

          handleInvalidSchedule method + Null safety +

          + +
          + + +void +handleInvalidSchedule(
          1. BuildContext context
          2. +
          ) + + + +
          + +
          +

          Lets the user know that they chose an invalid schedule combination.

          +
          + + + +
          +

          Implementation

          +
          void handleInvalidSchedule(BuildContext context) =>
          +	ScaffoldMessenger.of(context).showSnackBar(
          +		const SnackBar(content: Text("Invalid schedule"))
          +	);
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveSchedule/model.html b/docs/pages/ResponsiveSchedule/model.html new file mode 100644 index 000000000..524471a63 --- /dev/null +++ b/docs/pages/ResponsiveSchedule/model.html @@ -0,0 +1,156 @@ + + + + + + + + model property - ResponsiveSchedule class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          model
          + +
          + +
          + + + + +
          +
          + +

          model property + Null safety +

          + +
          + ScheduleViewModel + model +
          final
          + +
          + + + +
          +

          Implementation

          +
          final ScheduleViewModel model = ScheduleViewModel();
          +
          +
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/ResponsiveSchedule/viewDay.html b/docs/pages/ResponsiveSchedule/viewDay.html new file mode 100644 index 000000000..00d30e427 --- /dev/null +++ b/docs/pages/ResponsiveSchedule/viewDay.html @@ -0,0 +1,181 @@ + + + + + + + + viewDay method - ResponsiveSchedule class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          viewDay
          + +
          + +
          + + + + +
          +
          + +

          viewDay method + Null safety +

          + +
          + + +Future<void> +viewDay(
          1. ScheduleViewModel model,
          2. +
          3. BuildContext context
          4. +
          ) + + + +
          + +
          +

          Allows the user to select a day in the calendar to view.

          +

          If there is no school on that day, a SnackBar will be shown.

          +
          + + + +
          +

          Implementation

          +
          Future<void> viewDay(ScheduleViewModel model, BuildContext context) async {
          +	final DateTime? selected = await pickDate(
          +		context: context,
          +		initialDate: model.date,
          +	);
          +	if (selected == null) {
          +		return;
          +	}
          +	try {
          +		model.date = selected;
          +	} on Exception {  // user picked a day with no school
          +		ScaffoldMessenger.of(context).showSnackBar(
          +			const SnackBar (
          +				content: Text ("There is no school on this day")
          +			)
          +		);
          +	}
          +}
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/RouteInitializer-class.html b/docs/pages/RouteInitializer-class.html new file mode 100644 index 000000000..f11714a2e --- /dev/null +++ b/docs/pages/RouteInitializer-class.html @@ -0,0 +1,474 @@ + + + + + + + + RouteInitializer class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          RouteInitializer
          + +
          + +
          + + + + +
          +
          + +

          RouteInitializer class + Null safety + +

          + + +
          +

          A route that performs initialization logic first.

          +
          + + +
          +
          +
          Inheritance
          +
          + + + + + +
          +
          + +
          +

          Constructors

          + +
          +
          + RouteInitializer({required Widget child, String onFailure = Routes.login, String? onError = Routes.login, bool isAllowed() = isSignedIn}) +
          +
          + Navigation with authorization and error-handling. +
          const
          +
          +
          +
          + +
          +

          Properties

          + +
          +
          + child + Widget + +
          +
          + The contents of the page. +
          final
          + +
          + +
          + hashCode + → int + +
          +
          + The hash code for this object. [...] +
          @nonVirtual, read-only, inherited
          + +
          + +
          + isAllowed + → bool Function() + +
          +
          + Determines if the user is allowed to be on the given page. +
          final
          + +
          + +
          + key + Key? + +
          +
          + Controls how one widget replaces another widget in the tree. [...] +
          final, inherited
          + +
          + +
          + onError + → String? + +
          +
          + The route to navigate to if there is an error. +
          final
          + +
          + +
          + onFailure + → String + +
          +
          + The route to navigate to if the user is not authorized. +
          final
          + +
          + +
          + runtimeType + → Type + +
          +
          + A representation of the runtime type of the object. +
          read-only, inherited
          + +
          + +
          +
          + +
          +

          Methods

          +
          +
          + createElement() + StatefulElement + + + +
          +
          + Creates a StatefulElement to manage this widget's location in the tree. [...] +
          inherited
          + +
          + +
          + createState() + RouteInitializerState + + + +
          +
          + Creates the mutable state for this widget at a given location in the tree. [...] +
          override
          + +
          + +
          + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
          +
          + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
          @protected, inherited
          + +
          + +
          + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
          +
          + Add additional properties associated with the node. [...] +
          inherited
          + +
          + +
          + noSuchMethod(Invocation invocation) + → dynamic + + + +
          +
          + Invoked when a non-existent method or property is accessed. [...] +
          inherited
          + +
          + +
          + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
          +
          + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
          inherited
          + +
          + +
          + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
          +
          + A string representation of this object. [...] +
          inherited
          + +
          + +
          + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a string representation of this node and its descendants. [...] +
          inherited
          + +
          + +
          + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
          +
          + Returns a one-line detailed description of the object. [...] +
          inherited
          + +
          + +
          + toStringShort() + → String + + + +
          +
          + A short, textual description of this widget. +
          inherited
          + +
          + +
          +
          + +
          +

          Operators

          +
          +
          + operator ==(Object other) + → bool + + + +
          +
          + The equality operator. [...] +
          @nonVirtual, inherited
          + +
          + +
          +
          + + +
          +

          Static Methods

          +
          +
          + isSignedIn() + → bool + + + +
          +
          + Checks to see if the user is signed in. [...] + + +
          + +
          +
          + + +
          + + + +
          + +
          + + ramaz + 2.1.1+1 + + + +
          + + + + + + + + + + + diff --git a/docs/pages/RouteInitializer/RouteInitializer.html b/docs/pages/RouteInitializer/RouteInitializer.html new file mode 100644 index 000000000..8a8ca3fd2 --- /dev/null +++ b/docs/pages/RouteInitializer/RouteInitializer.html @@ -0,0 +1,161 @@ + + + + + + + + RouteInitializer constructor - RouteInitializer class - pages library - Dart API + + + + + + + + + + + + + + + + +
          + +
          + + +
          RouteInitializer
          + +
          + +
          + + + + +
          +
          + +

          RouteInitializer constructor + Null safety +

          + +
          const + RouteInitializer(
          1. {required Widget child,
          2. +
          3. String onFailure = Routes.login,
          4. +
          5. String? onError = Routes.login,
          6. +
          7. bool isAllowed(
              +) = isSignedIn}
            1. +
            ) +
            + + +
            +

            Navigation with authorization and error-handling.

            +
            + + + +
            +

            Implementation

            +
            const RouteInitializer({
            +	required this.child,
            +	this.onFailure = Routes.login,
            +	this.onError = Routes.login,
            +	this.isAllowed = isSignedIn,
            +});
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializer/child.html b/docs/pages/RouteInitializer/child.html new file mode 100644 index 000000000..0a916ba34 --- /dev/null +++ b/docs/pages/RouteInitializer/child.html @@ -0,0 +1,154 @@ + + + + + + + + child property - RouteInitializer class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            child
            + +
            + +
            + + + + +
            +
            + +

            child property + Null safety +

            + +
            + Widget + child +
            final
            + +
            + +
            +

            The contents of the page.

            +
            + + +
            +

            Implementation

            +
            final Widget child;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializer/createState.html b/docs/pages/RouteInitializer/createState.html new file mode 100644 index 000000000..e3a4d1ed9 --- /dev/null +++ b/docs/pages/RouteInitializer/createState.html @@ -0,0 +1,174 @@ + + + + + + + + createState method - RouteInitializer class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            createState
            + +
            + +
            + + + + +
            +
            + +

            createState method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +RouteInitializerState +createState() + +
            override
            + +
            + +
            +

            Creates the mutable state for this widget at a given location in the tree.

            +

            Subclasses should override this method to return a newly created +instance of their associated State subclass:

            +
            @override
            +_MyState createState() => _MyState();
            +
            +

            The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

            +
            + + + +
            +

            Implementation

            +
            @override
            +RouteInitializerState createState() => RouteInitializerState();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializer/isAllowed.html b/docs/pages/RouteInitializer/isAllowed.html new file mode 100644 index 000000000..e37e07b42 --- /dev/null +++ b/docs/pages/RouteInitializer/isAllowed.html @@ -0,0 +1,154 @@ + + + + + + + + isAllowed property - RouteInitializer class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isAllowed
            + +
            + +
            + + + + +
            +
            + +

            isAllowed property + Null safety +

            + +
            + bool Function() + isAllowed +
            final
            + +
            + +
            +

            Determines if the user is allowed to be on the given page.

            +
            + + +
            +

            Implementation

            +
            final bool Function() isAllowed;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializer/isSignedIn.html b/docs/pages/RouteInitializer/isSignedIn.html new file mode 100644 index 000000000..b434592ca --- /dev/null +++ b/docs/pages/RouteInitializer/isSignedIn.html @@ -0,0 +1,157 @@ + + + + + + + + isSignedIn method - RouteInitializer class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isSignedIn
            + +
            + +
            + + + + +
            +
            + +

            isSignedIn method + Null safety +

            + +
            + + +bool +isSignedIn() + + + +
            + +
            +

            Checks to see if the user is signed in.

            +

            This is the default logic to determine if the user can access a page.

            +
            + + + +
            +

            Implementation

            +
            static bool isSignedIn() => Auth.isSignedIn;
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializer/onError.html b/docs/pages/RouteInitializer/onError.html new file mode 100644 index 000000000..648e2ab53 --- /dev/null +++ b/docs/pages/RouteInitializer/onError.html @@ -0,0 +1,154 @@ + + + + + + + + onError property - RouteInitializer class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            onError
            + +
            + +
            + + + + +
            +
            + +

            onError property + Null safety +

            + +
            + String? + onError +
            final
            + +
            + +
            +

            The route to navigate to if there is an error.

            +
            + + +
            +

            Implementation

            +
            final String? onError;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializer/onFailure.html b/docs/pages/RouteInitializer/onFailure.html new file mode 100644 index 000000000..b06066c30 --- /dev/null +++ b/docs/pages/RouteInitializer/onFailure.html @@ -0,0 +1,154 @@ + + + + + + + + onFailure property - RouteInitializer class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            onFailure
            + +
            + +
            + + + + +
            +
            + +

            onFailure property + Null safety +

            + +
            + String + onFailure +
            final
            + +
            + +
            +

            The route to navigate to if the user is not authorized.

            +
            + + +
            +

            Implementation

            +
            final String onFailure;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializerState-class.html b/docs/pages/RouteInitializerState-class.html new file mode 100644 index 000000000..1469476ae --- /dev/null +++ b/docs/pages/RouteInitializerState-class.html @@ -0,0 +1,496 @@ + + + + + + + + RouteInitializerState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            RouteInitializerState
            + +
            + +
            + + + + +
            +
            + +

            RouteInitializerState class + Null safety + +

            + + +
            +

            The state for a RouteInitializer.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + RouteInitializerState() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + context + BuildContext + +
            +
            + The location in the tree where this widget builds. [...] +
            read-only, inherited
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + initFuture + ↔ Future + +
            +
            + The future for initializing the backend. +
            read / write
            + +
            + +
            + mounted + → bool + +
            +
            + Whether this State object is currently in a tree. [...] +
            read-only, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            + widget + RouteInitializer + +
            +
            + The current configuration. [...] +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + deactivate() + → void + + + +
            +
            + Called when this object is removed from the tree. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + didChangeDependencies() + → void + + + +
            +
            + Called when a dependency of this State object changes. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + didUpdateWidget(covariant RouteInitializer oldWidget) + → void + + + +
            +
            + Called whenever the widget configuration changes. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + dispose() + → void + + + +
            +
            + Called when this object is removed from the tree permanently. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + init() + → Future<void> + + + +
            +
            + Initializes the app's backends. [...] + + +
            + +
            + initState() + → void + + + +
            +
            + Called when this object is inserted into the tree. [...] +
            override
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + reassemble() + → void + + + +
            +
            + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + setState(VoidCallback fn) + → void + + + +
            +
            + Notify the framework that the internal state of this object has changed. [...] +
            @protected, inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializerState/RouteInitializerState.html b/docs/pages/RouteInitializerState/RouteInitializerState.html new file mode 100644 index 000000000..fafff8e58 --- /dev/null +++ b/docs/pages/RouteInitializerState/RouteInitializerState.html @@ -0,0 +1,145 @@ + + + + + + + + RouteInitializerState constructor - RouteInitializerState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            RouteInitializerState
            + +
            + +
            + + + + +
            +
            + +

            RouteInitializerState constructor + Null safety +

            + +
            + RouteInitializerState() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializerState/build.html b/docs/pages/RouteInitializerState/build.html new file mode 100644 index 000000000..1fff078c2 --- /dev/null +++ b/docs/pages/RouteInitializerState/build.html @@ -0,0 +1,259 @@ + + + + + + + + build method - RouteInitializerState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method in a number of different situations. For +example:

            + +

            This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

            +

            Design discussion

            +

            Why is the build method on State, and not StatefulWidget?

            +

            Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

            +

            For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

            +

            Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

            +

            Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

            +
            class MyButton extends StatefulWidget {
            +  ...
            +  final Color color;
            +
            +  @override
            +  Widget build(BuildContext context, MyButtonState state) {
            +    ... () { print("color: $color"); } ...
            +  }
            +}
            +
            +

            For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

            +

            In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

            +
            class MyButtonState extends State<MyButton> {
            +  ...
            +  @override
            +  Widget build(BuildContext context) {
            +    ... () { print("color: ${widget.color}"); } ...
            +  }
            +}
            +
            +

            Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

            +

            See also:

            +
              +
            • StatefulWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override
            +Widget build(BuildContext context) => FutureBuilder(
            +	future: initFuture,
            +	builder: (_, AsyncSnapshot snapshot) =>
            +		snapshot.connectionState == ConnectionState.done
            +			? widget.child
            +			: ResponsiveScaffold(
            +				appBar: AppBar(title: const Text("Loading...")),
            +				bodyBuilder: (_) => const Center(child: CircularProgressIndicator()),
            +				drawer: const NavigationDrawer(),
            +			),
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializerState/init.html b/docs/pages/RouteInitializerState/init.html new file mode 100644 index 000000000..a0902c1b0 --- /dev/null +++ b/docs/pages/RouteInitializerState/init.html @@ -0,0 +1,176 @@ + + + + + + + + init method - RouteInitializerState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            init
            + +
            + +
            + + + + +
            +
            + +

            init method + Null safety +

            + +
            + + +Future<void> +init() + + + +
            + +
            +

            Initializes the app's backends.

            +

            No-op if the backend is already initialized.

            +
            + + + +
            +

            Implementation

            +
            Future<void> init() async {
            +	try {
            +		if (!Services.instance.isReady) {
            +			await Services.instance.init();
            +		}
            +		if (Auth.isSignedIn && !Models.instance.isReady) {
            +			await Models.instance.init();
            +		}
            +	} catch (error) {
            +		await Services.instance.crashlytics.log("Error. Disposing models");
            +		Models.instance.dispose();
            +		if (widget.onError != null) {
            +			await Navigator.of(context).pushReplacementNamed(widget.onError!);
            +		}
            +	}
            +	if (!widget.isAllowed()) {
            +		await Navigator.of(context).pushReplacementNamed(widget.onFailure);
            +	}
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializerState/initFuture.html b/docs/pages/RouteInitializerState/initFuture.html new file mode 100644 index 000000000..33f3d0895 --- /dev/null +++ b/docs/pages/RouteInitializerState/initFuture.html @@ -0,0 +1,155 @@ + + + + + + + + initFuture property - RouteInitializerState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            initFuture
            + +
            + +
            + + + + +
            +
            + +

            initFuture property + Null safety +

            + +
            + Future + initFuture +
            read / write
            + +
            + +
            +

            The future for initializing the backend.

            +
            + + +
            +

            Implementation

            +
            late Future initFuture;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/RouteInitializerState/initState.html b/docs/pages/RouteInitializerState/initState.html new file mode 100644 index 000000000..0b18f5e1b --- /dev/null +++ b/docs/pages/RouteInitializerState/initState.html @@ -0,0 +1,189 @@ + + + + + + + + initState method - RouteInitializerState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            initState
            + +
            + +
            + + + + +
            +
            + +

            initState method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +void +initState() + +
            override
            + +
            + +
            +

            Called when this object is inserted into the tree.

            +

            The framework will call this method exactly once for each State object +it creates.

            +

            Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

            +

            If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

            +
              +
            • In initState, subscribe to the object.
            • +
            • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
            • +
            • In dispose, unsubscribe from the object.
            • +
            +

            You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

            +

            If you override this, make sure your method starts with a call to +super.initState().

            +
            + + + +
            +

            Implementation

            +
            @override
            +void initState() {
            +	super.initState();
            +	initFuture = init();
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes-class.html b/docs/pages/Routes-class.html new file mode 100644 index 000000000..da8e0452f --- /dev/null +++ b/docs/pages/Routes-class.html @@ -0,0 +1,398 @@ + + + + + + + + Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Routes
            + +
            + +
            + + + + +
            +
            + +

            Routes class + Null safety + +

            + + +
            +

            Route names for each page in the app.

            +

            These would be enums, but Flutter requires Strings.

            +
            + + + +
            +

            Constructors

            + +
            +
            + Routes() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + +
            +

            Constants

            + +
            +
            + calendar + → const String + + +
            +
            + The route name for the calendar page. + + +
            + "calendar" +
            +
            + +
            + feedback + → const String + + +
            +
            + The route name for the feedback page. + + +
            + "feedback" +
            +
            + +
            + home + → const String + + +
            +
            + The route name for the home page. + + +
            + "home" +
            +
            + +
            + login + → const String + + +
            +
            + The route name for the login page. + + +
            + "login" +
            +
            + +
            + reminders + → const String + + +
            +
            + The route name for the reminders page. + + +
            + "reminders" +
            +
            + +
            + schedule + → const String + + +
            +
            + The route name for the schedule page. + + +
            + "schedule" +
            +
            + +
            + schedules + → const String + + +
            +
            + The route name for the schedules manager page. + + +
            + "schedules" +
            +
            + +
            + sports + → const String + + +
            +
            + The route name for the sports games page. + + +
            + "sports" +
            +
            + +
            +
            + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/Routes.html b/docs/pages/Routes/Routes.html new file mode 100644 index 000000000..38797673b --- /dev/null +++ b/docs/pages/Routes/Routes.html @@ -0,0 +1,138 @@ + + + + + + + + Routes constructor - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Routes
            + +
            + +
            + + + + +
            +
            + +

            Routes constructor + Null safety +

            + +
            + Routes() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/calendar-constant.html b/docs/pages/Routes/calendar-constant.html new file mode 100644 index 000000000..5d70b18c0 --- /dev/null +++ b/docs/pages/Routes/calendar-constant.html @@ -0,0 +1,148 @@ + + + + + + + + calendar constant - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            calendar
            + +
            + +
            + + + + +
            +
            + +

            calendar constant + Null safety +

            + +
            + String + const calendar + + +
            + +
            +

            The route name for the calendar page.

            +
            + + +
            +

            Implementation

            +
            static const String calendar = "calendar";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/feedback-constant.html b/docs/pages/Routes/feedback-constant.html new file mode 100644 index 000000000..e07f1afbe --- /dev/null +++ b/docs/pages/Routes/feedback-constant.html @@ -0,0 +1,148 @@ + + + + + + + + feedback constant - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            feedback
            + +
            + +
            + + + + +
            +
            + +

            feedback constant + Null safety +

            + +
            + String + const feedback + + +
            + +
            +

            The route name for the feedback page.

            +
            + + +
            +

            Implementation

            +
            static const String feedback = "feedback";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/hashCode.html b/docs/pages/Routes/hashCode.html new file mode 100644 index 000000000..641314639 --- /dev/null +++ b/docs/pages/Routes/hashCode.html @@ -0,0 +1,177 @@ + + + + + + + + hashCode property - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/home-constant.html b/docs/pages/Routes/home-constant.html new file mode 100644 index 000000000..b1dee331f --- /dev/null +++ b/docs/pages/Routes/home-constant.html @@ -0,0 +1,148 @@ + + + + + + + + home constant - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            home
            + +
            + +
            + + + + +
            +
            + +

            home constant + Null safety +

            + +
            + String + const home + + +
            + +
            +

            The route name for the home page.

            +
            + + +
            +

            Implementation

            +
            static const String home = "home";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/login-constant.html b/docs/pages/Routes/login-constant.html new file mode 100644 index 000000000..da4a4bbf8 --- /dev/null +++ b/docs/pages/Routes/login-constant.html @@ -0,0 +1,148 @@ + + + + + + + + login constant - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            login
            + +
            + +
            + + + + +
            +
            + +

            login constant + Null safety +

            + +
            + String + const login + + +
            + +
            +

            The route name for the login page.

            +
            + + +
            +

            Implementation

            +
            static const String login = "login";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/noSuchMethod.html b/docs/pages/Routes/noSuchMethod.html new file mode 100644 index 000000000..88b55ec2e --- /dev/null +++ b/docs/pages/Routes/noSuchMethod.html @@ -0,0 +1,185 @@ + + + + + + + + noSuchMethod method - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/operator_equals.html b/docs/pages/Routes/operator_equals.html new file mode 100644 index 000000000..a3c74d376 --- /dev/null +++ b/docs/pages/Routes/operator_equals.html @@ -0,0 +1,176 @@ + + + + + + + + operator == method - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/reminders-constant.html b/docs/pages/Routes/reminders-constant.html new file mode 100644 index 000000000..875e2fef3 --- /dev/null +++ b/docs/pages/Routes/reminders-constant.html @@ -0,0 +1,148 @@ + + + + + + + + reminders constant - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            reminders
            + +
            + +
            + + + + +
            +
            + +

            reminders constant + Null safety +

            + +
            + String + const reminders + + +
            + +
            +

            The route name for the reminders page.

            +
            + + +
            +

            Implementation

            +
            static const String reminders = "reminders";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/runtimeType.html b/docs/pages/Routes/runtimeType.html new file mode 100644 index 000000000..deb563c78 --- /dev/null +++ b/docs/pages/Routes/runtimeType.html @@ -0,0 +1,152 @@ + + + + + + + + runtimeType property - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/schedule-constant.html b/docs/pages/Routes/schedule-constant.html new file mode 100644 index 000000000..d7b50e1ff --- /dev/null +++ b/docs/pages/Routes/schedule-constant.html @@ -0,0 +1,148 @@ + + + + + + + + schedule constant - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            schedule
            + +
            + +
            + + + + +
            +
            + +

            schedule constant + Null safety +

            + +
            + String + const schedule + + +
            + +
            +

            The route name for the schedule page.

            +
            + + +
            +

            Implementation

            +
            static const String schedule = "schedule";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/schedules-constant.html b/docs/pages/Routes/schedules-constant.html new file mode 100644 index 000000000..d3c638526 --- /dev/null +++ b/docs/pages/Routes/schedules-constant.html @@ -0,0 +1,148 @@ + + + + + + + + schedules constant - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            schedules
            + +
            + +
            + + + + +
            +
            + +

            schedules constant + Null safety +

            + +
            + String + const schedules + + +
            + +
            +

            The route name for the schedules manager page.

            +
            + + +
            +

            Implementation

            +
            static const String schedules = "schedules";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/sports-constant.html b/docs/pages/Routes/sports-constant.html new file mode 100644 index 000000000..fa60c151c --- /dev/null +++ b/docs/pages/Routes/sports-constant.html @@ -0,0 +1,148 @@ + + + + + + + + sports constant - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            sports
            + +
            + +
            + + + + +
            +
            + +

            sports constant + Null safety +

            + +
            + String + const sports + + +
            + +
            +

            The route name for the sports games page.

            +
            + + +
            +

            Implementation

            +
            static const String sports = "sports";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/Routes/toString.html b/docs/pages/Routes/toString.html new file mode 100644 index 000000000..976e012be --- /dev/null +++ b/docs/pages/Routes/toString.html @@ -0,0 +1,158 @@ + + + + + + + + toString method - Routes class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            +

            toString method + Null safety +

            + +
            + + +String +toString() + +
            inherited
            + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + +
            +

            Implementation

            +
            external String toString();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilder-class.html b/docs/pages/ScheduleBuilder-class.html new file mode 100644 index 000000000..18925f13f --- /dev/null +++ b/docs/pages/ScheduleBuilder-class.html @@ -0,0 +1,440 @@ + + + + + + + + ScheduleBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ScheduleBuilder
            + +
            + +
            + + + + +
            +
            + +

            ScheduleBuilder class + Null safety + +

            + + +
            +

            A widget to guide the admin in creating a Schedule.

            +

            The Schedule doesn't have to be created from scratch, it can be based on +an existing schedule by passing it as a parameter to ScheduleBuilder().

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + ScheduleBuilder([Schedule? preset]) +
            +
            + Creates a widget to guide the user in creating a schedule. +
            const
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + preset + Schedule? + +
            +
            + The Schedule to base this schedule on. +
            final
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + createElement() + StatefulElement + + + +
            +
            + Creates a StatefulElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + createState() + ScheduleBuilderState + + + +
            +
            + Creates the mutable state for this widget at a given location in the tree. [...] +
            override
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + +
            +

            Static Methods

            +
            +
            + buildSchedule(BuildContext context, [Schedule? preset]) + → Future<Schedule?> + + + +
            +
            + Returns the Schedule created by this widget. + + +
            + +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilder/ScheduleBuilder.html b/docs/pages/ScheduleBuilder/ScheduleBuilder.html new file mode 100644 index 000000000..a4ab95c6a --- /dev/null +++ b/docs/pages/ScheduleBuilder/ScheduleBuilder.html @@ -0,0 +1,149 @@ + + + + + + + + ScheduleBuilder constructor - ScheduleBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ScheduleBuilder
            + +
            + +
            + + + + +
            +
            + +

            ScheduleBuilder constructor + Null safety +

            + +
            const + ScheduleBuilder(
            1. [Schedule? preset]
            2. +
            ) +
            + + +
            +

            Creates a widget to guide the user in creating a schedule.

            +
            + + + +
            +

            Implementation

            +
            const ScheduleBuilder([this.preset]);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilder/buildSchedule.html b/docs/pages/ScheduleBuilder/buildSchedule.html new file mode 100644 index 000000000..d53dcb073 --- /dev/null +++ b/docs/pages/ScheduleBuilder/buildSchedule.html @@ -0,0 +1,161 @@ + + + + + + + + buildSchedule method - ScheduleBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            buildSchedule
            + +
            + +
            + + + + +
            +
            + +

            buildSchedule method + Null safety +

            + +
            + + +Future<Schedule?> +buildSchedule(
            1. BuildContext context,
            2. +
            3. [Schedule? preset]
            4. +
            ) + + + +
            + +
            +

            Returns the Schedule created by this widget.

            +
            + + + +
            +

            Implementation

            +
            static Future<Schedule?> buildSchedule(
            +	BuildContext context,
            +	[Schedule? preset]
            +) => showDialog(
            +	context: context,
            +	builder: (_) => ScheduleBuilder(preset),
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilder/createState.html b/docs/pages/ScheduleBuilder/createState.html new file mode 100644 index 000000000..20c0482d7 --- /dev/null +++ b/docs/pages/ScheduleBuilder/createState.html @@ -0,0 +1,171 @@ + + + + + + + + createState method - ScheduleBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            createState
            + +
            + +
            + + + + +
            +
            + +

            createState method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +ScheduleBuilderState +createState() + +
            override
            + +
            + +
            +

            Creates the mutable state for this widget at a given location in the tree.

            +

            Subclasses should override this method to return a newly created +instance of their associated State subclass:

            +
            @override
            +_MyState createState() => _MyState();
            +
            +

            The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

            +
            + + + +
            +

            Implementation

            +
            @override
            +ScheduleBuilderState createState() => ScheduleBuilderState();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilder/preset.html b/docs/pages/ScheduleBuilder/preset.html new file mode 100644 index 000000000..4a660b0c7 --- /dev/null +++ b/docs/pages/ScheduleBuilder/preset.html @@ -0,0 +1,151 @@ + + + + + + + + preset property - ScheduleBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            preset
            + +
            + +
            + + + + +
            +
            + +

            preset property + Null safety +

            + +
            + Schedule? + preset +
            final
            + +
            + +
            +

            The Schedule to base this schedule on.

            +
            + + +
            +

            Implementation

            +
            final Schedule? preset;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilderState-class.html b/docs/pages/ScheduleBuilderState-class.html new file mode 100644 index 000000000..88a557e09 --- /dev/null +++ b/docs/pages/ScheduleBuilderState-class.html @@ -0,0 +1,495 @@ + + + + + + + + ScheduleBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ScheduleBuilderState
            + +
            + +
            + + + + +
            +
            + +

            ScheduleBuilderState class + Null safety + +

            + + +
            +

            A state for a ScheduleBuilder.

            +

            A state is needed to keep the TextEditingController from rebuilding.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + ScheduleBuilderState() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + conflicting + ↔ bool + +
            +
            + If the name of the schedule conflicts with another one. [...] +
            read / write
            + +
            + +
            + context + BuildContext + +
            +
            + The location in the tree where this widget builds. [...] +
            read-only, inherited
            + +
            + +
            + controller + TextEditingController + +
            +
            + A controller to hold the name of the Schedule. [...] +
            final
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + mounted + → bool + +
            +
            + Whether this State object is currently in a tree. [...] +
            read-only, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            + widget + ScheduleBuilder + +
            +
            + The current configuration. [...] +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + deactivate() + → void + + + +
            +
            + Called when this object is removed from the tree. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + didChangeDependencies() + → void + + + +
            +
            + Called when a dependency of this State object changes. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + didUpdateWidget(covariant ScheduleBuilder oldWidget) + → void + + + +
            +
            + Called whenever the widget configuration changes. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + dispose() + → void + + + +
            +
            + Called when this object is removed from the tree permanently. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + initState() + → void + + + +
            +
            + Called when this object is inserted into the tree. [...] +
            override
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + reassemble() + → void + + + +
            +
            + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + setState(VoidCallback fn) + → void + + + +
            +
            + Notify the framework that the internal state of this object has changed. [...] +
            @protected, inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilderState/ScheduleBuilderState.html b/docs/pages/ScheduleBuilderState/ScheduleBuilderState.html new file mode 100644 index 000000000..b3f20b206 --- /dev/null +++ b/docs/pages/ScheduleBuilderState/ScheduleBuilderState.html @@ -0,0 +1,145 @@ + + + + + + + + ScheduleBuilderState constructor - ScheduleBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ScheduleBuilderState
            + +
            + +
            + + + + +
            +
            + +

            ScheduleBuilderState constructor + Null safety +

            + +
            + ScheduleBuilderState() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilderState/build.html b/docs/pages/ScheduleBuilderState/build.html new file mode 100644 index 000000000..e5fa5b01d --- /dev/null +++ b/docs/pages/ScheduleBuilderState/build.html @@ -0,0 +1,350 @@ + + + + + + + + build method - ScheduleBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method in a number of different situations. For +example:

            + +

            This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

            +

            Design discussion

            +

            Why is the build method on State, and not StatefulWidget?

            +

            Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

            +

            For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

            +

            Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

            +

            Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

            +
            class MyButton extends StatefulWidget {
            +  ...
            +  final Color color;
            +
            +  @override
            +  Widget build(BuildContext context, MyButtonState state) {
            +    ... () { print("color: $color"); } ...
            +  }
            +}
            +
            +

            For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

            +

            In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

            +
            class MyButtonState extends State<MyButton> {
            +  ...
            +  @override
            +  Widget build(BuildContext context) {
            +    ... () { print("color: ${widget.color}"); } ...
            +  }
            +}
            +
            +

            Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

            +

            See also:

            +
              +
            • StatefulWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override
            +Widget build(BuildContext context) => ModelListener<ScheduleBuilderModel>(
            +	model: () => ScheduleBuilderModel(widget.preset),
            +	builder: (_, ScheduleBuilderModel model, Widget? cancel) => Scaffold(
            +		appBar: AppBar(
            +			title: const Text("Make new schedule"),
            +			actions: [
            +				IconButton(
            +					icon: const Icon(Icons.sync),
            +					tooltip: "Use preset",
            +					onPressed: () async {
            +						final Schedule? schedule = await showModalBottomSheet<Schedule?>(
            +							context: context,
            +							builder: (BuildContext context) => ListView(
            +								children: [
            +									const SizedBox(
            +										width: double.infinity,
            +										height: 60,
            +										child: Center(
            +											child: Text("Use a preset", textScaleFactor: 1.5),
            +										),
            +									),
            +									for (final Schedule schedule in Schedule.schedules)
            +										ListTile(
            +											title: Text (schedule.name),
            +											onTap: () => Navigator.of(context).pop(schedule),
            +										),
            +								]
            +							)
            +						);
            +						if (schedule != null) {
            +							controller.text = schedule.name;
            +							model.usePreset(schedule);
            +						}
            +					}
            +				),
            +			]
            +		),
            +		floatingActionButton: FloatingActionButton.extended(
            +			label: const Text("Save"),
            +			icon: const Icon(Icons.done),
            +			onPressed: !model.ready ? null :
            +				() => Navigator.of(context).pop(model.schedule),
            +			backgroundColor: model.ready
            +				? Theme.of(context).accentColor
            +				: Theme.of(context).disabledColor,
            +		),
            +		body: ListView(
            +			padding: const EdgeInsets.all(15),
            +			children: [
            +				Padding(
            +					padding: const EdgeInsets.symmetric(horizontal: 10),
            +					child: TextField(
            +						controller: controller,
            +						onChanged: (String value) {
            +							conflicting = Schedule.schedules.any(
            +								(Schedule other) => other.name == value
            +							);
            +							model.name = value;
            +						},
            +						textInputAction: TextInputAction.done,
            +						textCapitalization: TextCapitalization.sentences,
            +						decoration: InputDecoration(
            +							labelText: "Name",
            +							hintText: "Name of the schedule",
            +							errorText: conflicting
            +								? "Name cannot match an existing schedule's name"
            +								: null,
            +						),
            +					),
            +				),
            +				const SizedBox(height: 20),
            +				for (int index = 0; index < model.numPeriods; index++)
            +					PeriodTile(
            +						model: model,
            +						range: model.periods [index].time,
            +						index: index,
            +					),
            +				Row(
            +					children: [
            +						TextButton.icon(
            +							icon: const Icon (Icons.add),
            +							label: const Text("Add"),
            +							onPressed: () => model.numPeriods++,
            +						),
            +						if (model.numPeriods > 0)
            +							TextButton.icon(
            +								icon: const Icon(Icons.remove),
            +								label: const Text("Remove"),
            +								onPressed: () => model.numPeriods--
            +							),
            +					]
            +				),
            +				if (model.numPeriods == 0)
            +					const Text(
            +						"You can also select a preset by clicking the button on top",
            +						textScaleFactor: 1.5,
            +						textAlign: TextAlign.center,
            +					),
            +			]
            +		)
            +	)
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilderState/conflicting.html b/docs/pages/ScheduleBuilderState/conflicting.html new file mode 100644 index 000000000..7bc231fab --- /dev/null +++ b/docs/pages/ScheduleBuilderState/conflicting.html @@ -0,0 +1,158 @@ + + + + + + + + conflicting property - ScheduleBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            conflicting
            + +
            + +
            + + + + +
            +
            + +

            conflicting property + Null safety +

            + +
            + bool + conflicting +
            read / write
            + +
            + +
            +

            If the name of the schedule conflicts with another one.

            +

            Names of custom schedules cannot conflict with the default schedules, since +users will be confused when the app displays a familiar schedule name, but +updates at unusual times.

            +
            + + +
            +

            Implementation

            +
            bool conflicting = false;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilderState/controller.html b/docs/pages/ScheduleBuilderState/controller.html new file mode 100644 index 000000000..809ee9b86 --- /dev/null +++ b/docs/pages/ScheduleBuilderState/controller.html @@ -0,0 +1,156 @@ + + + + + + + + controller property - ScheduleBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            controller
            + +
            + +
            + + + + +
            +
            + +

            controller property + Null safety +

            + +
            + TextEditingController + controller +
            final
            + +
            + +
            +

            A controller to hold the name of the Schedule.

            +

            This will be preset with the name of ScheduleBuilder.preset.

            +
            + + +
            +

            Implementation

            +
            final TextEditingController controller = TextEditingController();
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/ScheduleBuilderState/initState.html b/docs/pages/ScheduleBuilderState/initState.html new file mode 100644 index 000000000..52e415455 --- /dev/null +++ b/docs/pages/ScheduleBuilderState/initState.html @@ -0,0 +1,189 @@ + + + + + + + + initState method - ScheduleBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            initState
            + +
            + +
            + + + + +
            +
            + +

            initState method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +void +initState() + +
            override
            + +
            + +
            +

            Called when this object is inserted into the tree.

            +

            The framework will call this method exactly once for each State object +it creates.

            +

            Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

            +

            If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

            +
              +
            • In initState, subscribe to the object.
            • +
            • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
            • +
            • In dispose, unsubscribe from the object.
            • +
            +

            You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

            +

            If you override this, make sure your method starts with a call to +super.initState().

            +
            + + + +
            +

            Implementation

            +
            @override
            +void initState() {
            +	super.initState();
            +	controller.text = widget.preset?.name ?? "";
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportBuilderState-class.html b/docs/pages/SportBuilderState-class.html new file mode 100644 index 000000000..45dbb6406 --- /dev/null +++ b/docs/pages/SportBuilderState-class.html @@ -0,0 +1,495 @@ + + + + + + + + SportBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            SportBuilderState
            + +
            + +
            + + + + +
            +
            + +

            SportBuilderState class + Null safety + +

            + + +
            +

            A state for SportsBuilder.

            +

            This state keeps TextEditingControllers intact.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + SportBuilderState() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + context + BuildContext + +
            +
            + The location in the tree where this widget builds. [...] +
            read-only, inherited
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + mounted + → bool + +
            +
            + Whether this State object is currently in a tree. [...] +
            read-only, inherited
            + +
            + +
            + opponentController + TextEditingController + +
            +
            + A controller to hold SportsBuilder.parent's opponent. +
            final
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            + teamController + TextEditingController + +
            +
            + A controller to hold SportsBuilder.parent's team name. +
            final
            + +
            + +
            + widget + SportsBuilder + +
            +
            + The current configuration. [...] +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + deactivate() + → void + + + +
            +
            + Called when this object is removed from the tree. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + didChangeDependencies() + → void + + + +
            +
            + Called when a dependency of this State object changes. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + didUpdateWidget(covariant SportsBuilder oldWidget) + → void + + + +
            +
            + Called whenever the widget configuration changes. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + dispose() + → void + + + +
            +
            + Called when this object is removed from the tree permanently. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + initState() + → void + + + +
            +
            + Called when this object is inserted into the tree. [...] +
            override
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + reassemble() + → void + + + +
            +
            + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + setState(VoidCallback fn) + → void + + + +
            +
            + Notify the framework that the internal state of this object has changed. [...] +
            @protected, inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportBuilderState/SportBuilderState.html b/docs/pages/SportBuilderState/SportBuilderState.html new file mode 100644 index 000000000..ce4ef6ab7 --- /dev/null +++ b/docs/pages/SportBuilderState/SportBuilderState.html @@ -0,0 +1,145 @@ + + + + + + + + SportBuilderState constructor - SportBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            SportBuilderState
            + +
            + +
            + + + + +
            +
            + +

            SportBuilderState constructor + Null safety +

            + +
            + SportBuilderState() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportBuilderState/build.html b/docs/pages/SportBuilderState/build.html new file mode 100644 index 000000000..1b120195d --- /dev/null +++ b/docs/pages/SportBuilderState/build.html @@ -0,0 +1,370 @@ + + + + + + + + build method - SportBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method in a number of different situations. For +example:

            + +

            This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

            +

            Design discussion

            +

            Why is the build method on State, and not StatefulWidget?

            +

            Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

            +

            For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

            +

            Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

            +

            Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

            +
            class MyButton extends StatefulWidget {
            +  ...
            +  final Color color;
            +
            +  @override
            +  Widget build(BuildContext context, MyButtonState state) {
            +    ... () { print("color: $color"); } ...
            +  }
            +}
            +
            +

            For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

            +

            In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

            +
            class MyButtonState extends State<MyButton> {
            +  ...
            +  @override
            +  Widget build(BuildContext context) {
            +    ... () { print("color: ${widget.color}"); } ...
            +  }
            +}
            +
            +

            Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

            +

            See also:

            +
              +
            • StatefulWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override
            +Widget build(BuildContext context) => ModelListener<SportsBuilderModel>(
            +	model: () => SportsBuilderModel(widget.parent),
            +	builder: (_, SportsBuilderModel model, __) => Scaffold(
            +		appBar: AppBar(title: const Text("Add game")),
            +		bottomSheet: !model.loading ? null : Container(
            +			height: 60,
            +			padding: const EdgeInsets.all(10),
            +			child: Row(
            +				mainAxisAlignment: MainAxisAlignment.spaceBetween,
            +				children: const [Text("Saving..."), CircularProgressIndicator()]
            +			)
            +		),
            +		body: ListView(
            +			padding: const EdgeInsets.all(20),
            +			children: [
            +				FormRow(
            +					"Sport",
            +					DropdownButtonFormField<Sport>(
            +						hint: const Text("Choose a sport"),
            +						value: model.sport,
            +						onChanged: (Sport? value) => model.sport = value,
            +						items: [
            +							for (final Sport sport in Sport.values)
            +								DropdownMenuItem<Sport>(
            +									value: sport,
            +									child: Text(SportsGame.capitalize(sport))
            +								)
            +						],
            +					),
            +					sized: true,
            +				),
            +				FormRow(
            +					"Team",
            +					TextField(
            +						onChanged: (String value) => model.team = value,
            +						textCapitalization: TextCapitalization.words,
            +						controller: teamController,
            +					),
            +					sized: true,
            +				),
            +				FormRow(
            +					"Opponent",
            +					TextField(
            +						onChanged: (String value) => model.opponent = value,
            +						textCapitalization: TextCapitalization.words,
            +						controller: opponentController,
            +					),
            +					sized: true,
            +				),
            +				FormRow(
            +					"Away game",
            +					Checkbox(
            +						value: model.away,
            +						// If tristate == false (default), value never be null
            +						onChanged: (bool? value) => model.away = value!,
            +					),
            +				),
            +				FormRow.editable(
            +					title: "Date",
            +					value: SportsTile.formatDate(model.date),
            +					whenNull: Icons.date_range,
            +					setNewValue: () async => model.date = await pickDate(
            +						initialDate: DateTime.now(),
            +						context: context
            +					),
            +				),
            +				FormRow.editable(
            +					title: "Start time",
            +					value: model.start?.format(context),
            +					whenNull: Icons.access_time,
            +					setNewValue: () async => model.start = await showTimePicker(
            +						context: context,
            +						initialTime: model.start ?? TimeOfDay.now(),
            +					),
            +				),
            +				FormRow.editable(
            +					title: "End time",
            +					value: model.end?.format(context),
            +					whenNull: Icons.access_time,
            +					setNewValue: () async => model.end = await showTimePicker(
            +						context: context,
            +						initialTime: model.end ?? TimeOfDay.now(),
            +					),
            +				),
            +				const SizedBox(height: 10),
            +				Row(
            +					mainAxisAlignment: MainAxisAlignment.spaceBetween,
            +					children: [
            +						const Text(
            +							"Tap on the card to change the scores",
            +							textScaleFactor: 0.9
            +						),
            +						TextButton(
            +							onPressed: () => model.scores = null,
            +							child: const Text("Clear"),
            +						)
            +					]
            +				),
            +				const SizedBox(height: 20),
            +				SportsTile(
            +					model.game,
            +					onTap: () async => model.scores =
            +						await SportsScoreUpdater.updateScores(context, model.game)
            +							?? model.scores
            +				),
            +				ButtonBar(
            +					children: [
            +						TextButton(
            +							onPressed: () => Navigator.of(context).pop(),
            +							child: const Text("Cancel"),
            +						),
            +						ElevatedButton(
            +							onPressed: !model.ready ? null :
            +								() => Navigator.of(context).pop(model.game),
            +							child: const Text("Save"),
            +						)
            +					]
            +				)
            +			]
            +		)
            +	)
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportBuilderState/initState.html b/docs/pages/SportBuilderState/initState.html new file mode 100644 index 000000000..84bed273b --- /dev/null +++ b/docs/pages/SportBuilderState/initState.html @@ -0,0 +1,190 @@ + + + + + + + + initState method - SportBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            initState
            + +
            + +
            + + + + +
            +
            + +

            initState method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +void +initState() + +
            override
            + +
            + +
            +

            Called when this object is inserted into the tree.

            +

            The framework will call this method exactly once for each State object +it creates.

            +

            Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

            +

            If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

            +
              +
            • In initState, subscribe to the object.
            • +
            • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
            • +
            • In dispose, unsubscribe from the object.
            • +
            +

            You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

            +

            If you override this, make sure your method starts with a call to +super.initState().

            +
            + + + +
            +

            Implementation

            +
            @override
            +void initState() {
            +	teamController.text = widget.parent?.team ?? "";
            +	opponentController.text = widget.parent?.opponent ?? "";
            +	super.initState();
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportBuilderState/opponentController.html b/docs/pages/SportBuilderState/opponentController.html new file mode 100644 index 000000000..9c791b624 --- /dev/null +++ b/docs/pages/SportBuilderState/opponentController.html @@ -0,0 +1,155 @@ + + + + + + + + opponentController property - SportBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            opponentController
            + +
            + +
            + + + + +
            +
            + +

            opponentController property + Null safety +

            + +
            + TextEditingController + opponentController +
            final
            + +
            + +
            +

            A controller to hold SportsBuilder.parent's opponent.

            +
            + + +
            +

            Implementation

            +
            final TextEditingController opponentController = TextEditingController();
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportBuilderState/teamController.html b/docs/pages/SportBuilderState/teamController.html new file mode 100644 index 000000000..27ff58dd4 --- /dev/null +++ b/docs/pages/SportBuilderState/teamController.html @@ -0,0 +1,155 @@ + + + + + + + + teamController property - SportBuilderState class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            teamController
            + +
            + +
            + + + + +
            +
            + +

            teamController property + Null safety +

            + +
            + TextEditingController + teamController +
            final
            + +
            + +
            +

            A controller to hold SportsBuilder.parent's team name.

            +
            + + +
            +

            Implementation

            +
            final TextEditingController teamController = TextEditingController();
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportsBuilder-class.html b/docs/pages/SportsBuilder-class.html new file mode 100644 index 000000000..95ea4d442 --- /dev/null +++ b/docs/pages/SportsBuilder-class.html @@ -0,0 +1,441 @@ + + + + + + + + SportsBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            SportsBuilder
            + +
            + +
            + + + + +
            +
            + +

            SportsBuilder class + Null safety + +

            + + +
            +

            A page to create a Sports game.

            +

            This widget is stateful to provide a TextEditingController that has its +text preset to parent's properties (if applicable). All state is still +managed by the view model.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + SportsBuilder([SportsGame? parent]) +
            +
            + Creates a page to build a SportsGame. [...] +
            const
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + parent + SportsGame? + +
            +
            + Fills all the properties on this page with the properties of this game. +
            final
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + createElement() + StatefulElement + + + +
            +
            + Creates a StatefulElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + createState() + SportBuilderState + + + +
            +
            + Creates the mutable state for this widget at a given location in the tree. [...] +
            override
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + +
            +

            Static Methods

            +
            +
            + createGame(BuildContext context, [SportsGame? parent]) + → Future<SportsGame?> + + + +
            +
            + Opens a form for the user to + + +
            + +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportsBuilder/SportsBuilder.html b/docs/pages/SportsBuilder/SportsBuilder.html new file mode 100644 index 000000000..c19f6a61c --- /dev/null +++ b/docs/pages/SportsBuilder/SportsBuilder.html @@ -0,0 +1,151 @@ + + + + + + + + SportsBuilder constructor - SportsBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            SportsBuilder
            + +
            + +
            + + + + +
            +
            + +

            SportsBuilder constructor + Null safety +

            + +
            const + SportsBuilder(
            1. [SportsGame? parent]
            2. +
            ) +
            + + +
            +

            Creates a page to build a SportsGame.

            +

            Passing in parent will fill in the properties of the page with the +properties of parent.

            +
            + + + +
            +

            Implementation

            +
            const SportsBuilder([this.parent]);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportsBuilder/createGame.html b/docs/pages/SportsBuilder/createGame.html new file mode 100644 index 000000000..87395c072 --- /dev/null +++ b/docs/pages/SportsBuilder/createGame.html @@ -0,0 +1,162 @@ + + + + + + + + createGame method - SportsBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            createGame
            + +
            + +
            + + + + +
            +
            + +

            createGame method + Null safety +

            + +
            + + +Future<SportsGame?> +createGame(
            1. BuildContext context,
            2. +
            3. [SportsGame? parent]
            4. +
            ) + + + +
            + +
            +

            Opens a form for the user to

            +
            + + + +
            +

            Implementation

            +
            static Future<SportsGame?> createGame(
            +	BuildContext context,
            +	[SportsGame? parent]
            +) => Navigator.of(context).push<SportsGame>(
            +	MaterialPageRoute(
            +		builder: (BuildContext context) => SportsBuilder(parent),
            +	)
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportsBuilder/createState.html b/docs/pages/SportsBuilder/createState.html new file mode 100644 index 000000000..5cec398ca --- /dev/null +++ b/docs/pages/SportsBuilder/createState.html @@ -0,0 +1,171 @@ + + + + + + + + createState method - SportsBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            createState
            + +
            + +
            + + + + +
            +
            + +

            createState method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +SportBuilderState +createState() + +
            override
            + +
            + +
            +

            Creates the mutable state for this widget at a given location in the tree.

            +

            Subclasses should override this method to return a newly created +instance of their associated State subclass:

            +
            @override
            +_MyState createState() => _MyState();
            +
            +

            The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

            +
            + + + +
            +

            Implementation

            +
            @override
            +SportBuilderState createState() => SportBuilderState();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportsBuilder/parent.html b/docs/pages/SportsBuilder/parent.html new file mode 100644 index 000000000..308edbaaa --- /dev/null +++ b/docs/pages/SportsBuilder/parent.html @@ -0,0 +1,151 @@ + + + + + + + + parent property - SportsBuilder class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            parent
            + +
            + +
            + + + + +
            +
            + +

            parent property + Null safety +

            + +
            + SportsGame? + parent +
            final
            + +
            + +
            +

            Fills all the properties on this page with the properties of this game.

            +
            + + +
            +

            Implementation

            +
            final SportsGame? parent;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportsPage-class.html b/docs/pages/SportsPage-class.html new file mode 100644 index 000000000..1b6eb5c57 --- /dev/null +++ b/docs/pages/SportsPage-class.html @@ -0,0 +1,406 @@ + + + + + + + + SportsPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            SportsPage
            + +
            + +
            + + + + +
            +
            + +

            SportsPage class + Null safety + +

            + + +
            +

            A page to show recent and upcoming games to the user.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + SportsPage() +
            +
            + +
            const
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + createElement() + StatelessElement + + + +
            +
            + Creates a StatelessElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportsPage/SportsPage.html b/docs/pages/SportsPage/SportsPage.html new file mode 100644 index 000000000..2acbe6aee --- /dev/null +++ b/docs/pages/SportsPage/SportsPage.html @@ -0,0 +1,142 @@ + + + + + + + + SportsPage constructor - SportsPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            SportsPage
            + +
            + +
            + + + + +
            +
            + +

            SportsPage constructor + Null safety +

            + +
            const + SportsPage() +
            + + + + + +
            +

            Implementation

            +
            const SportsPage();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/SportsPage/build.html b/docs/pages/SportsPage/build.html new file mode 100644 index 000000000..6fc37fda7 --- /dev/null +++ b/docs/pages/SportsPage/build.html @@ -0,0 +1,199 @@ + + + + + + + + build method - SportsPage class - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

            +

            The implementation of this method must only depend on:

            + +

            If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

            +

            See also:

            +
              +
            • StatelessWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override
            +Widget build(BuildContext context) => DefaultTabController(
            +	length: 2,
            +	child: ModelListener<SportsModel>(
            +		model: () => SportsModel(Models.instance.sports),
            +		builder: (_, SportsModel model, __) => ResponsiveScaffold(
            +			appBar: buildAppBar(model),
            +			drawer: const NavigationDrawer(),
            +			bodyBuilder: (_) => getLayout(context, model),
            +		),
            +	)
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/buildAppBar.html b/docs/pages/buildAppBar.html new file mode 100644 index 000000000..dc2f7b016 --- /dev/null +++ b/docs/pages/buildAppBar.html @@ -0,0 +1,195 @@ + + + + + + + + buildAppBar function - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            buildAppBar
            + +
            + +
            + + + + +
            +
            + +

            buildAppBar function + Null safety + +

            + +
            + + +AppBar +buildAppBar(
            1. SportsModel model
            2. +
            ) + +
            + + + + +
            +

            Implementation

            +
            AppBar buildAppBar(SportsModel model) => AppBar(
            +	title: const Text("Sports"),
            +	bottom: const TabBar(
            +		tabs: [
            +			Tab(text: "Upcoming"),
            +			Tab(text: "Recent"),
            +		]
            +	),
            +	actions: [
            +		ModelListener<SportsModel>(
            +			model: () => model,
            +			dispose: false,
            +			builder: (BuildContext context, __, ___) => !model.isAdmin ? Container()
            +				: IconButton(
            +					icon: const Icon(Icons.add),
            +					tooltip: "Add a game",
            +					onPressed: model.adminFunc(() async =>
            +						model.data.addGame(await SportsBuilder.createGame(context))
            +					),
            +				),
            +		),
            +    PopupMenuButton(
            +      icon: const Icon(Icons.sort),
            +      onSelected: (SortOption option) => model.sortOption = option,
            +      tooltip: "Sort games",
            +      itemBuilder: (_) => [
            +        const PopupMenuItem(
            +          value: SortOption.chronological,
            +          child: Text("By date"),
            +        ),
            +        const PopupMenuItem(
            +          value: SortOption.sport,
            +          child: Text("By sport"),
            +        )
            +      ]
            +    ),
            +    IconButton(
            +    	icon: const Icon(Icons.live_tv),
            +    	onPressed: () => launch(Urls.sportsLivestream),
            +    	tooltip: "Watch livestream",
            +  	)
            +	]
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/getLayout.html b/docs/pages/getLayout.html new file mode 100644 index 000000000..7faec9960 --- /dev/null +++ b/docs/pages/getLayout.html @@ -0,0 +1,198 @@ + + + + + + + + getLayout function - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            getLayout
            + +
            + +
            + + + + +
            +
            + +

            getLayout function + Null safety + +

            + +
            + + +Widget +getLayout(
            1. BuildContext context,
            2. +
            3. SportsModel model
            4. +
            ) + +
            + +
            +

            Creates a GenericSportsView based on the sorting option.

            +
            + + + +
            +

            Implementation

            +
            Widget getLayout(BuildContext context, SportsModel model) {
            +	switch(model.sortOption) {
            +		case SortOption.chronological:
            +			return GenericSportsView<int>(
            +				loading: model.loading,
            +				onRefresh: model.adminFunc(Services.instance.database.updateSports),
            +				recents: model.recents,
            +				upcoming: model.upcoming,
            +				builder: (int index) => SportsTile(
            +					model.data.games [index],
            +					onTap: !model.isAdmin ? null : () => openMenu(
            +						context: context,
            +						index: index,
            +						model: model,
            +					)
            +				),
            +			);
            +		case SortOption.sport:
            +			return GenericSportsView<MapEntry<Sport, List<int>>>(
            +				loading: model.loading,
            +				onRefresh: model.adminFunc(Services.instance.database.updateSports),
            +				recents: model.recentBySport.entries.toList(),
            +				upcoming: model.upcomingBySport.entries.toList(),
            +				builder: (MapEntry<Sport, List<int>> entry) => Column(
            +					children: [
            +						const SizedBox(height: 15),
            +						Text(SportsGame.capitalize(entry.key)),
            +						for (final int index in entry.value)
            +							SportsTile(
            +								model.data.games [index],
            +								onTap: !model.isAdmin ? null : () => openMenu(
            +									context: context,
            +									index: index,
            +									model: model
            +								)
            +							),
            +						const SizedBox(height: 20),
            +					]
            +				)
            +			);
            +	}
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/openMenu.html b/docs/pages/openMenu.html new file mode 100644 index 000000000..c1da585ee --- /dev/null +++ b/docs/pages/openMenu.html @@ -0,0 +1,243 @@ + + + + + + + + openMenu function - pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            openMenu
            + +
            + +
            + + + + +
            +
            + +

            openMenu function + Null safety + +

            + +
            + + +void +openMenu(
            1. {required BuildContext context,
            2. +
            3. required int index,
            4. +
            5. required SportsModel model}
            6. +
            ) + +
            + +
            +

            Opens a menu with options for the selected game.

            +

            This menu can only be accessed by administrators.

            +
            + + + +
            +

            Implementation

            +
            void openMenu({
            +	required BuildContext context,
            +	required int index,
            +	required SportsModel model
            +}) => showDialog(
            +	context: context,
            +	builder: (BuildContext newContext) => SimpleDialog(
            +		title: Text(model.data.games [index].description),
            +		children: [
            +			SimpleDialogOption(
            +			  onPressed: () async {
            +			  	Navigator.of(newContext).pop();
            +			  	final Scores? scores = await SportsScoreUpdater.updateScores(
            +		  			context, model.data.games [index]
            +	  			);
            +			  	if (scores == null) {
            +			  		return;
            +			  	}
            +			  	model.loading = true;
            +			  	await Models.instance.sports.replace(
            +				  	index,
            +				  	model.data.games [index].replaceScores(scores)
            +		  		);
            +			  	model.loading = false;
            +		  	},
            +			  child: const Text("Edit scores", textScaleFactor: 1.2),
            +			),
            +			const SizedBox(height: 10),
            +			SimpleDialogOption(
            +				onPressed: () async {
            +			  	Navigator.of(newContext).pop();
            +			  	model.loading = true;
            +			  	await Models.instance.sports.replace(
            +				  	index,
            +				  	model.data.games [index].replaceScores(null)
            +		  		);
            +			  	model.loading = false;
            +				},
            +				child: const Text("Remove scores", textScaleFactor: 1.2),
            +			),
            +			const SizedBox(height: 10),
            +			SimpleDialogOption(
            +			  onPressed: () async {
            +			  	Navigator.of(newContext).pop();
            +			  	model.loading = true;
            +			  	await Models.instance.sports.replace(
            +				  	index,
            +				  	await SportsBuilder.createGame(context, model.data.games [index])
            +			  	);
            +			  	model.loading = false;
            +		  	},
            +			  child: const Text("Edit game", textScaleFactor: 1.2),
            +			),
            +			const SizedBox(height: 10),
            +			SimpleDialogOption(
            +			  onPressed: () async {
            +			  	Navigator.of(newContext).pop();
            +			  	final bool? confirm = await showDialog(
            +			  		context: context,
            +			  		builder: (BuildContext context) => AlertDialog(
            +			  			title: const Text("Confirm"),
            +			  			content: const Text("Are you sure you want to delete this game?"),
            +			  			actions: [
            +			  				TextButton(
            +			  					onPressed: () => Navigator.of(context).pop(false),
            +			  					child: const Text("Cancel"),
            +		  					),
            +		  					ElevatedButton(
            +		  						onPressed: () => Navigator.of(context).pop(true),
            +		  						child: const Text("Confirm"),
            +	  						)
            +			  			]
            +		  			)
            +		  		);
            +		  		if (confirm ?? false) {
            +		  			model.loading = true;
            +				  	await Models.instance.sports.delete(index);
            +		  			model.loading = false;
            +				  }
            +			  },
            +			  child: const Text("Remove game", textScaleFactor: 1.2),
            +			),
            +		]
            +	)
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/pages/pages-library.html b/docs/pages/pages-library.html new file mode 100644 index 000000000..3889d684f --- /dev/null +++ b/docs/pages/pages-library.html @@ -0,0 +1,410 @@ + + + + + + + + pages library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            pages
            + +
            + +
            + + + + +
            +
            + +

            pages library + Null safety + +

            + + + + +
            +

            Classes

            + +
            +
            + AdminCalendarPage + +
            +
            + A page for admins to modify the calendar in the database. +
            + +
            + AdminCalendarState + +
            +
            + +
            + +
            + AdminSchedulesPage + +
            +
            + A page to show the admin's custom schedules. +
            + +
            + DayBuilder + +
            +
            + A widget to guide the admin in modifying a day in the calendar. [...] +
            + +
            + FeedbackPage + +
            +
            + A page to submit feedback. +
            + +
            + FormRow + +
            +
            + A row in a form. [...] +
            + +
            + GenericSportsView<T> + +
            +
            + A Swipe to Refresh list of SportsGames. [...] +
            + +
            + HomePage + +
            +
            + +
            + +
            + HomePageState + +
            +
            + +
            + +
            + Login + +
            +
            + The login page. [...] +
            + +
            + LoginState + +
            +
            + A state for the login page. [...] +
            + + +
            + A drawer to show throughout the app. +
            + +
            + OldCalendarWidget + +
            +
            + A widget to represent a calendar icon. [...] +
            + +
            + ReminderBuilder + +
            +
            + A widget to help the user create a Reminder. [...] +
            + +
            + ReminderBuilderState + +
            +
            + A state for a ReminderBuilder. [...] +
            + +
            + ResponsiveReminders + +
            +
            + +
            + +
            + ResponsiveSchedule + +
            +
            + +
            + +
            + RouteInitializer + +
            +
            + A route that performs initialization logic first. +
            + +
            + RouteInitializerState + +
            +
            + The state for a RouteInitializer. +
            + +
            + Routes + +
            +
            + Route names for each page in the app. [...] +
            + +
            + ScheduleBuilder + +
            +
            + A widget to guide the admin in creating a Schedule. [...] +
            + +
            + ScheduleBuilderState + +
            +
            + A state for a ScheduleBuilder. [...] +
            + +
            + SportBuilderState + +
            +
            + A state for SportsBuilder. [...] +
            + +
            + SportsBuilder + +
            +
            + A page to create a Sports game. [...] +
            + +
            + SportsPage + +
            +
            + A page to show recent and upcoming games to the user. +
            + +
            +
            + + + + + +
            +

            Functions

            + +
            +
            + buildAppBar(SportsModel model) + AppBar + + + +
            +
            + + + +
            + +
            + getLayout(BuildContext context, SportsModel model) + Widget + + + +
            +
            + Creates a GenericSportsView based on the sorting option. + + +
            + +
            + openMenu({required BuildContext context, required int index, required SportsModel model}) + → void + + + +
            +
            + Opens a menu with options for the selected game. [...] + + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth-class.html b/docs/ramaz_services/Auth-class.html new file mode 100644 index 000000000..671c3b801 --- /dev/null +++ b/docs/ramaz_services/Auth-class.html @@ -0,0 +1,444 @@ + + + + + + + + Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Auth
            + +
            + +
            + + + + +
            +
            + +

            Auth class + Null safety + +

            + + +
            +

            An abstraction around FirebaseAuth.

            +

            This class handles all authentication operations via static methods. Do +not create an instance of this class; it is not a Service. Instead, use +it from within other services.

            +
            + + + +
            +

            Constructors

            + +
            +
            + Auth() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Static Properties

            + +
            +
            + adminScopes + → Future<List<String>?> + +
            +
            + The scopes of an admin. [...] +
            read-only
            + +
            + +
            + auth + FirebaseAuth + +
            +
            + The FirebaseAuth service. +
            final
            + +
            + +
            + claims + → Future<Map<String, dynamic>?> + +
            +
            + Gets the user's custom claims. [...] +
            read-only
            + +
            + +
            + email + → String? + +
            +
            + The user's email. [...] +
            read-only
            + +
            + +
            + google + GoogleSignIn + +
            +
            + The GoogleSignIn service. +
            final
            + +
            + +
            + isAdmin + → Future<bool> + +
            +
            + Whether the user is an admin. [...] +
            read-only
            + +
            + +
            + isCalendarAdmin + → Future<bool> + +
            +
            + Whether the user is an admin for the calendar. +
            read-only
            + +
            + +
            + isSignedIn + → bool + +
            +
            + Determines whether the user is currently logged +
            read-only
            + +
            + +
            + isSportsAdmin + → Future<bool> + +
            +
            + Whether the user is an admin for sports games. +
            read-only
            + +
            + +
            + name + → String? + +
            +
            + The user's full name. +
            read-only
            + +
            + +
            +
            + +
            +

            Static Methods

            +
            +
            + signIn() + → Future<void> + + + +
            +
            + Signs the user in using Google as a provider. + + +
            + +
            + signOut() + → Future<void> + + + +
            +
            + Signs out the currently logged in user. + + +
            + +
            +
            + +
            +

            Constants

            + +
            +
            + calendarScope + → const String + + +
            +
            + The scope for calendar admins. [...] + + +
            + "calendar" +
            +
            + +
            + sportsScope + → const String + + +
            +
            + The scope for sports admins. [...] + + +
            + "sports" +
            +
            + +
            +
            + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/Auth.html b/docs/ramaz_services/Auth/Auth.html new file mode 100644 index 000000000..5e3d8ad9f --- /dev/null +++ b/docs/ramaz_services/Auth/Auth.html @@ -0,0 +1,146 @@ + + + + + + + + Auth constructor - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Auth
            + +
            + +
            + + + + +
            +
            + +

            Auth constructor + Null safety +

            + +
            + Auth() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/adminScopes.html b/docs/ramaz_services/Auth/adminScopes.html new file mode 100644 index 000000000..555d39bc8 --- /dev/null +++ b/docs/ramaz_services/Auth/adminScopes.html @@ -0,0 +1,168 @@ + + + + + + + + adminScopes property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            adminScopes
            + +
            + +
            + + + + +
            +
            + +

            adminScopes property + Null safety +

            + + + +
            + +
            + Future<List<String>?> + adminScopes + + +
            + + +
            +

            The scopes of an admin.

            +

            Returns null if the user is not an admin (ie, isAdmin returns false).

            +
            + + +
            +

            Implementation

            +
            static Future<List<String>?> get adminScopes async {
            +	final Iterable? customClaims = (await claims) ?["scopes"];
            +	return customClaims == null ? null : [
            +		for (final String scope in customClaims)
            +			scope.toString()
            +	];
            +}
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/auth.html b/docs/ramaz_services/Auth/auth.html new file mode 100644 index 000000000..5a8339bba --- /dev/null +++ b/docs/ramaz_services/Auth/auth.html @@ -0,0 +1,156 @@ + + + + + + + + auth property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            auth
            + +
            + +
            + + + + +
            +
            + +

            auth property + Null safety +

            + +
            + FirebaseAuth + auth +
            final
            + +
            + +
            +

            The FirebaseAuth service.

            +
            + + +
            +

            Implementation

            +
            static final FirebaseAuth auth = FirebaseAuth.instance;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/calendarScope-constant.html b/docs/ramaz_services/Auth/calendarScope-constant.html new file mode 100644 index 000000000..82d97a418 --- /dev/null +++ b/docs/ramaz_services/Auth/calendarScope-constant.html @@ -0,0 +1,157 @@ + + + + + + + + calendarScope constant - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            calendarScope
            + +
            + +
            + + + + +
            +
            + +

            calendarScope constant + Null safety +

            + +
            + String + const calendarScope + + +
            + +
            +

            The scope for calendar admins.

            +

            This string should be found in the user's Firebase custom claims.

            +
            + + +
            +

            Implementation

            +
            static const String calendarScope = "calendar";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/claims.html b/docs/ramaz_services/Auth/claims.html new file mode 100644 index 000000000..dad274c8f --- /dev/null +++ b/docs/ramaz_services/Auth/claims.html @@ -0,0 +1,163 @@ + + + + + + + + claims property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            claims
            + +
            + +
            + + + + +
            +
            + +

            claims property + Null safety +

            + + + +
            + +
            + Future<Map<String, dynamic>?> + claims + + +
            + + +
            +

            Gets the user's custom claims.

            +

            See the official Firebase docs.

            +
            + + +
            +

            Implementation

            +
            static Future<Map<String, dynamic>?> get claims async => !isSignedIn ? null
            +	: (await _currentUser!.getIdTokenResult()).claims;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/email.html b/docs/ramaz_services/Auth/email.html new file mode 100644 index 000000000..d2784b291 --- /dev/null +++ b/docs/ramaz_services/Auth/email.html @@ -0,0 +1,162 @@ + + + + + + + + email property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            email
            + +
            + +
            + + + + +
            +
            + +

            email property + Null safety +

            + + + +
            + +
            + String? + email + + +
            + + +
            +

            The user's email.

            +

            Since the database is case-sensitive, we standardize the lower case.

            +
            + + +
            +

            Implementation

            +
            static String? get email => _currentUser?.email?.toLowerCase();
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/google.html b/docs/ramaz_services/Auth/google.html new file mode 100644 index 000000000..f3f9822df --- /dev/null +++ b/docs/ramaz_services/Auth/google.html @@ -0,0 +1,156 @@ + + + + + + + + google property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            google
            + +
            + +
            + + + + +
            +
            + +

            google property + Null safety +

            + +
            + GoogleSignIn + google +
            final
            + +
            + +
            +

            The GoogleSignIn service.

            +
            + + +
            +

            Implementation

            +
            static final GoogleSignIn google = GoogleSignIn(hostedDomain: "ramaz.org");
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/hashCode.html b/docs/ramaz_services/Auth/hashCode.html new file mode 100644 index 000000000..c80d0a76a --- /dev/null +++ b/docs/ramaz_services/Auth/hashCode.html @@ -0,0 +1,185 @@ + + + + + + + + hashCode property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/isAdmin.html b/docs/ramaz_services/Auth/isAdmin.html new file mode 100644 index 000000000..abe4ec03f --- /dev/null +++ b/docs/ramaz_services/Auth/isAdmin.html @@ -0,0 +1,165 @@ + + + + + + + + isAdmin property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isAdmin
            + +
            + +
            + + + + +
            +
            + +

            isAdmin property + Null safety +

            + + + +
            + +
            + Future<bool> + isAdmin + + +
            + + +
            +

            Whether the user is an admin.

            +

            This works by checking for an "isAdmin" flag in the user's custom claims.

            +
            + + +
            +

            Implementation

            +
            static Future<bool> get isAdmin async {
            +	final Map? customClaims = await claims;
            +	return customClaims != null && (customClaims ["isAdmin"] ?? false);
            +}
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/isCalendarAdmin.html b/docs/ramaz_services/Auth/isCalendarAdmin.html new file mode 100644 index 000000000..b133054c5 --- /dev/null +++ b/docs/ramaz_services/Auth/isCalendarAdmin.html @@ -0,0 +1,162 @@ + + + + + + + + isCalendarAdmin property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isCalendarAdmin
            + +
            + +
            + + + + +
            +
            + +

            isCalendarAdmin property + Null safety +

            + + + +
            + +
            + Future<bool> + isCalendarAdmin + + +
            + + +
            +

            Whether the user is an admin for the calendar.

            +
            + + +
            +

            Implementation

            +
            static Future<bool> get isCalendarAdmin async =>
            +	(await adminScopes)?.contains(calendarScope) ?? false;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/isSignedIn.html b/docs/ramaz_services/Auth/isSignedIn.html new file mode 100644 index 000000000..26e3e3b69 --- /dev/null +++ b/docs/ramaz_services/Auth/isSignedIn.html @@ -0,0 +1,161 @@ + + + + + + + + isSignedIn property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isSignedIn
            + +
            + +
            + + + + +
            +
            + +

            isSignedIn property + Null safety +

            + + + +
            + +
            + bool + isSignedIn + + +
            + + +
            +

            Determines whether the user is currently logged

            +
            + + +
            +

            Implementation

            +
            static bool get isSignedIn => _currentUser != null;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/isSportsAdmin.html b/docs/ramaz_services/Auth/isSportsAdmin.html new file mode 100644 index 000000000..b7010baa5 --- /dev/null +++ b/docs/ramaz_services/Auth/isSportsAdmin.html @@ -0,0 +1,162 @@ + + + + + + + + isSportsAdmin property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isSportsAdmin
            + +
            + +
            + + + + +
            +
            + +

            isSportsAdmin property + Null safety +

            + + + +
            + +
            + Future<bool> + isSportsAdmin + + +
            + + +
            +

            Whether the user is an admin for sports games.

            +
            + + +
            +

            Implementation

            +
            static Future<bool> get isSportsAdmin async =>
            +	(await adminScopes)?.contains(sportsScope) ?? false;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/name.html b/docs/ramaz_services/Auth/name.html new file mode 100644 index 000000000..2d4f4721b --- /dev/null +++ b/docs/ramaz_services/Auth/name.html @@ -0,0 +1,161 @@ + + + + + + + + name property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            name
            + +
            + +
            + + + + +
            +
            + +

            name property + Null safety +

            + + + +
            + +
            + String? + name + + +
            + + +
            +

            The user's full name.

            +
            + + +
            +

            Implementation

            +
            static String? get name => _currentUser?.displayName;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/noSuchMethod.html b/docs/ramaz_services/Auth/noSuchMethod.html new file mode 100644 index 000000000..807a4b9da --- /dev/null +++ b/docs/ramaz_services/Auth/noSuchMethod.html @@ -0,0 +1,193 @@ + + + + + + + + noSuchMethod method - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/operator_equals.html b/docs/ramaz_services/Auth/operator_equals.html new file mode 100644 index 000000000..fa3b88416 --- /dev/null +++ b/docs/ramaz_services/Auth/operator_equals.html @@ -0,0 +1,184 @@ + + + + + + + + operator == method - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/runtimeType.html b/docs/ramaz_services/Auth/runtimeType.html new file mode 100644 index 000000000..3005ca09c --- /dev/null +++ b/docs/ramaz_services/Auth/runtimeType.html @@ -0,0 +1,160 @@ + + + + + + + + runtimeType property - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/signIn.html b/docs/ramaz_services/Auth/signIn.html new file mode 100644 index 000000000..baad314ed --- /dev/null +++ b/docs/ramaz_services/Auth/signIn.html @@ -0,0 +1,172 @@ + + + + + + + + signIn method - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            signIn
            + +
            + +
            + + + + +
            +
            + +

            signIn method + Null safety +

            + +
            + + +Future<void> +signIn() + + + +
            + +
            +

            Signs the user in using Google as a provider.

            +
            + + + +
            +

            Implementation

            +
            static Future<void> signIn() async {
            +	final GoogleSignInAccount? googleAccount = await google.signIn();
            +	if (googleAccount == null) {
            +		throw NoAccountException();
            +	}
            +	final GoogleSignInAuthentication googleAuth =
            +		await googleAccount.authentication;
            +
            +	final AuthCredential credential = GoogleAuthProvider.credential(
            +		accessToken: googleAuth.accessToken,
            +		idToken: googleAuth.idToken,
            +	);
            +
            +	await auth.signInWithCredential(credential);
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/signOut.html b/docs/ramaz_services/Auth/signOut.html new file mode 100644 index 000000000..ab4175458 --- /dev/null +++ b/docs/ramaz_services/Auth/signOut.html @@ -0,0 +1,162 @@ + + + + + + + + signOut method - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            signOut
            + +
            + +
            + + + + +
            +
            + +

            signOut method + Null safety +

            + +
            + + +Future<void> +signOut() + + + +
            + +
            +

            Signs out the currently logged in user.

            +
            + + + +
            +

            Implementation

            +
            static Future<void> signOut() async {
            +	await google.signOut();
            +	await google.disconnect();
            +	await auth.signOut();
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/sportsScope-constant.html b/docs/ramaz_services/Auth/sportsScope-constant.html new file mode 100644 index 000000000..9842eb82c --- /dev/null +++ b/docs/ramaz_services/Auth/sportsScope-constant.html @@ -0,0 +1,157 @@ + + + + + + + + sportsScope constant - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            sportsScope
            + +
            + +
            + + + + +
            +
            + +

            sportsScope constant + Null safety +

            + +
            + String + const sportsScope + + +
            + +
            +

            The scope for sports admins.

            +

            This string should be found in the user's Firebase custom claims.

            +
            + + +
            +

            Implementation

            +
            static const String sportsScope = "sports";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Auth/toString.html b/docs/ramaz_services/Auth/toString.html new file mode 100644 index 000000000..3e387fbc5 --- /dev/null +++ b/docs/ramaz_services/Auth/toString.html @@ -0,0 +1,166 @@ + + + + + + + + toString method - Auth class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            +

            toString method + Null safety +

            + +
            + + +String +toString() + +
            inherited
            + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + +
            +

            Implementation

            +
            external String toString();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics-class.html b/docs/ramaz_services/Crashlytics-class.html new file mode 100644 index 000000000..5a00d4ac3 --- /dev/null +++ b/docs/ramaz_services/Crashlytics-class.html @@ -0,0 +1,374 @@ + + + + + + + + Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Crashlytics
            + +
            + +
            + + + + +
            +
            + +

            Crashlytics class + Null safety + +

            + + +
            +

            A wrapper around the Crashlytics SDK.

            +

            Crashlytics is a service that helps report errors from apps already in use. +Crashes and errors can be found in the Firebase console.

            +

            This class has a singleton, since there are multiple implementations. Use +Crashlytics.instance.

            +
            + + + +
            +

            Constructors

            + +
            +
            + Crashlytics() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + didCrashLastTime + ↔ bool + +
            +
            + Whether the app crashed last time it ran. [...] +
            read / write
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + init() + → Future<void> + + + +
            +
            + Initializes the service. [...] +
            inherited
            + +
            + +
            + log(String message) + → Future<void> + + + +
            +
            + Logs a message to Crashlytics. [...] + + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + recordError(dynamic exception, StackTrace stack, {dynamic context}) + → Future<void> + + + +
            +
            + Records an error to Crashlytics. [...] + + +
            + +
            + recordFlutterError(FlutterErrorDetails details) + → Future<void> + + + +
            +
            + Records an error in the Flutter framework. + + +
            + +
            + setEmail(String email) + → Future<void> + + + +
            +
            + Sets the email of the current user. [...] + + +
            + +
            + signIn() + → Future<void> + + + +
            +
            + A callback that runs when the user signs in. [...] +
            inherited
            + +
            + +
            + toggle(bool value) + → Future<void> + + + +
            +
            + Toggles Crashlytics on or off. [...] + + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Static Properties

            + +
            +
            + instance + Crashlytics + +
            +
            + The singleton of this object. +
            read / write
            + +
            + +
            +
            + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/Crashlytics.html b/docs/ramaz_services/Crashlytics/Crashlytics.html new file mode 100644 index 000000000..535f50b16 --- /dev/null +++ b/docs/ramaz_services/Crashlytics/Crashlytics.html @@ -0,0 +1,139 @@ + + + + + + + + Crashlytics constructor - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Crashlytics
            + +
            + +
            + + + + +
            +
            + +

            Crashlytics constructor + Null safety +

            + +
            + Crashlytics() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/didCrashLastTime.html b/docs/ramaz_services/Crashlytics/didCrashLastTime.html new file mode 100644 index 000000000..478c90afe --- /dev/null +++ b/docs/ramaz_services/Crashlytics/didCrashLastTime.html @@ -0,0 +1,152 @@ + + + + + + + + didCrashLastTime property - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            didCrashLastTime
            + +
            + +
            + + + + +
            +
            + +

            didCrashLastTime property + Null safety +

            + +
            + bool + didCrashLastTime +
            read / write
            + +
            + +
            +

            Whether the app crashed last time it ran.

            +

            A "crash" according to Firebase is a fatal-error at the native level. So +most Flutter errors should not trigger this. In the future, however, it +may be helpful.

            +
            + + +
            +

            Implementation

            +
            bool didCrashLastTime = false;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/hashCode.html b/docs/ramaz_services/Crashlytics/hashCode.html new file mode 100644 index 000000000..4ace5ff63 --- /dev/null +++ b/docs/ramaz_services/Crashlytics/hashCode.html @@ -0,0 +1,178 @@ + + + + + + + + hashCode property - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/init.html b/docs/ramaz_services/Crashlytics/init.html new file mode 100644 index 000000000..525985aa9 --- /dev/null +++ b/docs/ramaz_services/Crashlytics/init.html @@ -0,0 +1,153 @@ + + + + + + + + init method - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            init
            + +
            + +
            + + + + +
            +
            + +

            init method + Null safety +

            + +
            + + +Future<void> +init() + +
            inherited
            + +
            + +
            +

            Initializes the service.

            +

            Override this function with code that needs to be run when the app starts. +A good use for this is registering with plugins that return a Future.

            +
            + + + +
            +

            Implementation

            +
            Future<void> init();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/instance.html b/docs/ramaz_services/Crashlytics/instance.html new file mode 100644 index 000000000..2f8f6a0e7 --- /dev/null +++ b/docs/ramaz_services/Crashlytics/instance.html @@ -0,0 +1,149 @@ + + + + + + + + instance property - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            instance
            + +
            + +
            + + + + +
            +
            + +

            instance property + Null safety +

            + +
            + Crashlytics + instance +
            read / write
            + +
            + +
            +

            The singleton of this object.

            +
            + + +
            +

            Implementation

            +
            static Crashlytics instance = getCrashlytics();
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/log.html b/docs/ramaz_services/Crashlytics/log.html new file mode 100644 index 000000000..f38b19a9f --- /dev/null +++ b/docs/ramaz_services/Crashlytics/log.html @@ -0,0 +1,154 @@ + + + + + + + + log method - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            log
            + +
            + +
            + + + + +
            +
            + +

            log method + Null safety +

            + +
            + + +Future<void> +log(
            1. String message
            2. +
            ) + + + +
            + +
            +

            Logs a message to Crashlytics.

            +

            Put these everywhere. That way, if the app does crash, the error report +will be full of context.

            +
            + + + +
            +

            Implementation

            +
            Future<void> log(String message);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/noSuchMethod.html b/docs/ramaz_services/Crashlytics/noSuchMethod.html new file mode 100644 index 000000000..feb291ae2 --- /dev/null +++ b/docs/ramaz_services/Crashlytics/noSuchMethod.html @@ -0,0 +1,186 @@ + + + + + + + + noSuchMethod method - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/operator_equals.html b/docs/ramaz_services/Crashlytics/operator_equals.html new file mode 100644 index 000000000..1460d4047 --- /dev/null +++ b/docs/ramaz_services/Crashlytics/operator_equals.html @@ -0,0 +1,177 @@ + + + + + + + + operator == method - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/recordError.html b/docs/ramaz_services/Crashlytics/recordError.html new file mode 100644 index 000000000..cd83806ca --- /dev/null +++ b/docs/ramaz_services/Crashlytics/recordError.html @@ -0,0 +1,160 @@ + + + + + + + + recordError method - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            recordError
            + +
            + +
            + + + + +
            +
            + +

            recordError method + Null safety +

            + +
            + + +Future<void> +recordError(
            1. dynamic exception,
            2. +
            3. StackTrace stack,
            4. +
            5. {dynamic context}
            6. +
            ) + + + +
            + +
            +

            Records an error to Crashlytics.

            +

            This function is meant for Dart errors. For Flutter errors, use +recordFlutterError.

            +
            + + + +
            +

            Implementation

            +
            Future<void> recordError(
            +	dynamic exception,
            +	StackTrace stack,
            +	{dynamic context}
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/recordFlutterError.html b/docs/ramaz_services/Crashlytics/recordFlutterError.html new file mode 100644 index 000000000..c99ed9319 --- /dev/null +++ b/docs/ramaz_services/Crashlytics/recordFlutterError.html @@ -0,0 +1,152 @@ + + + + + + + + recordFlutterError method - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            recordFlutterError
            + +
            + +
            + + + + +
            +
            + +

            recordFlutterError method + Null safety +

            + +
            + + +Future<void> +recordFlutterError(
            1. FlutterErrorDetails details
            2. +
            ) + + + +
            + +
            +

            Records an error in the Flutter framework.

            +
            + + + +
            +

            Implementation

            +
            Future<void> recordFlutterError(FlutterErrorDetails details);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/runtimeType.html b/docs/ramaz_services/Crashlytics/runtimeType.html new file mode 100644 index 000000000..4ac7405df --- /dev/null +++ b/docs/ramaz_services/Crashlytics/runtimeType.html @@ -0,0 +1,153 @@ + + + + + + + + runtimeType property - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/setEmail.html b/docs/ramaz_services/Crashlytics/setEmail.html new file mode 100644 index 000000000..6fd205b20 --- /dev/null +++ b/docs/ramaz_services/Crashlytics/setEmail.html @@ -0,0 +1,154 @@ + + + + + + + + setEmail method - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            setEmail
            + +
            + +
            + + + + +
            +
            + +

            setEmail method + Null safety +

            + +
            + + +Future<void> +setEmail(
            1. String email
            2. +
            ) + + + +
            + +
            +

            Sets the email of the current user.

            +

            This is helpful when looking through error reports, and enables us to dig +around the database and find corrupted data.

            +
            + + + +
            +

            Implementation

            +
            Future<void> setEmail(String email);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/signIn.html b/docs/ramaz_services/Crashlytics/signIn.html new file mode 100644 index 000000000..4c423932f --- /dev/null +++ b/docs/ramaz_services/Crashlytics/signIn.html @@ -0,0 +1,152 @@ + + + + + + + + signIn method - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            signIn
            + +
            + +
            + + + + +
            +
            + +

            signIn method + Null safety +

            + +
            + + +Future<void> +signIn() + +
            inherited
            + +
            + +
            +

            A callback that runs when the user signs in.

            +

            Override this function with code that facilitates the sign-in process.

            +
            + + + +
            +

            Implementation

            +
            Future<void> signIn();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/toString.html b/docs/ramaz_services/Crashlytics/toString.html new file mode 100644 index 000000000..e5ef32c99 --- /dev/null +++ b/docs/ramaz_services/Crashlytics/toString.html @@ -0,0 +1,159 @@ + + + + + + + + toString method - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            +

            toString method + Null safety +

            + +
            + + +String +toString() + +
            inherited
            + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + +
            +

            Implementation

            +
            external String toString();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Crashlytics/toggle.html b/docs/ramaz_services/Crashlytics/toggle.html new file mode 100644 index 000000000..a2fa7764d --- /dev/null +++ b/docs/ramaz_services/Crashlytics/toggle.html @@ -0,0 +1,155 @@ + + + + + + + + toggle method - Crashlytics class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toggle
            + +
            + +
            + + + + +
            +
            + +

            toggle method + Null safety +

            + +
            + + +Future<void> +toggle(
            1. bool value
            2. +
            ) + + + +
            + +
            +

            Toggles Crashlytics on or off.

            +

            This should always be set to on (and it is by default), except for when +the app is running in dev mode.

            +
            + + + +
            +

            Implementation

            +
            // ignore: avoid_positional_boolean_parameters
            +Future<void> toggle(bool value);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/NoAccountException-class.html b/docs/ramaz_services/NoAccountException-class.html new file mode 100644 index 000000000..0ae192c3f --- /dev/null +++ b/docs/ramaz_services/NoAccountException-class.html @@ -0,0 +1,241 @@ + + + + + + + + NoAccountException class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            NoAccountException
            + +
            + +
            + + + + +
            +
            + +

            NoAccountException class + Null safety + +

            + + +
            +

            An exception thrown when no account has been selected.

            +
            + + + +
            +

            Constructors

            + +
            +
            + NoAccountException() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/NoAccountException/NoAccountException.html b/docs/ramaz_services/NoAccountException/NoAccountException.html new file mode 100644 index 000000000..63cafa6ce --- /dev/null +++ b/docs/ramaz_services/NoAccountException/NoAccountException.html @@ -0,0 +1,129 @@ + + + + + + + + NoAccountException constructor - NoAccountException class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            NoAccountException
            + +
            + +
            + + + + +
            +
            + +

            NoAccountException constructor + Null safety +

            + +
            + NoAccountException() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/NoAccountException/hashCode.html b/docs/ramaz_services/NoAccountException/hashCode.html new file mode 100644 index 000000000..a08ef61de --- /dev/null +++ b/docs/ramaz_services/NoAccountException/hashCode.html @@ -0,0 +1,168 @@ + + + + + + + + hashCode property - NoAccountException class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/NoAccountException/noSuchMethod.html b/docs/ramaz_services/NoAccountException/noSuchMethod.html new file mode 100644 index 000000000..89e19a54d --- /dev/null +++ b/docs/ramaz_services/NoAccountException/noSuchMethod.html @@ -0,0 +1,176 @@ + + + + + + + + noSuchMethod method - NoAccountException class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/NoAccountException/operator_equals.html b/docs/ramaz_services/NoAccountException/operator_equals.html new file mode 100644 index 000000000..5a34728b4 --- /dev/null +++ b/docs/ramaz_services/NoAccountException/operator_equals.html @@ -0,0 +1,167 @@ + + + + + + + + operator == method - NoAccountException class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/NoAccountException/runtimeType.html b/docs/ramaz_services/NoAccountException/runtimeType.html new file mode 100644 index 000000000..1a4cb186b --- /dev/null +++ b/docs/ramaz_services/NoAccountException/runtimeType.html @@ -0,0 +1,143 @@ + + + + + + + + runtimeType property - NoAccountException class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/NoAccountException/toString.html b/docs/ramaz_services/NoAccountException/toString.html new file mode 100644 index 000000000..26a476c6d --- /dev/null +++ b/docs/ramaz_services/NoAccountException/toString.html @@ -0,0 +1,149 @@ + + + + + + + + toString method - NoAccountException class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            +

            toString method + Null safety +

            + +
            + + +String +toString() + +
            inherited
            + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + +
            +

            Implementation

            +
            external String toString();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification-class.html b/docs/ramaz_services/Notification-class.html new file mode 100644 index 000000000..e79621fc0 --- /dev/null +++ b/docs/ramaz_services/Notification-class.html @@ -0,0 +1,311 @@ + + + + + + + + Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Notification
            + +
            + +
            + + + + +
            +
            + +

            Notification class + Null safety + +

            + + +
            +

            A notification.

            +

            The notification has a title and a message.

            +
            + + +
            +
            + + + + + +
            Annotations
            +
            +
            +
            + +
            +

            Constructors

            + +
            +
            + Notification({required String title, required String message}) +
            +
            + Creates a notification. +
            const
            +
            +
            + Notification.reminder({required String title, required String message}) +
            +
            + Creates a notification for a reminder. +
            factory
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + message + → String + +
            +
            + The body of this notification. +
            final
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            + title + → String + +
            +
            + The title of this notification. +
            final
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + +
            +

            Constants

            + +
            +
            + id + → const int + + +
            +
            + The ID of this notification. [...] + + +
            + 0 +
            +
            + +
            +
            + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification/Notification.html b/docs/ramaz_services/Notification/Notification.html new file mode 100644 index 000000000..34fe00501 --- /dev/null +++ b/docs/ramaz_services/Notification/Notification.html @@ -0,0 +1,146 @@ + + + + + + + + Notification constructor - Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Notification
            + +
            + +
            + + + + +
            +
            + +

            Notification constructor + Null safety +

            + +
            const + Notification(
            1. {required String title,
            2. +
            3. required String message}
            4. +
            ) +
            + + +
            +

            Creates a notification.

            +
            + + + +
            +

            Implementation

            +
            const Notification({
            +	required this.title,
            +	required this.message,
            +});
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification/Notification.reminder.html b/docs/ramaz_services/Notification/Notification.reminder.html new file mode 100644 index 000000000..d45511476 --- /dev/null +++ b/docs/ramaz_services/Notification/Notification.reminder.html @@ -0,0 +1,146 @@ + + + + + + + + Notification.reminder constructor - Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Notification.reminder
            + +
            + +
            + + + + +
            +
            + +

            Notification.reminder constructor + Null safety +

            + +
            + Notification.reminder(
            1. {required String title,
            2. +
            3. required String message}
            4. +
            ) +
            + + +
            +

            Creates a notification for a reminder.

            +
            + + + +
            +

            Implementation

            +
            factory Notification.reminder({
            +	required String title,
            +	required String message,
            +}) => getReminderNotification(title: title, message: message);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification/hashCode.html b/docs/ramaz_services/Notification/hashCode.html new file mode 100644 index 000000000..7decd389a --- /dev/null +++ b/docs/ramaz_services/Notification/hashCode.html @@ -0,0 +1,173 @@ + + + + + + + + hashCode property - Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification/id-constant.html b/docs/ramaz_services/Notification/id-constant.html new file mode 100644 index 000000000..972abaa34 --- /dev/null +++ b/docs/ramaz_services/Notification/id-constant.html @@ -0,0 +1,145 @@ + + + + + + + + id constant - Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            id
            + +
            + +
            + + + + +
            +
            + +

            id constant + Null safety +

            + +
            + int + const id + + +
            + +
            +

            The ID of this notification.

            +

            The ID is used for canceling the notifications.

            +
            + + +
            +

            Implementation

            +
            static const int id = 0;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification/message.html b/docs/ramaz_services/Notification/message.html new file mode 100644 index 000000000..ee2c1f68a --- /dev/null +++ b/docs/ramaz_services/Notification/message.html @@ -0,0 +1,144 @@ + + + + + + + + message property - Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            message
            + +
            + +
            + + + + +
            +
            + +

            message property + Null safety +

            + +
            + String + message +
            final
            + +
            + +
            +

            The body of this notification.

            +
            + + +
            +

            Implementation

            +
            final String message;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification/noSuchMethod.html b/docs/ramaz_services/Notification/noSuchMethod.html new file mode 100644 index 000000000..b94cd5692 --- /dev/null +++ b/docs/ramaz_services/Notification/noSuchMethod.html @@ -0,0 +1,181 @@ + + + + + + + + noSuchMethod method - Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification/operator_equals.html b/docs/ramaz_services/Notification/operator_equals.html new file mode 100644 index 000000000..68ffcfa3b --- /dev/null +++ b/docs/ramaz_services/Notification/operator_equals.html @@ -0,0 +1,172 @@ + + + + + + + + operator == method - Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification/runtimeType.html b/docs/ramaz_services/Notification/runtimeType.html new file mode 100644 index 000000000..cd92ab513 --- /dev/null +++ b/docs/ramaz_services/Notification/runtimeType.html @@ -0,0 +1,148 @@ + + + + + + + + runtimeType property - Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification/title.html b/docs/ramaz_services/Notification/title.html new file mode 100644 index 000000000..8c2f062e5 --- /dev/null +++ b/docs/ramaz_services/Notification/title.html @@ -0,0 +1,144 @@ + + + + + + + + title property - Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            title
            + +
            + +
            + + + + +
            +
            + +

            title property + Null safety +

            + +
            + String + title +
            final
            + +
            + +
            +

            The title of this notification.

            +
            + + +
            +

            Implementation

            +
            final String title;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notification/toString.html b/docs/ramaz_services/Notification/toString.html new file mode 100644 index 000000000..f5a63624f --- /dev/null +++ b/docs/ramaz_services/Notification/toString.html @@ -0,0 +1,154 @@ + + + + + + + + toString method - Notification class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            +

            toString method + Null safety +

            + +
            + + +String +toString() + +
            inherited
            + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + +
            +

            Implementation

            +
            external String toString();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications-class.html b/docs/ramaz_services/Notifications-class.html new file mode 100644 index 000000000..25dd05ecd --- /dev/null +++ b/docs/ramaz_services/Notifications-class.html @@ -0,0 +1,349 @@ + + + + + + + + Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Notifications
            + +
            + +
            + + + + +
            +
            + +

            Notifications class + Null safety + +

            + + +
            +

            The notifications service.

            +

            There are two types of notifications: local notifications, and push +notifications. Local notifications are sent by the app itself, and +push notifications are sent by the server. These are local notifications.

            +

            Local notifications can be customized to appear differently depending on +the type of notification and platform. They can also be scheduled to appear +at certain times.

            +

            Currently, Web is not supported.

            +
            + + + +
            +

            Constructors

            + +
            +
            + Notifications() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + pendingNotifications + → Future<List<String>> + +
            +
            + Notifications that are pending delivery. +
            read-only
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + cancelAll() + → void + + + +
            +
            + Cancels all notifications. + + +
            + +
            + init() + → Future<void> + + + +
            +
            + Initializes the service. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + scheduleNotification({required covariant Notification notification, required DateTime date}) + → void + + + +
            +
            + Schedules a notification for date. [...] + + +
            + +
            + sendNotification(covariant Notification notification) + → void + + + +
            +
            + Sends a notification immediately. + + +
            + +
            + signIn() + → Future<void> + + + +
            +
            + A callback that runs when the user signs in. [...] +
            inherited
            + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Static Properties

            + +
            +
            + instance + Notifications + +
            +
            + The singleton instance for this service. +
            read / write
            + +
            + +
            +
            + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/Notifications.html b/docs/ramaz_services/Notifications/Notifications.html new file mode 100644 index 000000000..b7b18e474 --- /dev/null +++ b/docs/ramaz_services/Notifications/Notifications.html @@ -0,0 +1,137 @@ + + + + + + + + Notifications constructor - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Notifications
            + +
            + +
            + + + + +
            +
            + +

            Notifications constructor + Null safety +

            + +
            + Notifications() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/cancelAll.html b/docs/ramaz_services/Notifications/cancelAll.html new file mode 100644 index 000000000..c49b853c7 --- /dev/null +++ b/docs/ramaz_services/Notifications/cancelAll.html @@ -0,0 +1,149 @@ + + + + + + + + cancelAll method - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            cancelAll
            + +
            + +
            + + + + +
            +
            + +

            cancelAll method + Null safety +

            + +
            + + +void +cancelAll() + + + +
            + +
            +

            Cancels all notifications.

            +
            + + + +
            +

            Implementation

            +
            void cancelAll();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/hashCode.html b/docs/ramaz_services/Notifications/hashCode.html new file mode 100644 index 000000000..553f82f13 --- /dev/null +++ b/docs/ramaz_services/Notifications/hashCode.html @@ -0,0 +1,176 @@ + + + + + + + + hashCode property - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/init.html b/docs/ramaz_services/Notifications/init.html new file mode 100644 index 000000000..2e6d88bf6 --- /dev/null +++ b/docs/ramaz_services/Notifications/init.html @@ -0,0 +1,151 @@ + + + + + + + + init method - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            init
            + +
            + +
            + + + + +
            +
            + +

            init method + Null safety +

            + +
            + + +Future<void> +init() + +
            inherited
            + +
            + +
            +

            Initializes the service.

            +

            Override this function with code that needs to be run when the app starts. +A good use for this is registering with plugins that return a Future.

            +
            + + + +
            +

            Implementation

            +
            Future<void> init();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/instance.html b/docs/ramaz_services/Notifications/instance.html new file mode 100644 index 000000000..85c9dc07d --- /dev/null +++ b/docs/ramaz_services/Notifications/instance.html @@ -0,0 +1,147 @@ + + + + + + + + instance property - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            instance
            + +
            + +
            + + + + +
            +
            + +

            instance property + Null safety +

            + +
            + Notifications + instance +
            read / write
            + +
            + +
            +

            The singleton instance for this service.

            +
            + + +
            +

            Implementation

            +
            static Notifications instance = notifications;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/noSuchMethod.html b/docs/ramaz_services/Notifications/noSuchMethod.html new file mode 100644 index 000000000..f9a09e35e --- /dev/null +++ b/docs/ramaz_services/Notifications/noSuchMethod.html @@ -0,0 +1,184 @@ + + + + + + + + noSuchMethod method - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/operator_equals.html b/docs/ramaz_services/Notifications/operator_equals.html new file mode 100644 index 000000000..4e66671cb --- /dev/null +++ b/docs/ramaz_services/Notifications/operator_equals.html @@ -0,0 +1,175 @@ + + + + + + + + operator == method - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/pendingNotifications.html b/docs/ramaz_services/Notifications/pendingNotifications.html new file mode 100644 index 000000000..a20e27a1b --- /dev/null +++ b/docs/ramaz_services/Notifications/pendingNotifications.html @@ -0,0 +1,152 @@ + + + + + + + + pendingNotifications property - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            pendingNotifications
            + +
            + +
            + + + + +
            +
            + +

            pendingNotifications property + Null safety +

            + + + +
            + +
            + Future<List<String>> + pendingNotifications + + +
            + + +
            +

            Notifications that are pending delivery.

            +
            + + +
            +

            Implementation

            +
            Future<List<String>> get pendingNotifications;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/runtimeType.html b/docs/ramaz_services/Notifications/runtimeType.html new file mode 100644 index 000000000..27de6e6e3 --- /dev/null +++ b/docs/ramaz_services/Notifications/runtimeType.html @@ -0,0 +1,151 @@ + + + + + + + + runtimeType property - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/scheduleNotification.html b/docs/ramaz_services/Notifications/scheduleNotification.html new file mode 100644 index 000000000..07225ad6e --- /dev/null +++ b/docs/ramaz_services/Notifications/scheduleNotification.html @@ -0,0 +1,155 @@ + + + + + + + + scheduleNotification method - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            scheduleNotification
            + +
            + +
            + + + + +
            +
            + +

            scheduleNotification method + Null safety +

            + +
            + + +void +scheduleNotification(
            1. {required covariant Notification notification,
            2. +
            3. required DateTime date}
            4. +
            ) + + + +
            + +
            +

            Schedules a notification for date.

            +

            date must not be in the past.

            +
            + + + +
            +

            Implementation

            +
            void scheduleNotification({
            +	required covariant Notification notification,
            +	required DateTime date
            +});
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/sendNotification.html b/docs/ramaz_services/Notifications/sendNotification.html new file mode 100644 index 000000000..33745e7da --- /dev/null +++ b/docs/ramaz_services/Notifications/sendNotification.html @@ -0,0 +1,150 @@ + + + + + + + + sendNotification method - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            sendNotification
            + +
            + +
            + + + + +
            +
            + +

            sendNotification method + Null safety +

            + +
            + + +void +sendNotification(
            1. covariant Notification notification
            2. +
            ) + + + +
            + +
            +

            Sends a notification immediately.

            +
            + + + +
            +

            Implementation

            +
            void sendNotification(covariant Notification notification);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/signIn.html b/docs/ramaz_services/Notifications/signIn.html new file mode 100644 index 000000000..d0b9028f1 --- /dev/null +++ b/docs/ramaz_services/Notifications/signIn.html @@ -0,0 +1,150 @@ + + + + + + + + signIn method - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            signIn
            + +
            + +
            + + + + +
            +
            + +

            signIn method + Null safety +

            + +
            + + +Future<void> +signIn() + +
            inherited
            + +
            + +
            +

            A callback that runs when the user signs in.

            +

            Override this function with code that facilitates the sign-in process.

            +
            + + + +
            +

            Implementation

            +
            Future<void> signIn();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Notifications/toString.html b/docs/ramaz_services/Notifications/toString.html new file mode 100644 index 000000000..6f636b166 --- /dev/null +++ b/docs/ramaz_services/Notifications/toString.html @@ -0,0 +1,157 @@ + + + + + + + + toString method - Notifications class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            +

            toString method + Null safety +

            + +
            + + +String +toString() + +
            inherited
            + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + +
            +

            Implementation

            +
            external String toString();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences-class.html b/docs/ramaz_services/Preferences-class.html new file mode 100644 index 000000000..1c1b09b00 --- /dev/null +++ b/docs/ramaz_services/Preferences-class.html @@ -0,0 +1,334 @@ + + + + + + + + Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Preferences
            + +
            + +
            + + + + +
            +
            + +

            Preferences class + Null safety + +

            + + +
            +

            An abstraction wrapper around the SharedPreferences plugin.

            +

            The SharedPreferences plugin allows for quick and small key-value based +storage, which can be very useful.

            +
            + + + +
            +

            Constructors

            + +
            +
            + Preferences() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + brightness + ↔ bool? + +
            +
            + The user's brightness preference. [...] +
            read / write
            + +
            + +
            + firstTime + → bool + +
            +
            + Determines whether this is the first time opening the app. +
            read-only
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + init() + → Future<void> + + + +
            +
            + Initializes the service. [...] + + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + signIn() + → Future<void> + + + +
            +
            + A callback that runs when the user signs in. [...] + + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + +
            +

            Constants

            + +
            +
            + firstTimeKey + → const String + + +
            +
            + The key for if this is the first time or not. + + +
            + "firstTime" +
            +
            + +
            + lightMode + → const String + + +
            +
            + The key for the user brightness preference. + + +
            + "lightMode" +
            +
            + +
            +
            + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/Preferences.html b/docs/ramaz_services/Preferences/Preferences.html new file mode 100644 index 000000000..8ee48233d --- /dev/null +++ b/docs/ramaz_services/Preferences/Preferences.html @@ -0,0 +1,136 @@ + + + + + + + + Preferences constructor - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Preferences
            + +
            + +
            + + + + +
            +
            + +

            Preferences constructor + Null safety +

            + +
            + Preferences() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/brightness.html b/docs/ramaz_services/Preferences/brightness.html new file mode 100644 index 000000000..be138c209 --- /dev/null +++ b/docs/ramaz_services/Preferences/brightness.html @@ -0,0 +1,175 @@ + + + + + + + + brightness property - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            brightness
            + +
            + +
            + + + + +
            +
            + +

            brightness property + Null safety +

            + + + +
            + +
            + bool? + brightness + + +
            + + +
            +

            The user's brightness preference.

            +

            true means light mode, false means dark mode, and null gets the +system preferences (if not supported -- light mode).

            +
            + + +
            +

            Implementation

            +
            bool? get brightness => _prefs.getBool(lightMode);
            +
            + +
            + + + +
            + +
            + void + brightness=(bool? value) + + +
            + + + + +
            +

            Implementation

            +
            set brightness (bool? value) => value == null
            +	? _prefs.remove(lightMode)
            +	: _prefs.setBool(lightMode, value);
            +
            + +
            + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/firstTime.html b/docs/ramaz_services/Preferences/firstTime.html new file mode 100644 index 000000000..437b09edd --- /dev/null +++ b/docs/ramaz_services/Preferences/firstTime.html @@ -0,0 +1,155 @@ + + + + + + + + firstTime property - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            firstTime
            + +
            + +
            + + + + +
            +
            + +

            firstTime property + Null safety +

            + + + +
            + +
            + bool + firstTime + + +
            + + +
            +

            Determines whether this is the first time opening the app.

            +
            + + +
            +

            Implementation

            +
            bool get firstTime {
            +	final bool result = _prefs.getBool(firstTimeKey) ?? true;
            +	_prefs.setBool(firstTimeKey, false);
            +	return result;
            +}
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/firstTimeKey-constant.html b/docs/ramaz_services/Preferences/firstTimeKey-constant.html new file mode 100644 index 000000000..1f7658340 --- /dev/null +++ b/docs/ramaz_services/Preferences/firstTimeKey-constant.html @@ -0,0 +1,146 @@ + + + + + + + + firstTimeKey constant - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            firstTimeKey
            + +
            + +
            + + + + +
            +
            + +

            firstTimeKey constant + Null safety +

            + +
            + String + const firstTimeKey + + +
            + +
            +

            The key for if this is the first time or not.

            +
            + + +
            +

            Implementation

            +
            static const String firstTimeKey = "firstTime";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/hashCode.html b/docs/ramaz_services/Preferences/hashCode.html new file mode 100644 index 000000000..2ee642088 --- /dev/null +++ b/docs/ramaz_services/Preferences/hashCode.html @@ -0,0 +1,175 @@ + + + + + + + + hashCode property - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/init.html b/docs/ramaz_services/Preferences/init.html new file mode 100644 index 000000000..46c29daa4 --- /dev/null +++ b/docs/ramaz_services/Preferences/init.html @@ -0,0 +1,158 @@ + + + + + + + + init method - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            init
            + +
            + +
            + + + + +
            +
            + +

            init method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Future<void> +init() + + + +
            + +
            +

            Initializes the service.

            +

            Override this function with code that needs to be run when the app starts. +A good use for this is registering with plugins that return a Future.

            +
            + + + +
            +

            Implementation

            +
            @override
            +Future<void> init() async {
            +	_prefs = await SharedPreferences.getInstance();
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/lightMode-constant.html b/docs/ramaz_services/Preferences/lightMode-constant.html new file mode 100644 index 000000000..8b289dad7 --- /dev/null +++ b/docs/ramaz_services/Preferences/lightMode-constant.html @@ -0,0 +1,146 @@ + + + + + + + + lightMode constant - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            lightMode
            + +
            + +
            + + + + +
            +
            + +

            lightMode constant + Null safety +

            + +
            + String + const lightMode + + +
            + +
            +

            The key for the user brightness preference.

            +
            + + +
            +

            Implementation

            +
            static const String lightMode = "lightMode";
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/noSuchMethod.html b/docs/ramaz_services/Preferences/noSuchMethod.html new file mode 100644 index 000000000..dd25486d5 --- /dev/null +++ b/docs/ramaz_services/Preferences/noSuchMethod.html @@ -0,0 +1,183 @@ + + + + + + + + noSuchMethod method - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/operator_equals.html b/docs/ramaz_services/Preferences/operator_equals.html new file mode 100644 index 000000000..5835f4360 --- /dev/null +++ b/docs/ramaz_services/Preferences/operator_equals.html @@ -0,0 +1,174 @@ + + + + + + + + operator == method - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/runtimeType.html b/docs/ramaz_services/Preferences/runtimeType.html new file mode 100644 index 000000000..236cb27f1 --- /dev/null +++ b/docs/ramaz_services/Preferences/runtimeType.html @@ -0,0 +1,150 @@ + + + + + + + + runtimeType property - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/signIn.html b/docs/ramaz_services/Preferences/signIn.html new file mode 100644 index 000000000..3b0d5a30c --- /dev/null +++ b/docs/ramaz_services/Preferences/signIn.html @@ -0,0 +1,155 @@ + + + + + + + + signIn method - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            signIn
            + +
            + +
            + + + + +
            +
            + +

            signIn method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Future<void> +signIn() + + + +
            + +
            +

            A callback that runs when the user signs in.

            +

            Override this function with code that facilitates the sign-in process.

            +
            + + + +
            +

            Implementation

            +
            @override
            +Future<void> signIn() async {}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Preferences/toString.html b/docs/ramaz_services/Preferences/toString.html new file mode 100644 index 000000000..1d9eeab85 --- /dev/null +++ b/docs/ramaz_services/Preferences/toString.html @@ -0,0 +1,156 @@ + + + + + + + + toString method - Preferences class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            +

            toString method + Null safety +

            + +
            + + +String +toString() + +
            inherited
            + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + +
            +

            Implementation

            +
            external String toString();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services-class.html b/docs/ramaz_services/Services-class.html new file mode 100644 index 000000000..714d7d428 --- /dev/null +++ b/docs/ramaz_services/Services-class.html @@ -0,0 +1,375 @@ + + + + + + + + Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Services
            + +
            + +
            + + + + +
            +
            + +

            Services class + Null safety + +

            + + +
            +

            Bundles all the services.

            +

            A Service has an init and a signIn function. This service serves +to bundle them all, so that you only need to call the functions of this +service, and they will call all the other services' functions.

            +
            + + + +
            +

            Constructors

            + +
            +
            + Services() +
            +
            + Bundles services together. [...] +
            +
            +
            + +
            +

            Properties

            + +
            +
            + crashlytics + Crashlytics + +
            +
            + The Crashlytics interface. +
            final
            + +
            + +
            + database + → Databases + +
            +
            + The database bundle. +
            final
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + isReady + ↔ bool + +
            +
            + Whether the services are ready to use. +
            read / write
            + +
            + +
            + notifications + Notifications + +
            +
            + The local notifications interface. [...] +
            final
            + +
            + +
            + prefs + Preferences + +
            +
            + The shared preferences interface. [...] +
            final
            + +
            + +
            + pushNotifications + → PushNotifications + +
            +
            + The push notifications interface. [...] +
            final
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            + services + ↔ List<Service> + +
            +
            + All the services in a list. [...] +
            final, read / write, late
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + init() + → Future<void> + + + +
            +
            + Initializes the service. [...] + + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + signIn() + → Future<void> + + + +
            +
            + A callback that runs when the user signs in. [...] + + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Static Properties

            + +
            +
            + instance + Services + +
            +
            + The singleton instance of this class. +
            read / write
            + +
            + +
            +
            + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/Services.html b/docs/ramaz_services/Services/Services.html new file mode 100644 index 000000000..aa4caa1a2 --- /dev/null +++ b/docs/ramaz_services/Services/Services.html @@ -0,0 +1,150 @@ + + + + + + + + Services constructor - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Services
            + +
            + +
            + + + + +
            +
            + +

            Services constructor + Null safety +

            + +
            + Services() +
            + + +
            +

            Bundles services together.

            +

            Also initializes services.

            +
            + + + +
            +

            Implementation

            +
            Services() {
            +	services = [prefs, database, crashlytics, notifications];
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/crashlytics.html b/docs/ramaz_services/Services/crashlytics.html new file mode 100644 index 000000000..8f5fad340 --- /dev/null +++ b/docs/ramaz_services/Services/crashlytics.html @@ -0,0 +1,150 @@ + + + + + + + + crashlytics property - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            crashlytics
            + +
            + +
            + + + + +
            +
            + +

            crashlytics property + Null safety +

            + +
            + Crashlytics + crashlytics +
            final
            + +
            + +
            +

            The Crashlytics interface.

            +
            + + +
            +

            Implementation

            +
            final Crashlytics crashlytics = Crashlytics.instance;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/database.html b/docs/ramaz_services/Services/database.html new file mode 100644 index 000000000..cb7d80f90 --- /dev/null +++ b/docs/ramaz_services/Services/database.html @@ -0,0 +1,150 @@ + + + + + + + + database property - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            database
            + +
            + +
            + + + + +
            +
            + +

            database property + Null safety +

            + +
            + Databases + database +
            final
            + +
            + +
            +

            The database bundle.

            +
            + + +
            +

            Implementation

            +
            final Databases database = Databases();
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/hashCode.html b/docs/ramaz_services/Services/hashCode.html new file mode 100644 index 000000000..410235b6d --- /dev/null +++ b/docs/ramaz_services/Services/hashCode.html @@ -0,0 +1,179 @@ + + + + + + + + hashCode property - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/init.html b/docs/ramaz_services/Services/init.html new file mode 100644 index 000000000..514eac3eb --- /dev/null +++ b/docs/ramaz_services/Services/init.html @@ -0,0 +1,165 @@ + + + + + + + + init method - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            init
            + +
            + +
            + + + + +
            +
            + +

            init method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Future<void> +init() + + + +
            + +
            +

            Initializes the service.

            +

            Override this function with code that needs to be run when the app starts. +A good use for this is registering with plugins that return a Future.

            +
            + + + +
            +

            Implementation

            +
            @override
            +Future<void> init() async {
            +	for (final Service service in services) {
            +		await service.init();
            +	}
            +	isReady = true;
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/instance.html b/docs/ramaz_services/Services/instance.html new file mode 100644 index 000000000..dfe9a0c53 --- /dev/null +++ b/docs/ramaz_services/Services/instance.html @@ -0,0 +1,150 @@ + + + + + + + + instance property - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            instance
            + +
            + +
            + + + + +
            +
            + +

            instance property + Null safety +

            + +
            + Services + instance +
            read / write
            + +
            + +
            +

            The singleton instance of this class.

            +
            + + +
            +

            Implementation

            +
            static Services instance = Services();
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/isReady.html b/docs/ramaz_services/Services/isReady.html new file mode 100644 index 000000000..1cccfa97e --- /dev/null +++ b/docs/ramaz_services/Services/isReady.html @@ -0,0 +1,150 @@ + + + + + + + + isReady property - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isReady
            + +
            + +
            + + + + +
            +
            + +

            isReady property + Null safety +

            + +
            + bool + isReady +
            read / write
            + +
            + +
            +

            Whether the services are ready to use.

            +
            + + +
            +

            Implementation

            +
            bool isReady = false;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/noSuchMethod.html b/docs/ramaz_services/Services/noSuchMethod.html new file mode 100644 index 000000000..653316bbd --- /dev/null +++ b/docs/ramaz_services/Services/noSuchMethod.html @@ -0,0 +1,187 @@ + + + + + + + + noSuchMethod method - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/notifications.html b/docs/ramaz_services/Services/notifications.html new file mode 100644 index 000000000..3b4c56e61 --- /dev/null +++ b/docs/ramaz_services/Services/notifications.html @@ -0,0 +1,151 @@ + + + + + + + + notifications property - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            notifications
            + +
            + +
            + + + + +
            +
            + +

            notifications property + Null safety +

            + +
            + Notifications + notifications +
            final
            + +
            + +
            +

            The local notifications interface.

            +

            Local notifications come from the app and not a server.

            +
            + + +
            +

            Implementation

            +
            final Notifications notifications = Notifications.instance;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/operator_equals.html b/docs/ramaz_services/Services/operator_equals.html new file mode 100644 index 000000000..9c8a1dcad --- /dev/null +++ b/docs/ramaz_services/Services/operator_equals.html @@ -0,0 +1,178 @@ + + + + + + + + operator == method - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/prefs.html b/docs/ramaz_services/Services/prefs.html new file mode 100644 index 000000000..39ab829b7 --- /dev/null +++ b/docs/ramaz_services/Services/prefs.html @@ -0,0 +1,151 @@ + + + + + + + + prefs property - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            prefs
            + +
            + +
            + + + + +
            +
            + +

            prefs property + Null safety +

            + +
            + Preferences + prefs +
            final
            + +
            + +
            +

            The shared preferences interface.

            +

            Useful for storing small key-value pairs.

            +
            + + +
            +

            Implementation

            +
            final Preferences prefs = Preferences();
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/pushNotifications.html b/docs/ramaz_services/Services/pushNotifications.html new file mode 100644 index 000000000..d80d5dc15 --- /dev/null +++ b/docs/ramaz_services/Services/pushNotifications.html @@ -0,0 +1,151 @@ + + + + + + + + pushNotifications property - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            pushNotifications
            + +
            + +
            + + + + +
            +
            + +

            pushNotifications property + Null safety +

            + +
            + PushNotifications + pushNotifications +
            final
            + +
            + +
            +

            The push notifications interface.

            +

            Push notifications come from the server.

            +
            + + +
            +

            Implementation

            +
            final PushNotifications pushNotifications = PushNotifications.instance;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/runtimeType.html b/docs/ramaz_services/Services/runtimeType.html new file mode 100644 index 000000000..3bb8343b5 --- /dev/null +++ b/docs/ramaz_services/Services/runtimeType.html @@ -0,0 +1,154 @@ + + + + + + + + runtimeType property - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/services.html b/docs/ramaz_services/Services/services.html new file mode 100644 index 000000000..65b03820c --- /dev/null +++ b/docs/ramaz_services/Services/services.html @@ -0,0 +1,151 @@ + + + + + + + + services property - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            services
            + +
            + +
            + + + + +
            +
            + +

            services property + Null safety +

            + +
            + List<Service> + services +
            final, read / write, late
            + +
            + +
            +

            All the services in a list.

            +

            The functions of this service operate on these services.

            +
            + + +
            +

            Implementation

            +
            late final List<Service> services;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/signIn.html b/docs/ramaz_services/Services/signIn.html new file mode 100644 index 000000000..97117d5d9 --- /dev/null +++ b/docs/ramaz_services/Services/signIn.html @@ -0,0 +1,163 @@ + + + + + + + + signIn method - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            signIn
            + +
            + +
            + + + + +
            +
            + +

            signIn method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Future<void> +signIn() + + + +
            + +
            +

            A callback that runs when the user signs in.

            +

            Override this function with code that facilitates the sign-in process.

            +
            + + + +
            +

            Implementation

            +
            @override
            +Future<void> signIn() async {
            +	for (final Service service in services) {
            +		await service.signIn();
            +	}
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/Services/toString.html b/docs/ramaz_services/Services/toString.html new file mode 100644 index 000000000..6ed057527 --- /dev/null +++ b/docs/ramaz_services/Services/toString.html @@ -0,0 +1,160 @@ + + + + + + + + toString method - Services class - ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            +

            toString method + Null safety +

            + +
            + + +String +toString() + +
            inherited
            + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + +
            +

            Implementation

            +
            external String toString();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/ramaz_services/ramaz_services-library.html b/docs/ramaz_services/ramaz_services-library.html new file mode 100644 index 000000000..320f98592 --- /dev/null +++ b/docs/ramaz_services/ramaz_services-library.html @@ -0,0 +1,223 @@ + + + + + + + + ramaz_services library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ramaz_services
            + +
            + +
            + + + + +
            +
            + +

            ramaz_services library + Null safety + +

            + + +
            +

            An abstraction over device services and data sources.

            +

            The services library serves two purposes:

            +
              +
            1. +

              To abstract device functions.

              +

              For example, device notifications can be abstracted away from the +business logic to provide for a platform-agnostic implementation.

              +
            2. +
            3. +

              To abstract data sources:

              +

              For example, retrieving data from a database or file can be abstracted +to keep the app focused on the content of the data rather than how to +properly access it.

              +
            4. +
            +
            + + +
            +

            Classes

            + +
            +
            + Auth + +
            +
            + An abstraction around FirebaseAuth. [...] +
            + +
            + Crashlytics + +
            +
            + A wrapper around the Crashlytics SDK. [...] +
            + +
            + Notification + +
            +
            + A notification. [...] +
            + +
            + Notifications + +
            +
            + The notifications service. [...] +
            + +
            + Preferences + +
            +
            + An abstraction wrapper around the SharedPreferences plugin. [...] +
            + +
            + Services + +
            +
            + Bundles all the services. [...] +
            + +
            +
            + + + + + + + + +
            +

            Exceptions / Errors

            + +
            +
            + NoAccountException + +
            +
            + An exception thrown when no account has been selected. +
            + +
            +
            + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/static-assets/favicon.png b/docs/static-assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..6501c9d05c03d8c55d0e2155bdb29c56e72a9abe GIT binary patch literal 5037 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 + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/docs/static-assets/highlight.pack.js b/docs/static-assets/highlight.pack.js new file mode 100644 index 000000000..de37d4ce5 --- /dev/null +++ b/docs/static-assets/highlight.pack.js @@ -0,0 +1,752 @@ +/* + Highlight.js 10.6.0 (eb122d3b) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(t){ +return t instanceof Map?t.clear=t.delete=t.set=()=>{ +throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{var s=t[n] +;"object"!=typeof s||Object.isFrozen(s)||e(s)})),t}var t=e,n=e;t.default=n +;class s{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data} +ignoreMatch(){this.ignore=!0}}function r(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function a(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const i=e=>!!e.kind +;class o{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=r(e)}openNode(e){if(!i(e))return;let t=e.kind +;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){ +i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}class l{constructor(){this.rootNode={ +children:[]},this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +l._collapse(e)})))}}class c extends l{constructor(e){super(),this.options=e} +addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root +;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ +return new o(this,this.options).value()}finalize(){return!0}}function u(e){ +return e?"string"==typeof e?e:e.source:null} +const g="[a-zA-Z]\\w*",d="[a-zA-Z_]\\w*",h="\\b\\d+(\\.\\d+)?",f="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",p="\\b(0b[01]+)",m={ +begin:"\\\\[\\s\\S]",relevance:0},b={className:"string",begin:"'",end:"'", +illegal:"\\n",contains:[m]},x={className:"string",begin:'"',end:'"', +illegal:"\\n",contains:[m]},E={ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},v=(e,t,n={})=>{const s=a({className:"comment",begin:e,end:t,contains:[]},n) +;return s.contains.push(E),s.contains.push({className:"doctag", +begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),s +},w=v("//","$"),N=v("/\\*","\\*/"),y=v("#","$");var R=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:g,UNDERSCORE_IDENT_RE:d, +NUMBER_RE:h,C_NUMBER_RE:f,BINARY_NUMBER_RE:p, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=((...e)=>e.map((e=>u(e))).join(""))(t,/.*\b/,e.binary,/\b.*/)), +a({className:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{ +0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:m,APOS_STRING_MODE:b, +QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:E,COMMENT:v,C_LINE_COMMENT_MODE:w, +C_BLOCK_COMMENT_MODE:N,HASH_COMMENT_MODE:y,NUMBER_MODE:{className:"number", +begin:h,relevance:0},C_NUMBER_MODE:{className:"number",begin:f,relevance:0}, +BINARY_NUMBER_MODE:{className:"number",begin:p,relevance:0},CSS_NUMBER_MODE:{ +className:"number", +begin:h+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp", +begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[m,{begin:/\[/,end:/\]/, +relevance:0,contains:[m]}]}]},TITLE_MODE:{className:"title",begin:g,relevance:0 +},UNDERSCORE_TITLE_MODE:{className:"title",begin:d,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function _(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function k(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=_,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function O(e,t){ +Array.isArray(e.illegal)&&(e.illegal=((...e)=>"("+e.map((e=>u(e))).join("|")+")")(...e.illegal)) +}function M(e,t){if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function A(e,t){ +void 0===e.relevance&&(e.relevance=1)} +const L=["of","and","for","in","not","or","if","then","parent","list","value"] +;function B(e,t,n="keyword"){const s={} +;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ +Object.assign(s,B(e[n],t,n))})),s;function r(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;s[n[0]]=[e,I(n[0],n[1])]}))}}function I(e,t){ +return t?Number(t):(e=>L.includes(e.toLowerCase()))(e)?0:1} +function T(e,{plugins:t}){function n(t,n){ +return RegExp(u(t),"m"+(e.case_insensitive?"i":"")+(n?"g":""))}class s{ +constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=(e=>RegExp(e.toString()+"|").exec("").length-1)(e)+1}compile(){ +0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(((e,t="|")=>{ +const n=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;let s=0,r="" +;for(let a=0;a0&&(r+=t),r+="(";o.length>0;){const e=n.exec(o);if(null==e){r+=o;break} +r+=o.substring(0,e.index), +o=o.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+i):(r+=e[0], +"("===e[0]&&s++)}r+=")"}return r})(e),!0),this.lastIndex=0}exec(e){ +this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e) +;if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),s=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,s)}}class r{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new s +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=a(e.classNameAliases||{}),function t(s,i){const o=s +;if(s.compiled)return o +;[M].forEach((e=>e(s,i))),e.compilerExtensions.forEach((e=>e(s,i))), +s.__beforeBegin=null,[k,O,A].forEach((e=>e(s,i))),s.compiled=!0;let l=null +;if("object"==typeof s.keywords&&(l=s.keywords.$pattern, +delete s.keywords.$pattern), +s.keywords&&(s.keywords=B(s.keywords,e.case_insensitive)), +s.lexemes&&l)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ") +;return l=l||s.lexemes||/\w+/, +o.keywordPatternRe=n(l,!0),i&&(s.begin||(s.begin=/\B|\b/), +o.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin), +s.end||s.endsWithParent||(s.end=/\B|\b/), +s.end&&(o.endRe=n(s.end)),o.terminatorEnd=u(s.end)||"", +s.endsWithParent&&i.terminatorEnd&&(o.terminatorEnd+=(s.end?"|":"")+i.terminatorEnd)), +s.illegal&&(o.illegalRe=n(s.illegal)), +s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>a(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:j(e)?a(e,{ +starts:e.starts?a(e.starts):null +}):Object.isFrozen(e)?a(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{t(e,o) +})),s.starts&&t(s.starts,i),o.matcher=(e=>{const t=new r +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(o),o}(e)}function j(e){ +return!!e&&(e.endsWithParent||j(e.starts))}function S(e){const t={ +props:["language","code","autodetect"],data:()=>({detectedLanguage:"", +unknownLanguage:!1}),computed:{className(){ +return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){ +if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`), +this.unknownLanguage=!0,r(this.code);let t={} +;return this.autoDetect?(t=e.highlightAuto(this.code), +this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals), +this.detectedLanguage=this.language),t.value},autoDetect(){ +return!(this.language&&(e=this.autodetect,!e&&""!==e));var e}, +ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{ +class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{ +Component:t,VuePlugin:{install(e){e.component("highlightjs",t)}}}}const P={ +"after:highlightBlock":({block:e,result:t,text:n})=>{const s=C(e) +;if(!s.length)return;const a=document.createElement("div") +;a.innerHTML=t.value,t.value=((e,t,n)=>{let s=0,a="";const i=[];function o(){ +return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset"}function c(e){ +a+=""}function u(e){("start"===e.event?l:c)(e.node)} +for(;e.length||t.length;){let t=o() +;if(a+=r(n.substring(s,t[0].offset)),s=t[0].offset,t===e){i.reverse().forEach(c) +;do{u(t.splice(0,1)[0]),t=o()}while(t===e&&t.length&&t[0].offset===s) +;i.reverse().forEach(l) +}else"start"===t[0].event?i.push(t[0].node):i.pop(),u(t.splice(0,1)[0])} +return a+r(n.substr(s))})(s,C(a),n)}};function D(e){ +return e.nodeName.toLowerCase()}function C(e){const t=[];return function e(n,s){ +for(let r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?s+=r.nodeValue.length:1===r.nodeType&&(t.push({ +event:"start",offset:s,node:r}),s=e(r,s),D(r).match(/br|hr|img|input/)||t.push({ +event:"stop",offset:s,node:r}));return s}(e,0),t}const H=e=>{console.error(e) +},U=(e,...t)=>{console.log("WARN: "+e,...t)},$=(e,t)=>{ +console.log(`Deprecated as of ${e}. ${t}`)},z=r,K=a,G=Symbol("nomatch") +;return(e=>{const n=Object.create(null),r=Object.create(null),a=[];let i=!0 +;const o=/(^(<[^>]+>|\t|)+|\n)/gm,l="Could not find the language '{}', did you forget to load/include a language module?",u={ +disableAutodetect:!0,name:"Plain text",contains:[]};let g={ +noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +tabReplace:null,useBR:!1,languages:null,__emitter:c};function d(e){ +return g.noHighlightRe.test(e)}function h(e,t,n,s){const r={code:t,language:e} +;M("before:highlight",r);const a=r.result?r.result:f(r.language,r.code,n,s) +;return a.code=r.code,M("after:highlight",a),a}function f(e,t,r,o){const c=t +;function u(e,t){const n=w.case_insensitive?t[0].toLowerCase():t[0] +;return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]} +function d(){null!=R.subLanguage?(()=>{if(""===M)return;let e=null +;if("string"==typeof R.subLanguage){ +if(!n[R.subLanguage])return void O.addText(M) +;e=f(R.subLanguage,M,!0,k[R.subLanguage]),k[R.subLanguage]=e.top +}else e=p(M,R.subLanguage.length?R.subLanguage:null) +;R.relevance>0&&(A+=e.relevance),O.addSublanguage(e.emitter,e.language) +})():(()=>{if(!R.keywords)return void O.addText(M);let e=0 +;R.keywordPatternRe.lastIndex=0;let t=R.keywordPatternRe.exec(M),n="";for(;t;){ +n+=M.substring(e,t.index);const s=u(R,t);if(s){const[e,r]=s +;O.addText(n),n="",A+=r;const a=w.classNameAliases[e]||e;O.addKeyword(t[0],a) +}else n+=t[0];e=R.keywordPatternRe.lastIndex,t=R.keywordPatternRe.exec(M)} +n+=M.substr(e),O.addText(n)})(),M=""}function h(e){ +return e.className&&O.openNode(w.classNameAliases[e.className]||e.className), +R=Object.create(e,{parent:{value:R}}),R}function m(e,t,n){let r=((e,t)=>{ +const n=e&&e.exec(t);return n&&0===n.index})(e.endRe,n);if(r){if(e["on:end"]){ +const n=new s(e);e["on:end"](t,n),n.ignore&&(r=!1)}if(r){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return m(e.parent,t,n)}function b(e){ +return 0===R.matcher.regexIndex?(M+=e[0],1):(I=!0,0)}function x(e){ +const t=e[0],n=c.substr(e.index),s=m(R,e,n);if(!s)return G;const r=R +;r.skip?M+=t:(r.returnEnd||r.excludeEnd||(M+=t),d(),r.excludeEnd&&(M=t));do{ +R.className&&O.closeNode(),R.skip||R.subLanguage||(A+=R.relevance),R=R.parent +}while(R!==s.parent) +;return s.starts&&(s.endSameAsBegin&&(s.starts.endRe=s.endRe), +h(s.starts)),r.returnEnd?0:t.length}let E={};function v(t,n){const a=n&&n[0] +;if(M+=t,null==a)return d(),0 +;if("begin"===E.type&&"end"===n.type&&E.index===n.index&&""===a){ +if(M+=c.slice(n.index,n.index+1),!i){const t=Error("0 width match regex") +;throw t.languageName=e,t.badRule=E.rule,t}return 1} +if(E=n,"begin"===n.type)return function(e){ +const t=e[0],n=e.rule,r=new s(n),a=[n.__beforeBegin,n["on:begin"]] +;for(const n of a)if(n&&(n(e,r),r.ignore))return b(t) +;return n&&n.endSameAsBegin&&(n.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")), +n.skip?M+=t:(n.excludeBegin&&(M+=t), +d(),n.returnBegin||n.excludeBegin||(M=t)),h(n),n.returnBegin?0:t.length}(n) +;if("illegal"===n.type&&!r){ +const e=Error('Illegal lexeme "'+a+'" for mode "'+(R.className||"")+'"') +;throw e.mode=R,e}if("end"===n.type){const e=x(n);if(e!==G)return e} +if("illegal"===n.type&&""===a)return 1 +;if(B>1e5&&B>3*n.index)throw Error("potential infinite loop, way more iterations than matches") +;return M+=a,a.length}const w=_(e) +;if(!w)throw H(l.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const N=T(w,{plugins:a});let y="",R=o||N;const k={},O=new g.__emitter(g);(()=>{ +const e=[];for(let t=R;t!==w;t=t.parent)t.className&&e.unshift(t.className) +;e.forEach((e=>O.openNode(e)))})();let M="",A=0,L=0,B=0,I=!1;try{ +for(R.matcher.considerAll();;){ +B++,I?I=!1:R.matcher.considerAll(),R.matcher.lastIndex=L +;const e=R.matcher.exec(c);if(!e)break;const t=v(c.substring(L,e.index),e) +;L=e.index+t}return v(c.substr(L)),O.closeAllNodes(),O.finalize(),y=O.toHTML(),{ +relevance:Math.floor(A),value:y,language:e,illegal:!1,emitter:O,top:R}}catch(t){ +if(t.message&&t.message.includes("Illegal"))return{illegal:!0,illegalBy:{ +msg:t.message,context:c.slice(L-100,L+100),mode:t.mode},sofar:y,relevance:0, +value:z(c),emitter:O};if(i)return{illegal:!1,relevance:0,value:z(c),emitter:O, +language:e,top:R,errorRaised:t};throw t}}function p(e,t){ +t=t||g.languages||Object.keys(n);const s=(e=>{const t={relevance:0, +emitter:new g.__emitter(g),value:z(e),illegal:!1,top:u} +;return t.emitter.addText(e),t})(e),r=t.filter(_).filter(O).map((t=>f(t,e,!1))) +;r.unshift(s);const a=r.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(_(e.language).supersetOf===t.language)return 1 +;if(_(t.language).supersetOf===e.language)return-1}return 0})),[i,o]=a,l=i +;return l.second_best=o,l}const m={"before:highlightBlock":({block:e})=>{ +g.useBR&&(e.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")) +},"after:highlightBlock":({result:e})=>{ +g.useBR&&(e.value=e.value.replace(/\n/g,"
            "))}},b=/^(<[^>]+>|\t)+/gm,x={ +"after:highlightBlock":({result:e})=>{ +g.tabReplace&&(e.value=e.value.replace(b,(e=>e.replace(/\t/g,g.tabReplace))))}} +;function E(e){let t=null;const n=(e=>{let t=e.className+" " +;t+=e.parentNode?e.parentNode.className:"";const n=g.languageDetectRe.exec(t) +;if(n){const t=_(n[1]) +;return t||(U(l.replace("{}",n[1])),U("Falling back to no-highlight mode for this block.",e)), +t?n[1]:"no-highlight"}return t.split(/\s+/).find((e=>d(e)||_(e)))})(e) +;if(d(n))return;M("before:highlightBlock",{block:e,language:n}),t=e +;const s=t.textContent,a=n?h(n,s,!0):p(s);M("after:highlightBlock",{block:e, +result:a,text:s}),e.innerHTML=a.value,((e,t,n)=>{const s=t?r[t]:n +;e.classList.add("hljs"),s&&e.classList.add(s)})(e,n,a.language),e.result={ +language:a.language,re:a.relevance,relavance:a.relevance +},a.second_best&&(e.second_best={language:a.second_best.language, +re:a.second_best.relevance,relavance:a.second_best.relevance})}const v=()=>{ +v.called||(v.called=!0, +$("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead."), +document.querySelectorAll("pre code").forEach(E))};let w=!1,N=!1;function y(){ +N?document.querySelectorAll("pre code").forEach(E):w=!0}function _(e){ +return e=(e||"").toLowerCase(),n[e]||n[r[e]]}function k(e,{languageName:t}){ +"string"==typeof e&&(e=[e]),e.forEach((e=>{r[e]=t}))}function O(e){const t=_(e) +;return t&&!t.disableAutodetect}function M(e,t){const n=e;a.forEach((e=>{ +e[n]&&e[n](t)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +N=!0,w&&y()}),!1),Object.assign(e,{highlight:h,highlightAuto:p,highlightAll:y, +fixMarkup:e=>{ +return $("10.2.0","fixMarkup will be removed entirely in v11.0"),$("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"), +t=e, +g.tabReplace||g.useBR?t.replace(o,(e=>"\n"===e?g.useBR?"
            ":e:g.tabReplace?e.replace(/\t/g,g.tabReplace):e)):t +;var t},highlightBlock:E,configure:e=>{ +e.useBR&&($("10.3.0","'useBR' will be removed entirely in v11.0"), +$("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")), +g=K(g,e)},initHighlighting:v,initHighlightingOnLoad:()=>{ +$("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."), +w=!0},registerLanguage:(t,s)=>{let r=null;try{r=s(e)}catch(e){ +if(H("Language definition for '{}' could not be registered.".replace("{}",t)), +!i)throw e;H(e),r=u} +r.name||(r.name=t),n[t]=r,r.rawDefinition=s.bind(null,e),r.aliases&&k(r.aliases,{ +languageName:t})},listLanguages:()=>Object.keys(n),getLanguage:_, +registerAliases:k,requireLanguage:e=>{ +$("10.4.0","requireLanguage will be removed entirely in v11."), +$("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844") +;const t=_(e);if(t)return t +;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))}, +autoDetection:O,inherit:K,addPlugin:e=>{a.push(e)},vuePlugin:S(e).VuePlugin +}),e.debugMode=()=>{i=!1},e.safeMode=()=>{i=!0},e.versionString="10.6.0" +;for(const e in R)"object"==typeof R[e]&&t(R[e]) +;return Object.assign(e,R),e.addPlugin(m),e.addPlugin(P),e.addPlugin(x),e})({}) +}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("swift",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} +function a(...n){return n.map((n=>e(n))).join("")}function t(...n){ +return"("+n.map((n=>e(n))).join("|")+")"} +const i=e=>a(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["associatedtype",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],d=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],p=t(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=t(p,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=a(p,F,"*"),h=t(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=t(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=a(h,f,"*"),y=a(/[A-Z]/,f,"*"),g=["autoclosure",a(/convention\(/,t("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",a(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;return e=>{const p={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ +contains:["self"]}),v=[e.C_LINE_COMMENT_MODE,h],N={className:"keyword", +begin:a(/\./,n(t(...s,...u))),end:t(...s,...u),excludeBegin:!0},A={ +match:a(/\./,t(...r)),relevance:0 +},C=r.filter((e=>"string"==typeof e)).concat(["_|0"]),_={variants:[{ +className:"keyword", +match:t(...r.filter((e=>"string"!=typeof e)).concat(c).map(i),...u)}]},D={ +$pattern:t(/\b\w+/,/#\w+/),keyword:C.concat(m),literal:o},B=[N,A,_],k=[{ +match:a(/\./,t(...d)),relevance:0},{className:"built_in", +match:a(/\b/,t(...d),/(?=\()/)}],M={match:/->/,relevance:0},S=[M,{ +className:"operator",relevance:0,variants:[{match:b},{match:`\\.(\\.|${F})+`}] +}],x="([0-9a-fA-F]_*)+",I={className:"number",relevance:0,variants:[{ +match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ +match:`\\b0x(${x})(\\.(${x}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ +match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},O=(e="")=>({ +className:"subst",variants:[{match:a(/\\/,e,/[0\\tnr"']/)},{ +match:a(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),T=(e="")=>({className:"subst", +match:a(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),L=(e="")=>({className:"subst", +label:"interpol",begin:a(/\\/,e,/\(/),end:/\)/}),P=(e="")=>({begin:a(e,/"""/), +end:a(/"""/,e),contains:[O(e),T(e),L(e)]}),$=(e="")=>({begin:a(e,/"/), +end:a(/"/,e),contains:[O(e),L(e)]}),K={className:"string", +variants:[P(),P("#"),P("##"),P("###"),$(),$("#"),$("##"),$("###")]},j={ +match:a(/`/,w,/`/)},z=[j,{className:"variable",match:/\$\d+/},{ +className:"variable",match:`\\$${f}+`}],q=[{match:/(@|#)available/, +className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:E, +contains:[...S,I,K]}]}},{className:"keyword",match:a(/@/,t(...g))},{ +className:"meta",match:a(/@/,w)}],U={match:n(/\b[A-Z]/),relevance:0,contains:[{ +className:"type", +match:a(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") +},{className:"type",match:y,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:a(/\s+&\s+/,n(y)),relevance:0}]},Z={ +begin://,keywords:D,contains:[...v,...B,...q,M,U]};U.contains.push(Z) +;const G={begin:/\(/,end:/\)/,relevance:0,keywords:D,contains:["self",{ +match:a(w,/\s*:/),keywords:"_|0",relevance:0 +},...v,...B,...k,...S,I,K,...z,...q,U]},H={beginKeywords:"func",contains:[{ +className:"title",match:t(j.match,w,b),endsParent:!0,relevance:0},p]},R={ +begin://,contains:[...v,U]},V={begin:/\(/,end:/\)/,keywords:D, +contains:[{begin:t(n(a(w,/\s*:/)),n(a(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0, +contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:w}] +},...v,...B,...S,I,K,...q,U,G],endsParent:!0,illegal:/["']/},W={ +className:"function",match:n(/\bfunc\b/),contains:[H,R,V,p],illegal:[/\[/,/%/] +},X={className:"function",match:/\b(subscript|init[?!]?)\s*(?=[<(])/,keywords:{ +keyword:"subscript init init? init!",$pattern:/\w+[?!]?/},contains:[R,V,p], +illegal:/\[|%/},J={beginKeywords:"operator",end:e.MATCH_NOTHING_RE,contains:[{ +className:"title",match:b,endsParent:!0,relevance:0}]},Q={ +beginKeywords:"precedencegroup",end:e.MATCH_NOTHING_RE,contains:[{ +className:"title",match:y,relevance:0},{begin:/{/,end:/}/,relevance:0, +endsParent:!0,keywords:[...l,...o],contains:[U]}]};for(const e of K.variants){ +const n=e.contains.find((e=>"interpol"===e.label));n.keywords=D +;const a=[...B,...k,...S,I,K,...z];n.contains=[...a,{begin:/\(/,end:/\)/, +contains:["self",...a]}]}return{name:"Swift",keywords:D,contains:[...v,W,X,{ +className:"class",beginKeywords:"struct protocol class extension enum", +end:"\\{",excludeEnd:!0,keywords:D,contains:[e.inherit(e.TITLE_MODE,{ +begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...B]},J,Q,{ +beginKeywords:"import",end:/$/,contains:[...v],relevance:0 +},...B,...k,...S,I,K,...z,...q,U,G]}}})());hljs.registerLanguage("c",(()=>{"use strict";function e(e){ +return((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(",e,")?") +}return t=>{const n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),r="[a-zA-Z_]\\w*::",a="(decltype\\(auto\\)|"+e(r)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",i={ +className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string", +variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", +contains:[t.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},t.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},t.inherit(s,{className:"meta-string"}),{ +className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n" +},n,t.C_BLOCK_COMMENT_MODE]},l={className:"title",begin:e(r)+t.IDENT_RE, +relevance:0},d=e(r)+t.IDENT_RE+"\\s*\\(",u={ +keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary", +literal:"true false nullptr NULL"},m=[c,i,n,t.C_BLOCK_COMMENT_MODE,o,s],p={ +variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ +beginKeywords:"new throw return else",end:/;/}],keywords:u,contains:m.concat([{ +begin:/\(/,end:/\)/,keywords:u,contains:m.concat(["self"]),relevance:0}]), +relevance:0},_={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d, +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:u,illegal:/[^\w\s\*&:<>.]/, +contains:[{begin:"decltype\\(auto\\)",keywords:u,relevance:0},{begin:d, +returnBegin:!0,contains:[l],relevance:0},{className:"params",begin:/\(/, +end:/\)/,keywords:u,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,s,o,i,{ +begin:/\(/,end:/\)/,keywords:u,relevance:0, +contains:["self",n,t.C_BLOCK_COMMENT_MODE,s,o,i]}] +},i,n,t.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["c","h"],keywords:u, +disableAutodetect:!0,illegal:"",keywords:u,contains:["self",i]},{begin:t.IDENT_RE+"::",keywords:u},{ +className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, +contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{ +preprocessor:c,strings:s,keywords:u}}}})());hljs.registerLanguage("objectivec",(()=>{"use strict";return e=>{ +const n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n, +keyword:"@interface @class @protocol @implementation"};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{$pattern:n, +keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN", +literal:"false true FALSE TRUE nil YES NO NULL", +built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once" +},illegal:"/,end:/$/, +illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:/(\{|$)/, +excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{ +begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}})());hljs.registerLanguage("kotlin",(()=>{"use strict" +;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ +className:"number",variants:[{ +begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ +begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};return e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},i={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},t={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[t,s]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,t,s]}]};s.contains.push(r);const l={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},c={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"meta-string"})]}] +},o=a,b=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),E={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},d=E;return d.variants[1].contains=[E],E.variants[1].contains=[d], +{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{ +relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}] +}),e.C_LINE_COMMENT_MODE,b,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},i,l,c,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[E,e.C_LINE_COMMENT_MODE,b],relevance:0 +},e.C_LINE_COMMENT_MODE,b,l,c,r,e.C_NUMBER_MODE]},b]},{className:"class", +beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/, +excludeBegin:!0,returnEnd:!0},l,c]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},o]}}})());hljs.registerLanguage("xml",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} +function a(...n){return n.map((n=>e(n))).join("")}function s(...n){ +return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ +const t=a(/[A-Z_]/,a("(",/[A-Z0-9_.-]*:/,")?"),/[A-Z0-9_.-]*/),i={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},r={begin:/\s/, +contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},c=e.inherit(r,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{ +className:"meta-string"}),g=e.inherit(e.QUOTE_STRING_MODE,{ +className:"meta-string"}),m={endsWithParent:!0,illegal:/`]+/}]}] +}]};return{name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,contains:[{className:"meta",begin://, +relevance:10,contains:[r,g,l,c,{begin:/\[/,end:/\]/,contains:[{className:"meta", +begin://,contains:[r,c,g,l]}]}]},e.COMMENT(//,{ +relevance:10}),{begin://,relevance:10},i,{ +className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[m],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[m],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:a(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name", +begin:t,relevance:0,starts:m}]},{className:"tag",begin:a(/<\//,n(a(t,/>/))), +contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0}]}]}} +})());hljs.registerLanguage("markdown",(()=>{"use strict";function n(...n){ +return n.map((n=>{return(e=n)?"string"==typeof e?e:e.source:null;var e +})).join("")}return e=>{const a={begin:/<\/?[A-Za-z_]/,end:">", +subLanguage:"xml",relevance:0},i={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0 +},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{begin:n(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.+?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{ +className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},s={className:"strong",contains:[], +variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},c={ +className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{ +begin:/_(?!_)/,end:/_/,relevance:0}]};s.contains.push(c),c.contains.push(s) +;let t=[a,i] +;return s.contains=s.contains.concat(t),c.contains=c.contains.concat(t), +t=t.concat(s,c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:t},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:t}]}]},a,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},s,c,{className:"quote",begin:"^>\\s+",contains:t, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},i,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})());hljs.registerLanguage("ruby",(()=>{"use strict";function e(...e){ +return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n +})).join("")}return n=>{ +const a="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",i={ +keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__", +built_in:"proc lambda",literal:"true false nil"},s={className:"doctag", +begin:"@[A-Za-z]+"},r={begin:"#<",end:">"},b=[n.COMMENT("#","$",{contains:[s] +}),n.COMMENT("^=begin","^=end",{contains:[s],relevance:10 +}),n.COMMENT("^__END__","\\n$")],c={className:"subst",begin:/#\{/,end:/\}/, +keywords:i},t={className:"string",contains:[n.BACKSLASH_ESCAPE,c],variants:[{ +begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/, +end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{ +begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/, +end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{ +begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{ +begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:/<<[-~]?'?(\w+)\n(?:[^\n]*\n)*?\s*\1\b/,returnBegin:!0,contains:[{ +begin:/<<[-~]?'?/},n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[n.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",d={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},l={className:"params",begin:"\\(",end:"\\)", +endsParent:!0,keywords:i},o=[t,{className:"class",beginKeywords:"class module", +end:"$|;",illegal:/=/,contains:[n.inherit(n.TITLE_MODE,{ +begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{ +begin:"("+n.IDENT_RE+"::)?"+n.IDENT_RE,relevance:0}]}].concat(b)},{ +className:"function",begin:e(/def\s*/,(_=a+"\\s*(\\(|;|$)",e("(?=",_,")"))), +relevance:0,keywords:"def",end:"$|;",contains:[n.inherit(n.TITLE_MODE,{begin:a +}),l].concat(b)},{begin:n.IDENT_RE+"::"},{className:"symbol", +begin:n.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[t,{begin:a}],relevance:0},d,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:i},{ +begin:"("+n.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{ +className:"regexp",contains:[n.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{ +begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(", +end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}] +}].concat(r,b),relevance:0}].concat(r,b);var _;c.contains=o,l.contains=o +;const E=[{begin:/^\s*=>/,starts:{end:"$",contains:o}},{className:"meta", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",contains:o}}];return b.unshift(r),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:i,illegal:/\/\*/, +contains:[n.SHEBANG({binary:"ruby"})].concat(E).concat(b).concat(o)}}})());hljs.registerLanguage("yaml",(()=>{"use strict";return e=>{ +var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={ +className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ +},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", +variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{ +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={ +end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},t={begin:/\{/, +end:/\}/,contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]", +contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{ +begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ +begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", +relevance:10},{className:"string", +begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ +begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, +relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type", +begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a +},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", +begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", +relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ +className:"number", +begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" +},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,g,s],r=[...b] +;return r.pop(),r.push(i),l.contains=r,{name:"YAML",case_insensitive:!0, +aliases:["yml","YAML"],contains:b}}})());hljs.registerLanguage("java",(()=>{"use strict" +;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ +className:"number",variants:[{ +begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ +begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};return e=>{ +var n="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s={ +className:"meta",begin:"@[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*", +contains:[{begin:/\(/,end:/\)/,contains:["self"]}]};const r=a;return{ +name:"Java",aliases:["jsp"],keywords:n,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +className:"class",beginKeywords:"class interface enum",end:/[{;=]/, +excludeEnd:!0,relevance:1,keywords:"class interface enum",illegal:/[:"\[\]]/, +contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{className:"class", +begin:"record\\s+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,excludeEnd:!0, +end:/[{;=]/,keywords:n,contains:[{beginKeywords:"record"},{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, +keywords:n,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"function", +begin:"([\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(<[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(", +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, +keywords:n,relevance:0, +contains:[s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,r,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},r,s]}}})());hljs.registerLanguage("dart",(()=>{"use strict";return e=>{const n={ +className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"}]},a={className:"subst", +variants:[{begin:/\$\{/,end:/\}/}],keywords:"true false null this is new super" +},t={className:"string",variants:[{begin:"r'''",end:"'''"},{begin:'r"""', +end:'"""'},{begin:"r'",end:"'",illegal:"\\n"},{begin:'r"',end:'"',illegal:"\\n" +},{begin:"'''",end:"'''",contains:[e.BACKSLASH_ESCAPE,n,a]},{begin:'"""', +end:'"""',contains:[e.BACKSLASH_ESCAPE,n,a]},{begin:"'",end:"'",illegal:"\\n", +contains:[e.BACKSLASH_ESCAPE,n,a]},{begin:'"',end:'"',illegal:"\\n", +contains:[e.BACKSLASH_ESCAPE,n,a]}]};a.contains=[e.C_NUMBER_MODE,t] +;const i=["Comparable","DateTime","Duration","Function","Iterable","Iterator","List","Map","Match","Object","Pattern","RegExp","Set","Stopwatch","String","StringBuffer","StringSink","Symbol","Type","Uri","bool","double","int","num","Element","ElementList"],r=i.map((e=>e+"?")) +;return{name:"Dart",keywords:{ +keyword:"abstract as assert async await break case catch class const continue covariant default deferred do dynamic else enum export extends extension external factory false final finally for Function get hide if implements import in inferface is late library mixin new null on operator part required rethrow return set show static super switch sync this throw true try typedef var void while with yield", +built_in:i.concat(r).concat(["Never","Null","dynamic","print","document","querySelector","querySelectorAll","window"]), +$pattern:/[A-Za-z][A-Za-z0-9_]*\??/}, +contains:[t,e.COMMENT(/\/\*\*(?!\/)/,/\*\//,{subLanguage:"markdown",relevance:0 +}),e.COMMENT(/\/{3,} ?/,/$/,{contains:[{subLanguage:"markdown",begin:".", +end:"$",relevance:0}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{ +className:"class",beginKeywords:"class interface",end:/\{/,excludeEnd:!0, +contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE] +},e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"},{begin:"=>"}]}}})());hljs.registerLanguage("plaintext",(()=>{"use strict";return t=>({ +name:"Plain text",aliases:["text","txt"],disableAutodetect:!0})})());hljs.registerLanguage("bash",(()=>{"use strict";function e(...e){ +return e.map((e=>{return(s=e)?"string"==typeof s?s:s.source:null;var s +})).join("")}return s=>{const n={},t={begin:/\$\{/,end:/\}/,contains:["self",{ +begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{ +begin:e(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},i={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, +contains:[s.BACKSLASH_ESCAPE,n,a]};a.contains.push(c);const o={begin:/\$\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,n] +},r=s.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/, +keyword:"if then else elif fi for while in do done case esac function", +literal:"true false", +built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp" +},contains:[r,s.SHEBANG(),l,o,s.HASH_COMMENT_MODE,i,c,{className:"",begin:/\\"/ +},{className:"string",begin:/'/,end:/'/},n]}}})());hljs.registerLanguage("shell",(()=>{"use strict";return s=>({ +name:"Shell Session",aliases:["console"],contains:[{className:"meta", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#]/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]})})());hljs.registerLanguage("css",(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() +;return n=>{const a=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, +HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, +ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, +illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} +}))(n),l=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS", +case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, +classNameAliases:{keyframePosition:"selector-tag"}, +contains:[n.C_BLOCK_COMMENT_MODE,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ +},n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 +},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},a.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+i.join("|")+")"},{begin:"::("+o.join("|")+")"}]},{ +className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:":",end:"[;}]", +contains:[a.HEXCOLOR,a.IMPORTANT,n.CSS_NUMBER_MODE,...l,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}] +},{className:"built_in",begin:/[\w-]+(?=\()/}]},{ +begin:(s=/@/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",s,")")), +end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword", +begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0, +relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:t.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute" +},...l,n.CSS_NUMBER_MODE]}]},{className:"selector-tag", +begin:"\\b("+e.join("|")+")\\b"}]};var s}})());hljs.registerLanguage("json",(()=>{"use strict";return n=>{const e={ +literal:"true false null" +},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],a=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],l={ +end:",",endsWithParent:!0,excludeEnd:!0,contains:a,keywords:e},t={begin:/\{/, +end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/, +contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(l,{begin:/:/ +})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(l)], +illegal:"\\S"};return a.push(t,s),i.forEach((n=>{a.push(n)})),{name:"JSON", +contains:a,keywords:e,illegal:"\\S"}}})());hljs.registerLanguage("javascript",(()=>{"use strict" +;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) +;function r(e){return t("(?=",e,")")}function t(...e){return e.map((e=>{ +return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ +const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/, +isTrulyOpeningTag:(e,n)=>{const a=e[0].length+e.index,s=e.input[a] +;"<"!==s?">"===s&&(((e,{after:n})=>{const a="", +returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ +begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 +},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:A}]}] +},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ +variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, +end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, +contains:["self"]}]}],relevance:0},{className:"function", +beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, +contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),p],illegal:/%/},{ +beginKeywords:"while if switch catch for"},{className:"function", +begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,contains:[p,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ +begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", +beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ +beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, +end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",p] +},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", +contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},p]},{begin:/\$[(.]/}] +}}})()); \ No newline at end of file diff --git a/docs/static-assets/play_button.svg b/docs/static-assets/play_button.svg new file mode 100644 index 000000000..c39a2f4a8 --- /dev/null +++ b/docs/static-assets/play_button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static-assets/readme.md b/docs/static-assets/readme.md new file mode 100644 index 000000000..9b2d3a781 --- /dev/null +++ b/docs/static-assets/readme.md @@ -0,0 +1,21 @@ +# highlight.js + +Generated from https://highlightjs.org/download/ on 2021-03-07 + +**Included languages:** + +* bash +* c +* css +* dart +* html, xml +* java +* javascript +* json +* kotlin +* markdown +* objective-c +* plaintext +* shell +* swift +* yaml diff --git a/docs/static-assets/script.js b/docs/static-assets/script.js new file mode 100644 index 000000000..190a000f1 --- /dev/null +++ b/docs/static-assets/script.js @@ -0,0 +1,496 @@ +function initSideNav() { + const leftNavToggle = document.getElementById('sidenav-left-toggle'); + const leftDrawer = document.querySelector('.sidebar-offcanvas-left'); + const overlay = document.getElementById('overlay-under-drawer'); + + function toggleBoth() { + if (leftDrawer) { + leftDrawer.classList.toggle('active'); + } + + if (overlay) { + overlay.classList.toggle('active'); + } + } + + if (overlay) { + overlay.addEventListener('click', toggleBoth); + } + + if (leftNavToggle) { + leftNavToggle.addEventListener('click', toggleBoth); + } +} + +function saveLeftScroll() { + const leftSidebar = document.getElementById('dartdoc-sidebar-left'); + sessionStorage.setItem('dartdoc-sidebar-left-scrollt' + window.location.pathname, leftSidebar.scrollTop.toString()); + sessionStorage.setItem('dartdoc-sidebar-left-scrolll' + window.location.pathname, leftSidebar.scrollLeft.toString()); +} + +function saveMainContentScroll() { + const mainContent = document.getElementById('dartdoc-main-content'); + sessionStorage.setItem('dartdoc-main-content-scrollt' + window.location.pathname, mainContent.scrollTop.toString()); + sessionStorage.setItem('dartdoc-main-content-scrolll' + window.location.pathname, mainContent.scrollLeft.toString()); +} + +function saveRightScroll() { + const rightSidebar = document.getElementById('dartdoc-sidebar-right'); + sessionStorage.setItem('dartdoc-sidebar-right-scrollt' + window.location.pathname, rightSidebar.scrollTop.toString()); + sessionStorage.setItem('dartdoc-sidebar-right-scrolll' + window.location.pathname, rightSidebar.scrollLeft.toString()); +} + +function restoreScrolls() { + const leftSidebar = document.getElementById('dartdoc-sidebar-left'); + const mainContent = document.getElementById('dartdoc-main-content'); + const rightSidebar = document.getElementById('dartdoc-sidebar-right'); + + try { + const leftSidebarX = sessionStorage.getItem('dartdoc-sidebar-left-scrolll' + window.location.pathname); + const leftSidebarY = sessionStorage.getItem('dartdoc-sidebar-left-scrollt' + window.location.pathname); + + const mainContentX = sessionStorage.getItem('dartdoc-main-content-scrolll' + window.location.pathname); + const mainContentY = sessionStorage.getItem('dartdoc-main-content-scrollt' + window.location.pathname); + + const rightSidebarX = sessionStorage.getItem('dartdoc-sidebar-right-scrolll' + window.location.pathname); + const rightSidebarY = sessionStorage.getItem('dartdoc-sidebar-right-scrollt' + window.location.pathname); + + leftSidebar.scrollTo(parseFloat(leftSidebarX), parseFloat(leftSidebarY)); + mainContent.scrollTo(parseFloat(mainContentX), parseFloat(mainContentY)); + rightSidebar.scrollTo(parseFloat(rightSidebarX), parseFloat(rightSidebarY)); + } finally { + // Set visibility to visible after scroll to prevent the brief appearance of the + // panel in the wrong position. + leftSidebar.style.visibility = 'visible'; + mainContent.style.visibility = 'visible'; + rightSidebar.style.visibility = 'visible'; + } +} + +function initScrollSave() { + const leftSidebar = document.getElementById('dartdoc-sidebar-left'); + const mainContent = document.getElementById('dartdoc-main-content'); + const rightSidebar = document.getElementById('dartdoc-sidebar-right'); + + leftSidebar.addEventListener("scroll", saveLeftScroll, true); + mainContent.addEventListener("scroll", saveMainContentScroll, true); + rightSidebar.addEventListener("scroll", saveRightScroll, true); +} + +const weights = { + 'library' : 2, + 'class' : 2, + 'mixin' : 3, + 'extension' : 3, + 'typedef' : 3, + 'method' : 4, + 'accessor' : 4, + 'operator' : 4, + 'constant' : 4, + 'property' : 4, + 'constructor' : 4 +}; + +function findMatches(index, query) { + if (query === '') { + return []; + } + + const allMatches = []; + + index.forEach(element => { + function score(value) { + value -= element.overriddenDepth * 10; + const weightFactor = weights[element.type] || 4; + allMatches.push({element: element, score: (value / weightFactor) >> 0}); + } + + const name = element.name; + const qualifiedName = element.qualifiedName; + const lowerName = name.toLowerCase(); + const lowerQualifiedName = qualifiedName.toLowerCase(); + const lowerQuery = query.toLowerCase(); + + if (name === query || qualifiedName === query || name === `dart:${query}`) { + score(2000); + } else if (lowerName === `dart:${lowerQuery}`) { + score(1800); + } else if (lowerName === lowerQuery || lowerQualifiedName === lowerQuery) { + score(1700); + } else if (query.length > 1) { + if (name.startsWith(query) || qualifiedName.startsWith(query)) { + score(750); + } else if (lowerName.startsWith(lowerQuery) || lowerQualifiedName.startsWith(lowerQuery)) { + score(650); + } else if (name.includes(query) || qualifiedName.includes(query)) { + score(500); + } else if (lowerName.includes(lowerQuery) || lowerQualifiedName.includes(query)) { + score(400); + } + } + }); + + allMatches.sort((a, b) => { + const x = b.score - a.score; + if (x === 0) { + return a.element.name.length - b.element.name.length; + } + return x; + }); + + const justElements = []; + + for (let i = 0; i < allMatches.length; i++) { + justElements.push(allMatches[i].element); + } + + return justElements; +} + +let baseHref = ''; + +const minLength = 1; +const suggestionLimit = 10; + +function initializeSearch(input, index) { + input.disabled = false; + input.setAttribute('placeholder', 'Search API Docs'); + + // Handle grabbing focus when the users types / outside of the input + document.addEventListener('keypress', (event) => { + if (event.code === 'Slash' && !(document.activeElement instanceof HTMLInputElement)) { + event.preventDefault(); + input.focus(); + } + }); + + // Prepare elements + + const parentForm = input.parentNode; + const wrapper = document.createElement('div'); + wrapper.classList.add('tt-wrapper'); + + parentForm.replaceChild(wrapper, input); + + const inputHint = document.createElement('input'); + inputHint.setAttribute('type', 'text'); + inputHint.setAttribute('autocomplete', 'off'); + inputHint.setAttribute('readonly', 'true'); + inputHint.setAttribute('spellcheck', 'false'); + inputHint.setAttribute('tabindex', '-1'); + inputHint.classList.add('typeahead', 'tt-hint'); + + wrapper.appendChild(inputHint); + + input.setAttribute('autocomplete', 'off'); + input.setAttribute('spellcheck', 'false'); + input.classList.add('tt-input'); + + wrapper.appendChild(input); + + const listBox = document.createElement('div'); + listBox.setAttribute('role', 'listbox'); + listBox.setAttribute('aria-expanded', 'false'); + listBox.style.display = 'none'; + listBox.classList.add('tt-menu'); + + const presentation = document.createElement('div'); + presentation.classList.add('tt-elements'); + + listBox.appendChild(presentation); + + wrapper.appendChild(listBox); + + // Set up various search functionality + + function highlight(text, query) { + query = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + return text.replace(new RegExp(query, 'gi'), (matched) => { + return `${matched}`; + }); + } + + function createSuggestion(query, match) { + const suggestion = document.createElement('div'); + suggestion.setAttribute('data-href', match.href); + suggestion.classList.add('tt-suggestion'); + + const suggestionTitle = document.createElement('span'); + suggestionTitle.classList.add('tt-suggestion-title'); + suggestionTitle.innerHTML = highlight(`${match.name} ${match.type.toLowerCase()}`, query); + + suggestion.appendChild(suggestionTitle); + + if (match.enclosedBy) { + const fromLib = document.createElement('div'); + fromLib.classList.add('search-from-lib'); + fromLib.innerHTML = `from ${highlight(match.enclosedBy.name, query)}`; + + suggestion.appendChild(fromLib); + } + + suggestion.addEventListener('mousedown', event => { + event.preventDefault(); + }); + + suggestion.addEventListener('click', event => { + if (match.href) { + window.location = baseHref + match.href; + event.preventDefault(); + } + }); + + return suggestion; + } + + let storedValue = null; + let actualValue = ''; + let hint = null; + + let suggestionElements = []; + let suggestionsInfo = []; + let selectedElement = null; + + function setHint(value) { + hint = value; + inputHint.value = value || ''; + } + + function updateSuggestions(query, suggestions) { + suggestionsInfo = []; + suggestionElements = []; + presentation.textContent = ''; + + if (suggestions.length < minLength) { + setHint(null) + hideSuggestions(); + return; + } + + for (let i = 0; i < suggestions.length; i++) { + const element = createSuggestion(query, suggestions[i]); + suggestionElements.push(element); + presentation.appendChild(element); + } + + suggestionsInfo = suggestions; + + setHint(query + suggestions[0].name.slice(query.length)); + selectedElement = null; + + showSuggestions(); + } + + function handle(newValue, forceUpdate) { + if (actualValue === newValue && !forceUpdate) { + return; + } + + if (newValue === null || newValue.length === 0) { + updateSuggestions('', []); + return; + } + + const suggestions = findMatches(index, newValue).slice(0, suggestionLimit); + actualValue = newValue; + + updateSuggestions(newValue, suggestions); + } + + function showSuggestions() { + if (presentation.hasChildNodes()) { + listBox.style.display = 'block'; + listBox.setAttribute('aria-expanded', 'true'); + } + } + + function hideSuggestions() { + listBox.style.display = 'none'; + listBox.setAttribute('aria-expanded', 'false'); + } + + // Hook up events + + input.addEventListener('focus', () => { + handle(input.value, true); + }); + + input.addEventListener('blur', () => { + selectedElement = null; + if (storedValue !== null) { + input.value = storedValue; + storedValue = null; + } + hideSuggestions(); + setHint(null); + }); + + input.addEventListener('input', event => { + handle(event.target.value); + }); + + input.addEventListener('keydown', event => { + if (suggestionElements.length === 0) { + return; + } + + if (event.code === 'Enter') { + const selectingElement = selectedElement || 0; + const href = suggestionElements[selectingElement].dataset.href; + if (href) { + window.location = baseHref + href; + } + return; + } + + if (event.code === 'Tab') { + if (selectedElement === null) { + // The user wants to fill the field with the hint + if (hint !== null) { + input.value = hint; + handle(hint); + event.preventDefault(); + } + } else { + // The user wants to fill the input field with their currently selected suggestion + handle(suggestionsInfo[selectedElement].name); + storedValue = null; + selectedElement = null; + event.preventDefault(); + } + return; + } + + const lastIndex = suggestionElements.length - 1; + const previousSelectedElement = selectedElement; + + if (event.code === 'ArrowUp') { + if (selectedElement === null) { + selectedElement = lastIndex; + } else if (selectedElement === 0) { + selectedElement = null; + } else { + selectedElement--; + } + } else if (event.code === 'ArrowDown') { + if (selectedElement === null) { + selectedElement = 0; + } else if (selectedElement === lastIndex) { + selectedElement = null; + } else { + selectedElement++; + } + } else { + if (storedValue !== null) { + storedValue = null; + handle(input.value); + } + return; + } + + if (previousSelectedElement !== null) { + suggestionElements[previousSelectedElement].classList.remove('tt-cursor'); + } + + if (selectedElement !== null) { + const selected = suggestionElements[selectedElement]; + selected.classList.add('tt-cursor'); + + // Guarantee the selected element is visible + if (selectedElement === 0) { + listBox.scrollTop = 0; + } else if (selectedElement === lastIndex) { + listBox.scrollTop = listBox.scrollHeight; + } else { + const offsetTop = selected.offsetTop; + const parentOffsetHeight = listBox.offsetHeight; + if (offsetTop < parentOffsetHeight || parentOffsetHeight < (offsetTop + selected.offsetHeight)) { + selected.scrollIntoView({behavior: 'auto', block: 'nearest'}); + } + } + + if (storedValue === null) { + // Store the actual input value to display their currently selected item + storedValue = input.value; + } + input.value = suggestionsInfo[selectedElement].name; + setHint(''); + } else if (storedValue !== null && previousSelectedElement !== null) { + // They are moving back to the input field, so return the stored value + input.value = storedValue; + setHint(storedValue + suggestionsInfo[0].name.slice(storedValue.length)); + storedValue = null; + } + + event.preventDefault(); + }); +} + +document.addEventListener('DOMContentLoaded', () => { + // Place this first so that unexpected exceptions in other JavaScript do not block page visibility. + restoreScrolls(); + hljs.highlightAll(); + initSideNav(); + initScrollSave(); + + const searchBox = document.getElementById('search-box'); + const searchBody = document.getElementById('search-body'); + const searchSidebar = document.getElementById('search-sidebar'); + + if (document.body.getAttribute('data-using-base-href') === 'false') { + // If dartdoc did not add a base-href tag, we will need to add the relative + // path ourselves. + baseHref = document.body.getAttribute('data-base-href'); + } + + function disableSearch() { + console.log('Could not activate search functionality.'); + if (searchBox) { + searchBox.placeholder = 'Failed to initialize search'; + } + + if (searchBody) { + searchBody.placeholder = 'Failed to initialize search'; + } + + if (searchSidebar) { + searchSidebar.placeholder = 'Failed to initialize search'; + } + } + + if ('fetch' in window) { + fetch(baseHref + 'index.json', {method: 'GET'}) + .then(response => response.json()) + .then(index => { + // Handle if the user specified a `search` parameter in the URL + if ('URLSearchParams' in window) { + const search = new URLSearchParams(window.location.search).get('search'); + if (search) { + const matches = findMatches(search); + if (matches.length !== 0) { + window.location = baseHref + matches[0].href; + return; + } + } + } + + // Initialize all three search fields + if (searchBox) { + initializeSearch(searchBox, index); + } + + if (searchBody) { + initializeSearch(searchBody, index); + } + + if (searchSidebar) { + initializeSearch(searchSidebar, index); + } + }) + .catch(() => { + disableSearch(); + }); + } else { + disableSearch(); + } +}); diff --git a/docs/static-assets/styles.css b/docs/static-assets/styles.css new file mode 100644 index 000000000..1c6470225 --- /dev/null +++ b/docs/static-assets/styles.css @@ -0,0 +1,1014 @@ + +/* Palette generated by Material Palette - materialpalette.com/blue/cyan */ + +.dark-primary-color { background: #1976D2; } +.default-primary-color { background: #2196F3; } +.light-primary-color { background: #BBDEFB; } +.text-primary-color { color: #FFFFFF; } +.accent-color { background: #00BCD4; } +.primary-text-color { color: #212121; } +.secondary-text-color { color: #727272; } +.divider-color { border-color: #B6B6B6; } + +/* for layout */ +html, +body { + margin: 0; + padding: 0; + height: 100%; + width: 100%; + overflow: hidden; + box-sizing: border-box; +} + +*, *:before, *:after { + box-sizing: inherit; +} + +body { + display: flex; + flex-direction: column; + -webkit-overflow-scrolling: touch; +} + +header { + flex: 0 0 50px; + display: flex; + flex-direction: row; + align-items: center; + padding-left: 30px; +} + +header ol { + list-style: none; + margin: 0; + padding: 0; +} + +header ol li { + display: inline; +} + +header form { + display: flex; + flex: 1; + justify-content: flex-end; + padding-right: 30px; +} + +header#header-search-sidebar { + height: 50px; + margin-bottom: 25px; +} + +footer { + flex: 0 0 16px; + text-align: center; + padding: 16px 20px; +} + +main { + flex: 1; + display: flex; + flex-direction: row; + padding: 20px; + min-height: 0; +} + +.sidebar-offcanvas-left { + flex: 0 1 230px; + overflow-y: scroll; + padding: 20px 0 15px 30px; + margin: 5px 20px 0 0; + visibility: hidden; /* shown by Javascript after scroll position restore */ +} + +::-webkit-scrollbar-button{ display: none; height: 13px; border-radius: 0px; background-color: #AAA; } +::-webkit-scrollbar-button:hover{ background-color: #AAA; } +::-webkit-scrollbar-thumb{ background-color: #CCC; } +::-webkit-scrollbar-thumb:hover{ background-color: #CCC; } +::-webkit-scrollbar{ width: 4px; } + +.main-content::-webkit-scrollbar{ width: 8px; } + +.main-content { + flex: 1; + overflow-y: scroll; + padding: 10px 20px 0 20px; + visibility: hidden; /* shown by Javascript after scroll position restore */ +} + +.sidebar-offcanvas-right { + flex: 0 1 12em; + overflow-y: scroll; + padding: 20px 15px 15px 15px; + margin-top: 5px; + margin-right: 20px; + visibility: hidden; /* shown by Javascript after scroll position restore */ +} +/* end for layout */ + +body { + -webkit-text-size-adjust: 100%; + overflow-x: hidden; + font-family: Roboto, sans-serif; + font-size: 16px; + line-height: 1.42857143; + color: #111111; + background-color: #fff; +} + +/* some of this is to reset bootstrap */ +nav.navbar { + background-color: inherit; + min-height: 50px; + border: 0; +} + +@media (max-width: 768px) { + .hidden-xs { + display: none !important; + } +} + +@media (min-width: 769px) { + .hidden-l { + display: none !important; + } +} + +nav.navbar .row { + padding-top: 8px; +} + +nav .container { + white-space: nowrap; +} + +header { + background-color: #eeeeee; + box-shadow: 0 3px 5px rgba(0,0,0,0.1); +} + +header.header-fixed nav.navbar-fixed-top { + box-shadow: 0 3px 5px rgba(0,0,0,0.1); +} + +header.container-fluid { + padding: 0; +} + +header .masthead { + padding-top: 64px; +} + +header .contents { + padding: 0; +} + +@media screen and (max-width:768px) { + header .contents { + padding-left: 15px; + padding-right: 15px; + } +} + +a { + text-decoration: none; +} + +.body { + margin-top: 90px; +} + +section { + margin-bottom: 36px; +} + +dl { + margin: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: Roboto, sans-serif; + font-weight: 400; + margin-top: 1.5em; + color: #111111; +} + +h1.title { + overflow: hidden; + text-overflow: ellipsis; +} + +h1 { + font-size: 37px; + margin-top: 0; + margin-bottom: 0.67em; +} + +h2 { + font-size: 28px; +} + +h5 { + font-size: 16px; +} + +.subtitle { + font-size: 17px; + min-height: 1.4em; +} + +.title-description .subtitle { + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; +} + +p { + margin-bottom: 1em; + margin-top: 0; +} + +a { + color: #0175C2; +} + +a:hover { + color: #13B9FD; +} + +pre.prettyprint { + font-family: 'Roboto Mono', Menlo, monospace; + color: black; + border-radius: 0; + font-size: 15px; + word-wrap: normal; + line-height: 1.4; + border: 0; + margin: 16px 0 16px 0; + padding: 8px; +} + +pre code { + white-space: pre; + word-wrap: initial; + font-size: 100% +} + +.fixed { + white-space: pre; +} + +pre { + border: 1px solid #ddd; + background-color: #eee; + font-size: 14px; +} + +code { + font-family: 'Roboto Mono', Menlo, monospace; + /* overriding bootstrap */ + color: inherit; + padding: 0.2em 0.4em; + font-size: 85%; + background-color: rgba(27,31,35,0.05); + border-radius: 3px; +} + +@media(max-width: 768px) { + nav .container { + width: 100% + } + + h1 { + font-size: 24px; + } + + pre { + margin: 16px 0; + } +} + +@media (min-width: 768px) { + ul.subnav li { + font-size: 17px; + } +} + +header h1 { + font-weight: 400; + margin-bottom: 16px; +} + +header a, +header p, +header li { + color: #111111; +} + +header a:hover { + color: #0175C2; +} + +header h1 .kind { + color: #555; +} + +dt { + font-weight: normal; +} + +dd { + color: #212121; + margin-bottom: 1em; + margin-left: 0; +} + +dd.callable, dd.constant, dd.property { + margin-bottom: 24px; +} + +dd p { + overflow-x: hidden; + text-overflow: ellipsis; + margin-bottom: 0; +} + +/* Enum values do not have their own pages; their full docs are presented on the + * enum class's page. */ +dt.constant + dd p { + margin-bottom: 1em; +} + +/* indents wrapped lines */ +section.summary dt { + margin-left: 24px; + text-indent: -24px; +} + +.dl-horizontal dd { + margin-left: initial; +} + +dl.dl-horizontal dt { + font-style: normal; + text-align: left; + color: #727272; + margin-right: 20px; + width: initial; +} + +dt .name { + font-weight: 500; +} + +dl dt.callable .name { + float: none; + width: auto; +} + +.parameter { + white-space: nowrap; +} + +.type-parameter { + white-space: nowrap; +} + +.multi-line-signature .type-parameter .parameter { + margin-left: 0px; + display: unset; +} + +.parameter-list { + display: table-cell; + margin-left: 10px; + list-style-type: none; +} + +.signature { + color: #727272; +} + +.signature a { + /* 50% mix of default-primary-color and primary-text-color. */ + color: #4674a2; +} + +.optional { + font-style: italic; +} + +.undocumented { + font-style: italic; +} + +.is-const { + font-style: italic; +} + +.deprecated { + text-decoration: line-through; +} + +.category.linked { + font-weight: bold; + opacity: 1; +} + +/* Colors for category based on categoryOrder in dartdoc_options.config. */ +.category.cp-0 { + background-color: #54b7c4 +} + +.category.cp-1 { + background-color: #54c47f +} + +.category.cp-2 { + background-color: #c4c254 +} + +.category.cp-3 { + background-color: #c49f54 +} + +.category.cp-4 { + background-color: #c45465 +} + +.category.cp-5 { + background-color: #c454c4 +} + +.category a { + color: white; +} + +.category { + padding: 2px 4px; + font-size: 12px; + border-radius: 4px; + background-color: #999; + text-transform: uppercase; + color: white; + opacity: .5; +} + +h1 .category { + vertical-align: middle; +} + +.feature { + display: inline-block; + background: white; + border: 1px solid #0175c2; + border-radius: 20px; + color: #0175c2; + + font-size: 12px; + padding: 1px 6px; + margin: 0 8px 0 0; +} + +a.feature:hover { + border-color: #13B9FD; +} + +h1 .feature { + vertical-align: middle; +} + +.source-link { + padding: 18px 4px; + vertical-align: middle; +} + +.source-link .material-icons { + font-size: 18px; +} + +@media (max-width: 768px) { + .source-link { + padding: 7px 2px; + font-size: 10px; + } +} + +#external-links { + float: right; +} + +.btn-group { + position: relative; + display: inline-flex; + vertical-align: middle; +} + +p.firstline { + font-weight: bold; +} + +footer { + color: #fff; + background-color: #111111; + width: 100%; +} + +footer p { + margin: 0; +} + +footer .no-break { + white-space: nowrap; +} + +footer .container, +footer .container-fluid { + padding-left: 0; + padding-right: 0; +} + +footer a, footer a:hover { + color: #fff; +} + +.markdown.desc { + max-width: 700px; +} + +.markdown h1 { + font-size: 24px; + margin-bottom: 8px; +} + +.markdown h2 { + font-size: 20px; + margin-top: 24px; + margin-bottom: 8px; +} + +.markdown h3 { + font-size: 18px; + margin-bottom: 8px; +} + +.markdown h4 { + font-size: 16px; + margin-bottom: 0; +} + +.markdown li p { + margin: 0; +} + +.gt-separated { + list-style: none; + padding: 0; + margin: 0; +} + +.gt-separated li { + display: inline-block; +} + +.gt-separated li:before { + background-image: url("data:image/svg+xml;utf8,"); + background-position: center; + content: "\00a0"; + margin: 0 6px 0 4px; + padding: 0 3px 0 0; +} + +.gt-separated.dark li:before { + background-image: url("data:image/svg+xml;utf8,"); +} + +.gt-separated li:first-child:before { + background-image: none; + content: ""; + margin: 0; + padding: 0; +} + +/* The slug line under a declaration for things like "const", "read-only", etc. */ +.features { + font-style: italic; + color: #727272; +} + +.multi-line-signature { + font-size: 17px; + color: #727272; +} + +.multi-line-signature .parameter { + margin-left: 24px; + display: block; +} + +.breadcrumbs { + padding: 0; + margin: 8px 0 8px 0; + white-space: nowrap; + line-height: 1; +} + +@media screen and (min-width: 768px) { + nav ol.breadcrumbs { + float: left; + } +} + +@media screen and (max-width: 768px) { + .breadcrumbs { + margin: 0 0 24px 0; + overflow-x: hidden; + } +} + +.self-crumb { + color: #555; +} + +.self-name { + color: #555; + display: none; +} + +.annotation-list { + list-style: none; + padding: 0; + display: inline; +} + +.comma-separated { + list-style: none; + padding: 0; + display: inline; +} + +.comma-separated li { + display: inline; +} + +.comma-separated li:after { + content: ", "; +} + +.comma-separated li:last-child:after { + content: ""; +} + +.end-with-period li:last-child:after { + content: "."; +} + +.container > section:first-child { + border: 0; +} + +.constructor-modifier { + font-style: italic; +} + +section.multi-line-signature div.parameters { + margin-left: 24px; +} + +/* subnav styles */ + +ul.subnav { + overflow: auto; + white-space: nowrap; + padding-left: 0; + min-height: 25px; +} + +ul.subnav::-webkit-scrollbar { + display: none; +} + +ul.subnav li { + display: inline-block; + text-transform: uppercase; +} + +ul.subnav li a { + color: #111; +} + +ul.subnav li { + margin-right: 24px; +} + +ul.subnav li:last-of-type { + margin-right: 0; +} + +@media(max-width: 768px) { + ul.subnav li { + margin-right: 16px; + } +} + +/* sidebar styles */ + +.sidebar ol { + list-style: none; + line-height: 22px; + margin-top: 0; + margin-bottom: 0; + padding: 0 0 15px 0; +} + +.sidebar h5 a, +.sidebar h5 a:hover { + color: #727272; +} + +.sidebar h5, +.sidebar ol li { + text-overflow: ellipsis; + overflow: hidden; + padding: 3px 0 3px 3px; +} + +.sidebar h5 { + color: #727272; + font-size: 18px; + margin: 0 0 22px 0; + padding-top: 0; +} + +.sidebar ol li.section-title { + font-size: 18px; + font-weight: normal; + text-transform: uppercase; + padding-top: 25px; +} + +.sidebar ol li.section-subtitle a { + color: inherit; +} + +.sidebar ol li.section-subtitle { + font-weight: 400; + text-transform: uppercase; +} + +.sidebar ol li.section-subitem { + margin-left: 12px; +} + +.sidebar ol li:first-child { + padding-top: 3px; + margin-top: 0; +} + +button { + padding: 0; +} + +#sidenav-left-toggle { + display: none; + vertical-align: text-bottom; + padding: 0; +} + +/* left-nav disappears, and can transition in from the left */ +@media screen and (max-width:768px) { + #sidenav-left-toggle { + display: inline; + background: no-repeat url("data:image/svg+xml;utf8,"); + background-position: center; + width: 24px; + height: 24px; + border: none; + margin-right: 24px; + } + + #overlay-under-drawer.active { + opacity: 0.4; + height: 100%; + z-index: 1999; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: black; + display: block; + } + + .sidebar-offcanvas-left { + left: -100%; + position: fixed; + -webkit-transition:all .25s ease-out; + -o-transition:all .25s ease-out; + transition:all .25s ease-out; + z-index: 2000; + top: 0; + width: 280px; /* works all the way down to an iphone 4 */ + height: 90%; + background-color: white; + overflow-y: scroll; /* TODO: how to hide scroll bars? */ + padding: 10px; + margin: 10px 10px; + box-shadow: 5px 5px 5px 5px #444444; + visibility: hidden; /* shown by Javascript after scroll position restore */ + } + + ol#sidebar-nav { + font-size: 18px; + white-space: pre-line; + } + + .sidebar-offcanvas-left.active { + left: 0; /* this animates our drawer into the page */ + } + + .self-name { + display: inline-block; + } +} + +.sidebar-offcanvas-left h5 { + margin-bottom: 10px; +} + +.sidebar-offcanvas-left h5:last-of-type { + border: 0; + margin-bottom: 25px; +} + +/* the right nav disappears out of view when the window shrinks */ +@media screen and (max-width: 992px) { + .sidebar-offcanvas-right { + display: none; + } +} + +#overlay-under-drawer { + display: none; +} + +/* find-as-you-type search box */ + +/* override bootstrap defaults */ +.form-control { + border-radius: 0; + border: 0; +} + +@media screen and (max-width: 768px) { + form.search { + display: none; + } +} + +.typeahead, +.tt-query, +.tt-hint { + width: 200px; + height: 20px; + padding: 2px 7px 1px 7px; + line-height: 20px; + outline: none; +} + +.typeahead { + background-color: #fff; + border-radius: 2px; +} + +.tt-wrapper { + position: relative; + display: inline-block; +} + +.tt-input { + position: relative; + vertical-align: top; + background-color: transparent; +} + +.tt-query { + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.tt-hint { + position: absolute; + top: 0; + left: 0; + box-shadow: none; + background: none 0 0 / auto repeat scroll padding-box border-box rgb(255, 255, 255); + border-color: transparent; + color: #999; + border-width: 0; +} + +.navbar-right .tt-menu { + right:0; + left: inherit !important; + width: 422px; + max-height: 250px; + overflow-y: scroll; +} + +.tt-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 100; + font-size: 14px; + margin: 0; + padding: 8px 0; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2); + -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2); + box-shadow: 0 5px 10px rgba(0,0,0,.2); +} + +.tt-suggestion { + padding: 3px 20px; + color: #212121; +} + +.tt-suggestion:hover { + cursor: pointer; + color: #fff; + background-color: #0097cf; +} + +.tt-suggestion:hover .search-from-lib { + color: #ddd; +} + +.tt-suggestion.tt-cursor { + color: #fff; + background-color: #0097cf; +} + +.tt-suggestion.tt-cursor .search-from-lib { + color: #ddd; +} + +.tt-suggestion p { + margin: 0; +} + +.search-from-lib { + font-style: italic; + color: gray; +} + +.search-body { + border: 1px solid #7f7f7f; + max-width: 400px; + box-shadow: 3px 3px 5px rgba(0,0,0,0.1); +} + +section#setter { + border-top: 1px solid #ddd; + padding-top: 36px; +} + +li.inherited a { + opacity: 0.65; + font-style: italic; +} + +#instance-methods dt.inherited .name, +#instance-properties dt.inherited .name, +#operators dt.inherited .name { + font-weight: 300; + font-style: italic; +} + +#instance-methods dt.inherited .signature, +#instance-properties dt.inherited .signature, +#operators dt.inherited .signature { + font-weight: 300; +} + +@media print { + .subnav, .sidebar { + display:none; + } + + a[href]:after { + content:"" !important; + } +} diff --git a/docs/widgets/ActivityTile-class.html b/docs/widgets/ActivityTile-class.html new file mode 100644 index 000000000..481152c7e --- /dev/null +++ b/docs/widgets/ActivityTile-class.html @@ -0,0 +1,453 @@ + + + + + + + + ActivityTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ActivityTile
            + +
            + +
            + + + + +
            +
            + +

            ActivityTile class + Null safety + +

            + + +
            +

            A widget that represents an Activity.

            +

            If the activity needs to show more details (ie, Activity.type is in +detailedActivities), tapping on the tile will open a pop-up with +more details.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + ActivityTile(Activity activity) +
            +
            + Creates an ActivityTile widget. +
            const
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + activity + Activity + +
            +
            + The activity being represented by this tile. +
            final
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + createElement() + StatelessElement + + + +
            +
            + Creates a StatelessElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + + +
            +

            Constants

            + +
            +
            + detailedActivities + → const Set<ActivityType> + + +
            +
            + Types of activities that will show more details when tapped. + + +
            + {ActivityType.grade, ActivityType.misc} +
            +
            + +
            +
            + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ActivityTile/ActivityTile.html b/docs/widgets/ActivityTile/ActivityTile.html new file mode 100644 index 000000000..f13a4a93e --- /dev/null +++ b/docs/widgets/ActivityTile/ActivityTile.html @@ -0,0 +1,149 @@ + + + + + + + + ActivityTile constructor - ActivityTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ActivityTile
            + +
            + +
            + + + + +
            +
            + +

            ActivityTile constructor + Null safety +

            + +
            const + ActivityTile(
            1. Activity activity
            2. +
            ) +
            + + +
            +

            Creates an ActivityTile widget.

            +
            + + + +
            +

            Implementation

            +
            const ActivityTile(this.activity);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ActivityTile/activity.html b/docs/widgets/ActivityTile/activity.html new file mode 100644 index 000000000..719ec9129 --- /dev/null +++ b/docs/widgets/ActivityTile/activity.html @@ -0,0 +1,151 @@ + + + + + + + + activity property - ActivityTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            activity
            + +
            + +
            + + + + +
            +
            + +

            activity property + Null safety +

            + +
            + Activity + activity +
            final
            + +
            + +
            +

            The activity being represented by this tile.

            +
            + + +
            +

            Implementation

            +
            final Activity activity;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ActivityTile/build.html b/docs/widgets/ActivityTile/build.html new file mode 100644 index 000000000..e4f75a617 --- /dev/null +++ b/docs/widgets/ActivityTile/build.html @@ -0,0 +1,217 @@ + + + + + + + + build method - ActivityTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

            +

            The implementation of this method must only depend on:

            + +

            If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

            +

            See also:

            +
              +
            • StatelessWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override
            +Widget build(BuildContext context) => SizedBox(
            +	height: 65,
            +	child: Center(
            +		child: ListTile(
            +			title: Text(
            +				activity.type == ActivityType.grade
            +					? "Activity by grade"
            +					: "Activity"
            +			),
            +			subtitle: Text(
            +				detailedActivities.contains(activity.type)
            +					? "Tap to see details"
            +					: activity.toString(),
            +			),
            +			onTap: () => showDialog(
            +				context: context,
            +				builder: (_) => AlertDialog(
            +					title: const Text("Activity"),
            +					content: SingleChildScrollView(
            +						child: Text(activity.message),
            +					)
            +				)
            +			)
            +		)
            +	)
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ActivityTile/detailedActivities-constant.html b/docs/widgets/ActivityTile/detailedActivities-constant.html new file mode 100644 index 000000000..52fc419f7 --- /dev/null +++ b/docs/widgets/ActivityTile/detailedActivities-constant.html @@ -0,0 +1,154 @@ + + + + + + + + detailedActivities constant - ActivityTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            detailedActivities
            + +
            + +
            + + + + +
            +
            + +

            detailedActivities constant + Null safety +

            + +
            + Set<ActivityType> + const detailedActivities + + +
            + +
            +

            Types of activities that will show more details when tapped.

            +
            + + +
            +

            Implementation

            +
            static const Set<ActivityType> detailedActivities = {
            +	ActivityType.grade,
            +	ActivityType.misc,
            +};
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChanger-class.html b/docs/widgets/BrightnessChanger-class.html new file mode 100644 index 000000000..cb45b921e --- /dev/null +++ b/docs/widgets/BrightnessChanger-class.html @@ -0,0 +1,443 @@ + + + + + + + + BrightnessChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            BrightnessChanger
            + +
            + +
            + + + + +
            +
            + +

            BrightnessChanger class + Null safety + +

            + + +
            +

            A widget to toggle the app between light mode and dark mode.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + BrightnessChanger({required BrightnessChangerForm form}) +
            +
            + Creates a widget to toggle the app brightness. +
            const
            +
            +
            + BrightnessChanger.dropdown() +
            +
            + Creates a BrightnessChanger as a drop-down menu. +
            factory
            +
            +
            + BrightnessChanger.iconButton() +
            +
            + Creates a BrightnessChanger as a toggle button. +
            factory
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + form + BrightnessChangerForm + +
            +
            + The form this widget should take. +
            final
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + createElement() + StatefulElement + + + +
            +
            + Creates a StatefulElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + createState() + BrightnessChangerState + + + +
            +
            + Creates the mutable state for this widget at a given location in the tree. [...] +
            override
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChanger/BrightnessChanger.dropdown.html b/docs/widgets/BrightnessChanger/BrightnessChanger.dropdown.html new file mode 100644 index 000000000..63f94012d --- /dev/null +++ b/docs/widgets/BrightnessChanger/BrightnessChanger.dropdown.html @@ -0,0 +1,149 @@ + + + + + + + + BrightnessChanger.dropdown constructor - BrightnessChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            BrightnessChanger.dropdown
            + +
            + +
            + + + + +
            +
            + +

            BrightnessChanger.dropdown constructor + Null safety +

            + +
            + BrightnessChanger.dropdown() +
            + + +
            +

            Creates a BrightnessChanger as a drop-down menu.

            +
            + + + +
            +

            Implementation

            +
            factory BrightnessChanger.dropdown() =>
            +	const BrightnessChanger(form: BrightnessChangerForm.dropdown);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChanger/BrightnessChanger.html b/docs/widgets/BrightnessChanger/BrightnessChanger.html new file mode 100644 index 000000000..211d5d30e --- /dev/null +++ b/docs/widgets/BrightnessChanger/BrightnessChanger.html @@ -0,0 +1,149 @@ + + + + + + + + BrightnessChanger constructor - BrightnessChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            BrightnessChanger
            + +
            + +
            + + + + +
            +
            + +

            BrightnessChanger constructor + Null safety +

            + +
            const + BrightnessChanger(
            1. {required BrightnessChangerForm form}
            2. +
            ) +
            + + +
            +

            Creates a widget to toggle the app brightness.

            +
            + + + +
            +

            Implementation

            +
            const BrightnessChanger({required this.form});
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChanger/BrightnessChanger.iconButton.html b/docs/widgets/BrightnessChanger/BrightnessChanger.iconButton.html new file mode 100644 index 000000000..d07c94aae --- /dev/null +++ b/docs/widgets/BrightnessChanger/BrightnessChanger.iconButton.html @@ -0,0 +1,149 @@ + + + + + + + + BrightnessChanger.iconButton constructor - BrightnessChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            BrightnessChanger.iconButton
            + +
            + +
            + + + + +
            +
            + +

            BrightnessChanger.iconButton constructor + Null safety +

            + +
            + BrightnessChanger.iconButton() +
            + + +
            +

            Creates a BrightnessChanger as a toggle button.

            +
            + + + +
            +

            Implementation

            +
            factory BrightnessChanger.iconButton() =>
            +	const BrightnessChanger(form: BrightnessChangerForm.button);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChanger/createState.html b/docs/widgets/BrightnessChanger/createState.html new file mode 100644 index 000000000..e12c12dc1 --- /dev/null +++ b/docs/widgets/BrightnessChanger/createState.html @@ -0,0 +1,171 @@ + + + + + + + + createState method - BrightnessChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            createState
            + +
            + +
            + + + + +
            +
            + +

            createState method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +BrightnessChangerState +createState() + +
            override
            + +
            + +
            +

            Creates the mutable state for this widget at a given location in the tree.

            +

            Subclasses should override this method to return a newly created +instance of their associated State subclass:

            +
            @override
            +_MyState createState() => _MyState();
            +
            +

            The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

            +
            + + + +
            +

            Implementation

            +
            @override
            +BrightnessChangerState createState() => BrightnessChangerState();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChanger/form.html b/docs/widgets/BrightnessChanger/form.html new file mode 100644 index 000000000..48f0cda23 --- /dev/null +++ b/docs/widgets/BrightnessChanger/form.html @@ -0,0 +1,151 @@ + + + + + + + + form property - BrightnessChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            form
            + +
            + +
            + + + + +
            +
            + +

            form property + Null safety +

            + +
            + BrightnessChangerForm + form +
            final
            + +
            + +
            +

            The form this widget should take.

            +
            + + +
            +

            Implementation

            +
            final BrightnessChangerForm form;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerForm-class.html b/docs/widgets/BrightnessChangerForm-class.html new file mode 100644 index 000000000..c7a7fe7d5 --- /dev/null +++ b/docs/widgets/BrightnessChangerForm-class.html @@ -0,0 +1,321 @@ + + + + + + + + BrightnessChangerForm enum - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            BrightnessChangerForm
            + +
            + +
            + + + + +
            +
            + +

            BrightnessChangerForm enum + Null safety + +

            + + +
            +

            The form the BrightnessChanger widget should take.

            +
            + + + +
            +

            Constants

            + +
            +
            + button + → const BrightnessChangerForm + + +
            +
            +

            The widget should appear as a toggle button.

            + + +
            + const BrightnessChangerForm(0) +
            +
            + + +
            +

            The widget should appear as a drop-down menu.

            + + +
            + const BrightnessChangerForm(1) +
            +
            + +
            + values + → const List<BrightnessChangerForm> + + +
            +
            +

            A constant List of the values in this enum, in order of their declaration.

            + + +
            + const List<BrightnessChangerForm> +
            +
            + +
            +
            + + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + index + → int + +
            +
            +

            The integer index of this enum.

            +
            final
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] + + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerForm/hashCode.html b/docs/widgets/BrightnessChangerForm/hashCode.html new file mode 100644 index 000000000..f0ca90ab2 --- /dev/null +++ b/docs/widgets/BrightnessChangerForm/hashCode.html @@ -0,0 +1,169 @@ + + + + + + + + hashCode property - BrightnessChangerForm extension - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerForm/noSuchMethod.html b/docs/widgets/BrightnessChangerForm/noSuchMethod.html new file mode 100644 index 000000000..7e341ac2f --- /dev/null +++ b/docs/widgets/BrightnessChangerForm/noSuchMethod.html @@ -0,0 +1,177 @@ + + + + + + + + noSuchMethod method - BrightnessChangerForm extension - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerForm/operator_equals.html b/docs/widgets/BrightnessChangerForm/operator_equals.html new file mode 100644 index 000000000..097b3fd28 --- /dev/null +++ b/docs/widgets/BrightnessChangerForm/operator_equals.html @@ -0,0 +1,168 @@ + + + + + + + + operator == method - BrightnessChangerForm extension - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerForm/runtimeType.html b/docs/widgets/BrightnessChangerForm/runtimeType.html new file mode 100644 index 000000000..3109aee5c --- /dev/null +++ b/docs/widgets/BrightnessChangerForm/runtimeType.html @@ -0,0 +1,144 @@ + + + + + + + + runtimeType property - BrightnessChangerForm extension - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerForm/toString.html b/docs/widgets/BrightnessChangerForm/toString.html new file mode 100644 index 000000000..171f6f6ba --- /dev/null +++ b/docs/widgets/BrightnessChangerForm/toString.html @@ -0,0 +1,147 @@ + + + + + + + + toString method - BrightnessChangerForm extension - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            + +

            toString method + Null safety +

            + +
            + + +String +toString() + + + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerState-class.html b/docs/widgets/BrightnessChangerState-class.html new file mode 100644 index 000000000..cacc185d1 --- /dev/null +++ b/docs/widgets/BrightnessChangerState-class.html @@ -0,0 +1,516 @@ + + + + + + + + BrightnessChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            BrightnessChangerState
            + +
            + +
            + + + + +
            +
            + +

            BrightnessChangerState class + Null safety + +

            + + + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + BrightnessChangerState() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + context + BuildContext + +
            +
            + The location in the tree where this widget builds. [...] +
            read-only, inherited
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + icon + Icon + +
            +
            + The icon for this widget. +
            read-only
            + +
            + +
            + mounted + → bool + +
            +
            + Whether this State object is currently in a tree. [...] +
            read-only, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            + widget + BrightnessChanger + +
            +
            + The current configuration. [...] +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + buttonToggle(BuildContext context) + → void + + + +
            +
            + Toggles the brightness of the app. [...] + + +
            + +
            + deactivate() + → void + + + +
            +
            + Called when this object is removed from the tree. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + didChangeDependencies() + → void + + + +
            +
            + Called when a dependency of this State object changes. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + didUpdateWidget(covariant BrightnessChanger oldWidget) + → void + + + +
            +
            + Called whenever the widget configuration changes. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + dispose() + → void + + + +
            +
            + Called when this object is removed from the tree permanently. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + initState() + → void + + + +
            +
            + Called when this object is inserted into the tree. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + reassemble() + → void + + + +
            +
            + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + setBrightness(BuildContext context, {required bool? value}) + → void + + + +
            +
            + Sets the brightness of the app. [...] + + +
            + +
            + setState(VoidCallback fn) + → void + + + +
            +
            + Notify the framework that the internal state of this object has changed. [...] +
            @protected, inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerState/BrightnessChangerState.html b/docs/widgets/BrightnessChangerState/BrightnessChangerState.html new file mode 100644 index 000000000..0664637f8 --- /dev/null +++ b/docs/widgets/BrightnessChangerState/BrightnessChangerState.html @@ -0,0 +1,146 @@ + + + + + + + + BrightnessChangerState constructor - BrightnessChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            BrightnessChangerState
            + +
            + +
            + + + + +
            +
            + +

            BrightnessChangerState constructor + Null safety +

            + +
            + BrightnessChangerState() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerState/build.html b/docs/widgets/BrightnessChangerState/build.html new file mode 100644 index 000000000..1f6317532 --- /dev/null +++ b/docs/widgets/BrightnessChangerState/build.html @@ -0,0 +1,283 @@ + + + + + + + + build method - BrightnessChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method in a number of different situations. For +example:

            + +

            This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

            +

            Design discussion

            +

            Why is the build method on State, and not StatefulWidget?

            +

            Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

            +

            For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

            +

            Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

            +

            Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

            +
            class MyButton extends StatefulWidget {
            +  ...
            +  final Color color;
            +
            +  @override
            +  Widget build(BuildContext context, MyButtonState state) {
            +    ... () { print("color: $color"); } ...
            +  }
            +}
            +
            +

            For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

            +

            In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

            +
            class MyButtonState extends State<MyButton> {
            +  ...
            +  @override
            +  Widget build(BuildContext context) {
            +    ... () { print("color: ${widget.color}"); } ...
            +  }
            +}
            +
            +

            Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

            +

            See also:

            +
              +
            • StatefulWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override
            +Widget build (BuildContext context) {
            +	switch (widget.form) {
            +		case BrightnessChangerForm.button: return IconButton(
            +			icon: icon,
            +			onPressed: () => buttonToggle(context),
            +		);
            +		case BrightnessChangerForm.dropdown: return ListTile(
            +			title: const Text ("Theme"),
            +			leading: icon,
            +			trailing: DropdownButton<bool?>(
            +				onChanged: (bool? value) => setBrightness(context, value: value),
            +				value: _brightness,
            +          // Workaround until https://github.com/flutter/flutter/pull/77666 is released
            +          // DropdownButton with null value don't display the menu item.
            +          // Using a hint works too
            +          hint: const Text("Auto"),
            +				items: const [
            +					DropdownMenuItem<bool?> (
            +						value: null,
            +						child: Text ("Auto")
            +					),
            +					DropdownMenuItem<bool?> (
            +						value: true,
            +						child: Text ("Light")
            +					),
            +					DropdownMenuItem<bool?> (
            +						value: false,
            +						child: Text ("Dark"),
            +					),
            +				],
            +			)
            +		);
            +	}
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerState/buttonToggle.html b/docs/widgets/BrightnessChangerState/buttonToggle.html new file mode 100644 index 000000000..b16a61a9b --- /dev/null +++ b/docs/widgets/BrightnessChangerState/buttonToggle.html @@ -0,0 +1,170 @@ + + + + + + + + buttonToggle method - BrightnessChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            buttonToggle
            + +
            + +
            + + + + +
            +
            + +

            buttonToggle method + Null safety +

            + +
            + + +void +buttonToggle(
            1. BuildContext context
            2. +
            ) + + + +
            + +
            +

            Toggles the brightness of the app.

            +

            When the brightness is light, it will be set to dark. +If the brightness is dark, it will be set to auto. +If the brightness is auto, it will be set to light.

            +
            + + + +
            +

            Implementation

            +
            void buttonToggle(BuildContext context) => setBrightness(
            +	context,
            +	value: caseConverter<bool?>(
            +		value: _brightness,
            +		onTrue: false,
            +		onFalse: null,
            +		onNull: true,
            +	),
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerState/icon.html b/docs/widgets/BrightnessChangerState/icon.html new file mode 100644 index 000000000..fd1ed75e7 --- /dev/null +++ b/docs/widgets/BrightnessChangerState/icon.html @@ -0,0 +1,168 @@ + + + + + + + + icon property - BrightnessChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            icon
            + +
            + +
            + + + + +
            +
            + +

            icon property + Null safety +

            + + + +
            + +
            + Icon + icon + + +
            + + +
            +

            The icon for this widget.

            +
            + + +
            +

            Implementation

            +
            Icon get icon => Icon (
            +	caseConverter<IconData>(
            +		value: _brightness,
            +		onNull: Icons.brightness_auto,
            +		onTrue: Icons.brightness_high,
            +		onFalse: Icons.brightness_low,
            +	)
            +);
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/BrightnessChangerState/setBrightness.html b/docs/widgets/BrightnessChangerState/setBrightness.html new file mode 100644 index 000000000..f52ada27b --- /dev/null +++ b/docs/widgets/BrightnessChangerState/setBrightness.html @@ -0,0 +1,170 @@ + + + + + + + + setBrightness method - BrightnessChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            setBrightness
            + +
            + +
            + + + + +
            +
            + +

            setBrightness method + Null safety +

            + +
            + + +void +setBrightness(
            1. BuildContext context,
            2. +
            3. {required bool? value}
            4. +
            ) + + + +
            + +
            +

            Sets the brightness of the app.

            +

            Also saves it to Preferences.

            +
            + + + +
            +

            Implementation

            +
            void setBrightness (BuildContext context, {required bool? value}) {
            +	ThemeChanger.of(context).brightness = caseConverter<Brightness> (
            +		value: value,
            +		onTrue: Brightness.light,
            +		onFalse: Brightness.dark,
            +		onNull: MediaQuery.of(context).platformBrightness,
            +	);
            +	Services.instance.prefs.brightness = value;
            +	setState(() => _brightness = value);
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/CalendarTile-class.html b/docs/widgets/CalendarTile-class.html new file mode 100644 index 000000000..431d86dba --- /dev/null +++ b/docs/widgets/CalendarTile-class.html @@ -0,0 +1,464 @@ + + + + + + + + CalendarTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            CalendarTile
            + +
            + +
            + + + + +
            +
            + +

            CalendarTile class + Null safety + +

            + + +
            +

            A cell in a calendar that represents a Day.

            +

            This widget is to be used in the admin view of the calendar. Tapping it +will allow the admin to change the day in the database.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + CalendarTile({required Day? day, required DateTime? date}) +
            +
            + Creates a widget to update a day in the calendar +
            const
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + date + → DateTime? + +
            +
            + +
            final
            + +
            + +
            + day + Day? + +
            +
            + The Day represented by this tile. +
            final
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + createElement() + StatelessElement + + + +
            +
            + Creates a StatelessElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + + +
            +

            Constants

            + +
            +
            + blank + → const CalendarTile + + +
            +
            + A blank calendar tile. [...] + + +
            + CalendarTile(day: null, date: null) +
            +
            + +
            +
            + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/CalendarTile/CalendarTile.html b/docs/widgets/CalendarTile/CalendarTile.html new file mode 100644 index 000000000..a1ff8ffad --- /dev/null +++ b/docs/widgets/CalendarTile/CalendarTile.html @@ -0,0 +1,151 @@ + + + + + + + + CalendarTile constructor - CalendarTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            CalendarTile
            + +
            + +
            + + + + +
            +
            + +

            CalendarTile constructor + Null safety +

            + +
            const + CalendarTile(
            1. {required Day? day,
            2. +
            3. required DateTime? date}
            4. +
            ) +
            + + +
            +

            Creates a widget to update a day in the calendar

            +
            + + + +
            +

            Implementation

            +
            const CalendarTile({required this.day, required this.date});
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/CalendarTile/blank-constant.html b/docs/widgets/CalendarTile/blank-constant.html new file mode 100644 index 000000000..73fdd1ef9 --- /dev/null +++ b/docs/widgets/CalendarTile/blank-constant.html @@ -0,0 +1,153 @@ + + + + + + + + blank constant - CalendarTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            blank
            + +
            + +
            + + + + +
            +
            + +

            blank constant + Null safety +

            + +
            + CalendarTile + const blank + + +
            + +
            +

            A blank calendar tile.

            +

            This should not be wrapped in a GestureDetector.

            +
            + + +
            +

            Implementation

            +
            static const CalendarTile blank = CalendarTile(day: null, date: null);
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/CalendarTile/build.html b/docs/widgets/CalendarTile/build.html new file mode 100644 index 000000000..455b73deb --- /dev/null +++ b/docs/widgets/CalendarTile/build.html @@ -0,0 +1,216 @@ + + + + + + + + build method - CalendarTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

            +

            The implementation of this method must only depend on:

            + +

            If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

            +

            See also:

            +
              +
            • StatelessWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override
            +Widget build(BuildContext context) => Container(
            +	decoration: BoxDecoration(border: Border.all()),
            +	child: date == null ? Container() : LayoutBuilder(
            +		builder: (BuildContext context, BoxConstraints constraints) {
            +			final double textSize = constraints.biggest.width > 120 ? 1.5 : 1;
            +			return Column(
            +				children: [
            +					Align (
            +						alignment: Alignment.topLeft,
            +						child: Text (date!.day.toString(), textScaleFactor: 1),
            +					),
            +					const Spacer(),
            +					if (day == null)
            +						Expanded(child: Text("No school", textScaleFactor: textSize))
            +					else ...[
            +						Expanded(child: Text (day!.name, textScaleFactor: textSize)),
            +						Expanded(child: Text (day!.schedule.name, textScaleFactor: 0.8)),
            +					],
            +					const Spacer(),
            +				]
            +			);
            +		}
            +	)
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/CalendarTile/date.html b/docs/widgets/CalendarTile/date.html new file mode 100644 index 000000000..9577be25b --- /dev/null +++ b/docs/widgets/CalendarTile/date.html @@ -0,0 +1,149 @@ + + + + + + + + date property - CalendarTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            date
            + +
            + +
            + + + + +
            +
            + +

            date property + Null safety +

            + +
            + DateTime? + date +
            final
            + +
            + + + +
            +

            Implementation

            +
            final DateTime? date;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/CalendarTile/day.html b/docs/widgets/CalendarTile/day.html new file mode 100644 index 000000000..f16829b05 --- /dev/null +++ b/docs/widgets/CalendarTile/day.html @@ -0,0 +1,152 @@ + + + + + + + + day property - CalendarTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            day
            + +
            + +
            + + + + +
            +
            + +

            day property + Null safety +

            + +
            + Day? + day +
            final
            + +
            + +
            +

            The Day represented by this tile.

            +
            + + +
            +

            Implementation

            +
            final Day? day;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassList-class.html b/docs/widgets/ClassList-class.html new file mode 100644 index 000000000..b41a8cb89 --- /dev/null +++ b/docs/widgets/ClassList-class.html @@ -0,0 +1,466 @@ + + + + + + + + ClassList class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ClassList
            + +
            + +
            + + + + +
            +
            + +

            ClassList class + Null safety + +

            + + +
            +

            A list of all the classes for a given day.

            +

            The list is composed of ClassPanels, one for each period in the day.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + ClassList({required Day day, required Iterable<Period> periods, String? headerText}) +
            +
            + Creates a list of ClassPanel widgets to represent periods in a day. +
            const
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + day + Day + +
            +
            + The day whose periods should be represented. +
            final
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + headerText + → String? + +
            +
            + The header for this list. May be null. +
            final
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + periods + → Iterable<Period> + +
            +
            + A list of periods for today. [...] +
            final
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + createElement() + StatelessElement + + + +
            +
            + Creates a StatelessElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + getPanel(Period period) + Widget + + + +
            +
            + Creates a ClassPanel for a given period. + + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassList/ClassList.html b/docs/widgets/ClassList/ClassList.html new file mode 100644 index 000000000..3ecec93d3 --- /dev/null +++ b/docs/widgets/ClassList/ClassList.html @@ -0,0 +1,156 @@ + + + + + + + + ClassList constructor - ClassList class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ClassList
            + +
            + +
            + + + + +
            +
            + +

            ClassList constructor + Null safety +

            + +
            const + ClassList(
            1. {required Day day,
            2. +
            3. required Iterable<Period> periods,
            4. +
            5. String? headerText}
            6. +
            ) +
            + + +
            +

            Creates a list of ClassPanel widgets to represent periods in a day.

            +
            + + + +
            +

            Implementation

            +
            const ClassList ({
            +	required this.day,
            +	required this.periods,
            +	this.headerText,
            +});
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassList/build.html b/docs/widgets/ClassList/build.html new file mode 100644 index 000000000..c950cb3c9 --- /dev/null +++ b/docs/widgets/ClassList/build.html @@ -0,0 +1,216 @@ + + + + + + + + build method - ClassList class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

            +

            The implementation of this method must only depend on:

            + +

            If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

            +

            See also:

            +
              +
            • StatelessWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override
            +Widget build(BuildContext context) => ModelListener<Reminders>(
            +	model: () => Models.instance.reminders,
            +	dispose: false,
            +	// ignore: sort_child_properties_last
            +	child: DrawerHeader (
            +		child: Center (
            +			child: Text (
            +				headerText ?? "",
            +				textScaleFactor: 2,
            +				textAlign: TextAlign.center,
            +			)
            +		)
            +	),
            +	builder: (_, __, Widget? header) => ListView(
            +		shrinkWrap: true,
            +		children: [
            +			if (headerText != null) header!,  // child is supplied
            +			...[
            +				for (final Period period in periods)
            +					getPanel(period)
            +			],
            +		]
            +	)
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassList/day.html b/docs/widgets/ClassList/day.html new file mode 100644 index 000000000..7ffef3d4e --- /dev/null +++ b/docs/widgets/ClassList/day.html @@ -0,0 +1,152 @@ + + + + + + + + day property - ClassList class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            day
            + +
            + +
            + + + + +
            +
            + +

            day property + Null safety +

            + +
            + Day + day +
            final
            + +
            + +
            +

            The day whose periods should be represented.

            +
            + + +
            +

            Implementation

            +
            final Day day;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassList/getPanel.html b/docs/widgets/ClassList/getPanel.html new file mode 100644 index 000000000..631f16d6d --- /dev/null +++ b/docs/widgets/ClassList/getPanel.html @@ -0,0 +1,175 @@ + + + + + + + + getPanel method - ClassList class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            getPanel
            + +
            + +
            + + + + +
            +
            + +

            getPanel method + Null safety +

            + +
            + + +Widget +getPanel(
            1. Period period
            2. +
            ) + + + +
            + +
            +

            Creates a ClassPanel for a given period.

            +
            + + + +
            +

            Implementation

            +
            Widget getPanel(Period period) {
            +	final Subject? subject = Models.instance.schedule.subjects[period.id];
            +	return ClassPanel (
            +		children: [
            +			for (final String description in period.getInfo(subject))
            +				if (!description.startsWith("Period:"))
            +					description,
            +			if (period.id != null)
            +				"ID: ${period.id}",
            +		],
            +		title: int.tryParse(period.name) == null
            +			? period.getName(subject)
            +			: "${period.name}: ${period.getName(subject)}",
            +		reminders: Models.instance.reminders.getReminders(
            +			period: period.name,
            +			dayName: day.name,
            +			subject: subject?.name,
            +		),
            +		activity: period.activity,
            +	);
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassList/headerText.html b/docs/widgets/ClassList/headerText.html new file mode 100644 index 000000000..ea21052a8 --- /dev/null +++ b/docs/widgets/ClassList/headerText.html @@ -0,0 +1,152 @@ + + + + + + + + headerText property - ClassList class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            headerText
            + +
            + +
            + + + + +
            +
            + +

            headerText property + Null safety +

            + +
            + String? + headerText +
            final
            + +
            + +
            +

            The header for this list. May be null.

            +
            + + +
            +

            Implementation

            +
            final String? headerText;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassList/periods.html b/docs/widgets/ClassList/periods.html new file mode 100644 index 000000000..8fd790f03 --- /dev/null +++ b/docs/widgets/ClassList/periods.html @@ -0,0 +1,153 @@ + + + + + + + + periods property - ClassList class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            periods
            + +
            + +
            + + + + +
            +
            + +

            periods property + Null safety +

            + +
            + Iterable<Period> + periods +
            final
            + +
            + +
            +

            A list of periods for today.

            +

            Comes from using day with User.getPeriods.

            +
            + + +
            +

            Implementation

            +
            final Iterable<Period> periods;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassPanel-class.html b/docs/widgets/ClassPanel-class.html new file mode 100644 index 000000000..bb4c17b5e --- /dev/null +++ b/docs/widgets/ClassPanel-class.html @@ -0,0 +1,463 @@ + + + + + + + + ClassPanel class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ClassPanel
            + +
            + +
            + + + + +
            +
            + +

            ClassPanel class + Null safety + +

            + + +
            +

            An ExpansionTile for an individual period in a list.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + ClassPanel({required String title, required List<String> children, required List<int> reminders, Activity? activity}) +
            +
            + Creates a widget to represent a period. +
            const
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + activity + Activity? + +
            +
            + An activity for this period. +
            final
            + +
            + +
            + children + → List<String> + +
            +
            + A list of descriptive strings about the period. [...] +
            final
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + reminders + → List<int> + +
            +
            + A list of reminders for this period. [...] +
            final
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            + title + → String + +
            +
            + The title for this panel. [...] +
            final
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + createElement() + StatelessElement + + + +
            +
            + Creates a StatelessElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassPanel/ClassPanel.html b/docs/widgets/ClassPanel/ClassPanel.html new file mode 100644 index 000000000..529218bb2 --- /dev/null +++ b/docs/widgets/ClassPanel/ClassPanel.html @@ -0,0 +1,158 @@ + + + + + + + + ClassPanel constructor - ClassPanel class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ClassPanel
            + +
            + +
            + + + + +
            +
            + +

            ClassPanel constructor + Null safety +

            + +
            const + ClassPanel(
            1. {required String title,
            2. +
            3. required List<String> children,
            4. +
            5. required List<int> reminders,
            6. +
            7. Activity? activity}
            8. +
            ) +
            + + +
            +

            Creates a widget to represent a period.

            +
            + + + +
            +

            Implementation

            +
            const ClassPanel ({
            +	required this.title,
            +	required this.children,
            +	required this.reminders,
            +	this.activity,
            +});
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassPanel/activity.html b/docs/widgets/ClassPanel/activity.html new file mode 100644 index 000000000..2e2670441 --- /dev/null +++ b/docs/widgets/ClassPanel/activity.html @@ -0,0 +1,152 @@ + + + + + + + + activity property - ClassPanel class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            activity
            + +
            + +
            + + + + +
            +
            + +

            activity property + Null safety +

            + +
            + Activity? + activity +
            final
            + +
            + +
            +

            An activity for this period.

            +
            + + +
            +

            Implementation

            +
            final Activity? activity;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassPanel/build.html b/docs/widgets/ClassPanel/build.html new file mode 100644 index 000000000..4a7d368ee --- /dev/null +++ b/docs/widgets/ClassPanel/build.html @@ -0,0 +1,234 @@ + + + + + + + + build method - ClassPanel class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

            +

            The implementation of this method must only depend on:

            + +

            If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

            +

            See also:

            +
              +
            • StatelessWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override
            +Widget build (BuildContext context) => ExpansionTile (
            +	title: SizedBox (
            +		height: 50,
            +		child: Center (
            +			child: ListTile (
            +				title: Text (title),
            +				contentPadding: EdgeInsets.zero,
            +				trailing: reminders.isEmpty ? null : const Icon(Icons.note),
            +				leading: activity == null ? null : const Icon(Icons.announcement),
            +			)
            +		)
            +	),
            +	children: [
            +		Padding (
            +			padding: const EdgeInsets.only(left: 30),
            +			child: Align (
            +				alignment: Alignment.centerLeft,
            +				child: Column (
            +					crossAxisAlignment: CrossAxisAlignment.start,
            +					children: [
            +						for (final String label in children)
            +							Padding (
            +								padding: const EdgeInsets.symmetric(vertical: 5),
            +								child: LinkText(
            +									label,
            +									shouldTrimParams: true,
            +									linkStyle: const TextStyle(color: Color(0xff0000EE))
            +								)
            +							),
            +						if (activity != null)
            +							ActivityTile(activity!),  // already checked for null
            +						for (final int index in reminders)
            +							ReminderTile (
            +								index: index,
            +								height: 60,
            +							)
            +					]
            +				)
            +			)
            +		)
            +	]
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassPanel/children.html b/docs/widgets/ClassPanel/children.html new file mode 100644 index 000000000..3eb1c23e5 --- /dev/null +++ b/docs/widgets/ClassPanel/children.html @@ -0,0 +1,154 @@ + + + + + + + + children property - ClassPanel class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            children
            + +
            + +
            + + + + +
            +
            + +

            children property + Null safety +

            + +
            + List<String> + children +
            final
            + +
            + +
            +

            A list of descriptive strings about the period.

            +

            Can include the time, room, or teacher of the period. Really any property +of Period is good.

            +
            + + +
            +

            Implementation

            +
            final List<String> children;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassPanel/reminders.html b/docs/widgets/ClassPanel/reminders.html new file mode 100644 index 000000000..10f1e1707 --- /dev/null +++ b/docs/widgets/ClassPanel/reminders.html @@ -0,0 +1,154 @@ + + + + + + + + reminders property - ClassPanel class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            reminders
            + +
            + +
            + + + + +
            +
            + +

            reminders property + Null safety +

            + +
            + List<int> + reminders +
            final
            + +
            + +
            +

            A list of reminders for this period.

            +

            This list holds the indices of the reminders for this period in +Reminders.reminders.

            +
            + + +
            +

            Implementation

            +
            final List<int> reminders;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ClassPanel/title.html b/docs/widgets/ClassPanel/title.html new file mode 100644 index 000000000..0ecc6018b --- /dev/null +++ b/docs/widgets/ClassPanel/title.html @@ -0,0 +1,153 @@ + + + + + + + + title property - ClassPanel class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            title
            + +
            + +
            + + + + +
            +
            + +

            title property + Null safety +

            + +
            + String + title +
            final
            + +
            + +
            +

            The title for this panel.

            +

            It should be the name of the period (usually a number).

            +
            + + +
            +

            Implementation

            +
            final String title;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Footer-class.html b/docs/widgets/Footer-class.html new file mode 100644 index 000000000..0d1011c6d --- /dev/null +++ b/docs/widgets/Footer-class.html @@ -0,0 +1,441 @@ + + + + + + + + Footer class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Footer
            + +
            + +
            + + + + +
            +
            + +

            Footer class + Null safety + +

            + + +
            +

            A footer to display all around the app.

            +

            The footer displays the next period, and alerts the user if there is a +reminder or activity.

            +

            The footer should be displayed on every page where the current schedule is +not being shown.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            + +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + createElement() + StatelessElement + + + +
            +
            + Creates a StatelessElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + + +
            +

            Constants

            + +
            +
            + textScale + → const double + + +
            +
            + A scale factor for the footer text. + + +
            + 1.25 +
            +
            + +
            +
            + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Footer/Footer.html b/docs/widgets/Footer/Footer.html new file mode 100644 index 000000000..19dc75fc2 --- /dev/null +++ b/docs/widgets/Footer/Footer.html @@ -0,0 +1,140 @@ + + + + + + + + Footer constructor - Footer class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Footer
            + +
            + +
            + + + + +
            +
            + +

            Footer constructor + Null safety +

            + +
            + Footer() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Footer/build.html b/docs/widgets/Footer/build.html new file mode 100644 index 000000000..7c97cd62e --- /dev/null +++ b/docs/widgets/Footer/build.html @@ -0,0 +1,243 @@ + + + + + + + + build method - Footer class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

            +

            The implementation of this method must only depend on:

            + +

            If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

            +

            See also:

            +
              +
            • StatelessWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override
            +Widget build (BuildContext context) => ModelListener<ScheduleModel>(
            +	model: () => Models.instance.schedule,
            +	dispose: false,
            +	// ignore: sort_child_properties_last
            +	child: Container(height: 0, width: 0),
            +	builder: (_, ScheduleModel schedule, Widget? blank) =>
            +		schedule.nextPeriod == null ? blank! : BottomSheet (
            +			enableDrag: false,
            +			onClosing: () {},
            +			builder: (BuildContext context) => GestureDetector(
            +				onTap: !Models.instance.reminders.hasNextReminder ? null :
            +					() {
            +						final NavigatorState nav = Navigator.of(context);
            +						if (nav.canPop()) {
            +							nav.pop();
            +						}
            +						nav.pushReplacementNamed(Routes.home);
            +					},
            +				child: SizedBox (
            +					height: 70,
            +					child: Align (
            +						child: Column (
            +							mainAxisAlignment: MainAxisAlignment.center,
            +							children: [
            +								Text (
            +									// ternary already checked for schedule.nextPeriod == null
            +									"Next: ${schedule.nextPeriod!.getName(schedule.nextSubject)}",
            +									textScaleFactor: textScale
            +								),
            +								Text (
            +									// ternary already checked for schedule.nextPeriod == null
            +									(schedule.nextPeriod!
            +										.getInfo(schedule.nextSubject)
            +										..removeWhere(
            +											(String str) => (
            +												str.startsWith("Period: ") ||
            +												str.startsWith("Teacher: ")
            +											)
            +										)
            +									).join (". "),
            +									textScaleFactor: textScale,
            +								),
            +								if (schedule.nextPeriod?.activity != null)
            +									const Text("There is an activity"),
            +								if (Models.instance.reminders.hasNextReminder)
            +									const Text ("Click to see reminder"),
            +							]
            +						)
            +					)
            +				)
            +			)
            +		)
            +	);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Footer/textScale-constant.html b/docs/widgets/Footer/textScale-constant.html new file mode 100644 index 000000000..3ce6666f3 --- /dev/null +++ b/docs/widgets/Footer/textScale-constant.html @@ -0,0 +1,150 @@ + + + + + + + + textScale constant - Footer class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            textScale
            + +
            + +
            + + + + +
            +
            + +

            textScale constant + Null safety +

            + +
            + double + const textScale + + +
            + +
            +

            A scale factor for the footer text.

            +
            + + +
            +

            Implementation

            +
            static const double textScale = 1.25;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo-class.html b/docs/widgets/LayoutInfo-class.html new file mode 100644 index 000000000..5eaa1f7eb --- /dev/null +++ b/docs/widgets/LayoutInfo-class.html @@ -0,0 +1,395 @@ + + + + + + + + LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            LayoutInfo
            + +
            + +
            + + + + +
            +
            + +

            LayoutInfo class + Null safety + +

            + + +
            +

            Provides info about how this scaffold should be laid out.

            +

            Uses getWindowType from Material's adaptive_breakpoints package to +determine which layout should be built and exposes getters such as +hasNavRail to define how the layout should look.

            +
            + + +
            +
            + + + + + +
            Annotations
            +
            +
            +
            + +
            +

            Constructors

            + +
            +
            + LayoutInfo(BuildContext context) +
            +
            + Stores info about the layout based on Material Design breakpoints. +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hasBottomNavBar + → bool + +
            +
            + Whether the app should use a BottomNavigationBar. +
            read-only
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + hasNavRail + → bool + +
            +
            + Whether the app should use a NavigationRail. +
            read-only
            + +
            + +
            + hasStandardDrawer + → bool + +
            +
            + Whether the app should have a persistent Drawer. +
            read-only
            + +
            + +
            + hasStandardSideSheet + → bool + +
            +
            + Whether the app should have a persistent Scaffold.endDrawer. +
            read-only
            + +
            + +
            + isDesktop + → bool + +
            +
            + Whether the app is running on a desktop. +
            read-only
            + +
            + +
            + isMobile + → bool + +
            +
            + Whether the app is running on a phone. +
            read-only
            + +
            + +
            + isTabletLandscape + → bool + +
            +
            + Whether the app is running on a tablet in landscape mode. +
            read-only
            + +
            + +
            + isTabletPortrait + → bool + +
            +
            + Whether the app is running on a tablet in portrait mode (or a large phone). +
            read-only
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            + windowType + AdaptiveWindowType + +
            +
            + The breakpoint as defined by material.io +
            final
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/LayoutInfo.html b/docs/widgets/LayoutInfo/LayoutInfo.html new file mode 100644 index 000000000..49734d1de --- /dev/null +++ b/docs/widgets/LayoutInfo/LayoutInfo.html @@ -0,0 +1,147 @@ + + + + + + + + LayoutInfo constructor - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            LayoutInfo
            + +
            + +
            + + + + +
            +
            + +

            LayoutInfo constructor + Null safety +

            + +
            + LayoutInfo(
            1. BuildContext context
            2. +
            ) +
            + + +
            +

            Stores info about the layout based on Material Design breakpoints.

            +
            + + + +
            +

            Implementation

            +
            LayoutInfo(BuildContext context) :
            +	windowType = getWindowType(context);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/hasBottomNavBar.html b/docs/widgets/LayoutInfo/hasBottomNavBar.html new file mode 100644 index 000000000..53b9302eb --- /dev/null +++ b/docs/widgets/LayoutInfo/hasBottomNavBar.html @@ -0,0 +1,153 @@ + + + + + + + + hasBottomNavBar property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hasBottomNavBar
            + +
            + +
            + + + + +
            +
            + +

            hasBottomNavBar property + Null safety +

            + + + +
            + +
            + bool + hasBottomNavBar + + +
            + + +
            +

            Whether the app should use a BottomNavigationBar.

            +
            + + +
            +

            Implementation

            +
            bool get hasBottomNavBar => isMobile;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/hasNavRail.html b/docs/widgets/LayoutInfo/hasNavRail.html new file mode 100644 index 000000000..f436d7d17 --- /dev/null +++ b/docs/widgets/LayoutInfo/hasNavRail.html @@ -0,0 +1,153 @@ + + + + + + + + hasNavRail property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hasNavRail
            + +
            + +
            + + + + +
            +
            + +

            hasNavRail property + Null safety +

            + + + +
            + +
            + bool + hasNavRail + + +
            + + +
            +

            Whether the app should use a NavigationRail.

            +
            + + +
            +

            Implementation

            +
            bool get hasNavRail => isTabletPortrait || isTabletLandscape;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/hasStandardDrawer.html b/docs/widgets/LayoutInfo/hasStandardDrawer.html new file mode 100644 index 000000000..9dd8c5889 --- /dev/null +++ b/docs/widgets/LayoutInfo/hasStandardDrawer.html @@ -0,0 +1,153 @@ + + + + + + + + hasStandardDrawer property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hasStandardDrawer
            + +
            + +
            + + + + +
            +
            + +

            hasStandardDrawer property + Null safety +

            + + + +
            + +
            + bool + hasStandardDrawer + + +
            + + +
            +

            Whether the app should have a persistent Drawer.

            +
            + + +
            +

            Implementation

            +
            bool get hasStandardDrawer => isDesktop;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/hasStandardSideSheet.html b/docs/widgets/LayoutInfo/hasStandardSideSheet.html new file mode 100644 index 000000000..a4f0a6c10 --- /dev/null +++ b/docs/widgets/LayoutInfo/hasStandardSideSheet.html @@ -0,0 +1,153 @@ + + + + + + + + hasStandardSideSheet property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hasStandardSideSheet
            + +
            + +
            + + + + +
            +
            + +

            hasStandardSideSheet property + Null safety +

            + + + +
            + +
            + bool + hasStandardSideSheet + + +
            + + +
            +

            Whether the app should have a persistent Scaffold.endDrawer.

            +
            + + +
            +

            Implementation

            +
            bool get hasStandardSideSheet => isTabletLandscape || isDesktop;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/hashCode.html b/docs/widgets/LayoutInfo/hashCode.html new file mode 100644 index 000000000..7ea84590c --- /dev/null +++ b/docs/widgets/LayoutInfo/hashCode.html @@ -0,0 +1,177 @@ + + + + + + + + hashCode property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/isDesktop.html b/docs/widgets/LayoutInfo/isDesktop.html new file mode 100644 index 000000000..e26da5627 --- /dev/null +++ b/docs/widgets/LayoutInfo/isDesktop.html @@ -0,0 +1,154 @@ + + + + + + + + isDesktop property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isDesktop
            + +
            + +
            + + + + +
            +
            + +

            isDesktop property + Null safety +

            + + + +
            + +
            + bool + isDesktop + + +
            + + +
            +

            Whether the app is running on a desktop.

            +
            + + +
            +

            Implementation

            +
            bool get isDesktop => windowType == AdaptiveWindowType.large
            +	|| windowType == AdaptiveWindowType.xlarge;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/isMobile.html b/docs/widgets/LayoutInfo/isMobile.html new file mode 100644 index 000000000..267270bca --- /dev/null +++ b/docs/widgets/LayoutInfo/isMobile.html @@ -0,0 +1,153 @@ + + + + + + + + isMobile property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isMobile
            + +
            + +
            + + + + +
            +
            + +

            isMobile property + Null safety +

            + + + +
            + +
            + bool + isMobile + + +
            + + +
            +

            Whether the app is running on a phone.

            +
            + + +
            +

            Implementation

            +
            bool get isMobile => windowType == AdaptiveWindowType.xsmall;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/isTabletLandscape.html b/docs/widgets/LayoutInfo/isTabletLandscape.html new file mode 100644 index 000000000..216a4190d --- /dev/null +++ b/docs/widgets/LayoutInfo/isTabletLandscape.html @@ -0,0 +1,153 @@ + + + + + + + + isTabletLandscape property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isTabletLandscape
            + +
            + +
            + + + + +
            +
            + +

            isTabletLandscape property + Null safety +

            + + + +
            + +
            + bool + isTabletLandscape + + +
            + + +
            +

            Whether the app is running on a tablet in landscape mode.

            +
            + + +
            +

            Implementation

            +
            bool get isTabletLandscape => windowType == AdaptiveWindowType.medium;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/isTabletPortrait.html b/docs/widgets/LayoutInfo/isTabletPortrait.html new file mode 100644 index 000000000..652887ebd --- /dev/null +++ b/docs/widgets/LayoutInfo/isTabletPortrait.html @@ -0,0 +1,153 @@ + + + + + + + + isTabletPortrait property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            isTabletPortrait
            + +
            + +
            + + + + +
            +
            + +

            isTabletPortrait property + Null safety +

            + + + +
            + +
            + bool + isTabletPortrait + + +
            + + +
            +

            Whether the app is running on a tablet in portrait mode (or a large phone).

            +
            + + +
            +

            Implementation

            +
            bool get isTabletPortrait => windowType == AdaptiveWindowType.small;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/noSuchMethod.html b/docs/widgets/LayoutInfo/noSuchMethod.html new file mode 100644 index 000000000..6cf1efbe6 --- /dev/null +++ b/docs/widgets/LayoutInfo/noSuchMethod.html @@ -0,0 +1,185 @@ + + + + + + + + noSuchMethod method - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/operator_equals.html b/docs/widgets/LayoutInfo/operator_equals.html new file mode 100644 index 000000000..2d279f309 --- /dev/null +++ b/docs/widgets/LayoutInfo/operator_equals.html @@ -0,0 +1,176 @@ + + + + + + + + operator == method - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/runtimeType.html b/docs/widgets/LayoutInfo/runtimeType.html new file mode 100644 index 000000000..e6a14e096 --- /dev/null +++ b/docs/widgets/LayoutInfo/runtimeType.html @@ -0,0 +1,152 @@ + + + + + + + + runtimeType property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/toString.html b/docs/widgets/LayoutInfo/toString.html new file mode 100644 index 000000000..0900915eb --- /dev/null +++ b/docs/widgets/LayoutInfo/toString.html @@ -0,0 +1,158 @@ + + + + + + + + toString method - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            +

            toString method + Null safety +

            + +
            + + +String +toString() + +
            inherited
            + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + +
            +

            Implementation

            +
            external String toString();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LayoutInfo/windowType.html b/docs/widgets/LayoutInfo/windowType.html new file mode 100644 index 000000000..950aa606c --- /dev/null +++ b/docs/widgets/LayoutInfo/windowType.html @@ -0,0 +1,148 @@ + + + + + + + + windowType property - LayoutInfo class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            windowType
            + +
            + +
            + + + + +
            +
            + +

            windowType property + Null safety +

            + +
            + AdaptiveWindowType + windowType +
            final
            + +
            + +
            +

            The breakpoint as defined by material.io

            +
            + + +
            +

            Implementation

            +
            final AdaptiveWindowType windowType;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LinkIcon-class.html b/docs/widgets/LinkIcon-class.html new file mode 100644 index 000000000..c294e3a05 --- /dev/null +++ b/docs/widgets/LinkIcon-class.html @@ -0,0 +1,439 @@ + + + + + + + + LinkIcon class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            LinkIcon
            + +
            + +
            + + + + +
            +
            + +

            LinkIcon class + Null safety + +

            + + +
            +

            An icon that opens a link when tapped.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + LinkIcon({required String path, required String url}) +
            +
            + Creates an icon that opens a web page. +
            const
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + path + → String + +
            +
            + The image to show as the icon. +
            final
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            + url + → String + +
            +
            + The URL to open when tapped. +
            final
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + createElement() + StatelessElement + + + +
            +
            + Creates a StatelessElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LinkIcon/LinkIcon.html b/docs/widgets/LinkIcon/LinkIcon.html new file mode 100644 index 000000000..05c3f1e00 --- /dev/null +++ b/docs/widgets/LinkIcon/LinkIcon.html @@ -0,0 +1,149 @@ + + + + + + + + LinkIcon constructor - LinkIcon class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            LinkIcon
            + +
            + +
            + + + + +
            +
            + +

            LinkIcon constructor + Null safety +

            + +
            const + LinkIcon(
            1. {required String path,
            2. +
            3. required String url}
            4. +
            ) +
            + + +
            +

            Creates an icon that opens a web page.

            +
            + + + +
            +

            Implementation

            +
            const LinkIcon ({required this.path, required this.url});
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LinkIcon/build.html b/docs/widgets/LinkIcon/build.html new file mode 100644 index 000000000..51447c8ac --- /dev/null +++ b/docs/widgets/LinkIcon/build.html @@ -0,0 +1,194 @@ + + + + + + + + build method - LinkIcon class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

            +

            The implementation of this method must only depend on:

            + +

            If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

            +

            See also:

            +
              +
            • StatelessWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override Widget build(BuildContext context) => IconButton (
            +	iconSize: 45,
            +	onPressed: () => launch (url),
            +	icon: CircleAvatar(backgroundImage: AssetImage(path)),
            +);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LinkIcon/path.html b/docs/widgets/LinkIcon/path.html new file mode 100644 index 000000000..ca5956900 --- /dev/null +++ b/docs/widgets/LinkIcon/path.html @@ -0,0 +1,150 @@ + + + + + + + + path property - LinkIcon class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            path
            + +
            + +
            + + + + +
            +
            + +

            path property + Null safety +

            + +
            + String + path +
            final
            + +
            + +
            +

            The image to show as the icon.

            +
            + + +
            +

            Implementation

            +
            final String path;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LinkIcon/url.html b/docs/widgets/LinkIcon/url.html new file mode 100644 index 000000000..dae8122e6 --- /dev/null +++ b/docs/widgets/LinkIcon/url.html @@ -0,0 +1,150 @@ + + + + + + + + url property - LinkIcon class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            url
            + +
            + +
            + + + + +
            +
            + +

            url property + Null safety +

            + +
            + String + url +
            final
            + +
            + +
            +

            The URL to open when tapped.

            +
            + + +
            +

            Implementation

            +
            final String url;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImage-class.html b/docs/widgets/LoadingImage-class.html new file mode 100644 index 000000000..a077e9dbf --- /dev/null +++ b/docs/widgets/LoadingImage-class.html @@ -0,0 +1,461 @@ + + + + + + + + LoadingImage class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            LoadingImage
            + +
            + +
            + + + + +
            +
            + +

            LoadingImage class + Null safety + +

            + + +
            +

            An image that displays a CircularProgressIndicator while loading.

            +

            This widget helps keep the same shape as the image so that when the image +finishes loading the other widgets won't move around. This is accomplished +by providing the aspect ratio of the image. To get the aspect ratio, if +it's not already known, there is a two-step process:

            +

            Setup:

            +
              +
            1. Install devtools: flutter packages pub global activate devtools
            2. +
            3. Start devtools: flutter packages pub global run devtools
            4. +
            5. Start app: flutter run --track-widget-creation
            6. +
            7. Open the URL devtools gives with the URL from flutter
            8. +
            +

            Usage:

            +
              +
            1. Replace Image.asset with LoadingImage(String path)
            2. +
            3. In devTools: +
                +
              1. Go to the corresponding LoadingImage widget
              2. +
              3. Expand Image.semantics.renderObject.size
              4. +
              +
            4. +
            5. Enter the aspect ratio as parameters to LoadingImage() constructor
            6. +
            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + LoadingImage({required ImageProvider<Object> image, required double? aspectRatio}) +
            +
            + Creates an image with a placeholder while it loads. +
            const
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + aspectRatio + → double? + +
            +
            + The aspect ratio of the image. [...] +
            final
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + image + ImageProvider<Object> + +
            +
            + The image being loaded. +
            final
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + createElement() + StatefulElement + + + +
            +
            + Creates a StatefulElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + createState() + LoadingImageState + + + +
            +
            + Creates the mutable state for this widget at a given location in the tree. [...] +
            override
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImage/LoadingImage.html b/docs/widgets/LoadingImage/LoadingImage.html new file mode 100644 index 000000000..4ea728279 --- /dev/null +++ b/docs/widgets/LoadingImage/LoadingImage.html @@ -0,0 +1,152 @@ + + + + + + + + LoadingImage constructor - LoadingImage class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            LoadingImage
            + +
            + +
            + + + + +
            +
            + +

            LoadingImage constructor + Null safety +

            + +
            const + LoadingImage(
            1. {required ImageProvider<Object> image,
            2. +
            3. required double? aspectRatio}
            4. +
            ) +
            + + +
            +

            Creates an image with a placeholder while it loads.

            +
            + + + +
            +

            Implementation

            +
            const LoadingImage({
            +	required this.image,
            +	required this.aspectRatio
            +});
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImage/aspectRatio.html b/docs/widgets/LoadingImage/aspectRatio.html new file mode 100644 index 000000000..baacf284a --- /dev/null +++ b/docs/widgets/LoadingImage/aspectRatio.html @@ -0,0 +1,152 @@ + + + + + + + + aspectRatio property - LoadingImage class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            aspectRatio
            + +
            + +
            + + + + +
            +
            + +

            aspectRatio property + Null safety +

            + +
            + double? + aspectRatio +
            final
            + +
            + +
            +

            The aspect ratio of the image.

            +

            This is used to size the CircularProgressIndicator so that it is +roughly the same size as the image will be when it loads.

            +
            + + +
            +

            Implementation

            +
            final double? aspectRatio;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImage/createState.html b/docs/widgets/LoadingImage/createState.html new file mode 100644 index 000000000..aa80a5696 --- /dev/null +++ b/docs/widgets/LoadingImage/createState.html @@ -0,0 +1,170 @@ + + + + + + + + createState method - LoadingImage class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            createState
            + +
            + +
            + + + + +
            +
            + +

            createState method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +LoadingImageState +createState() + +
            override
            + +
            + +
            +

            Creates the mutable state for this widget at a given location in the tree.

            +

            Subclasses should override this method to return a newly created +instance of their associated State subclass:

            +
            @override
            +_MyState createState() => _MyState();
            +
            +

            The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

            +
            + + + +
            +

            Implementation

            +
            @override
            +LoadingImageState createState() => LoadingImageState();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImage/image.html b/docs/widgets/LoadingImage/image.html new file mode 100644 index 000000000..13b1cefc5 --- /dev/null +++ b/docs/widgets/LoadingImage/image.html @@ -0,0 +1,150 @@ + + + + + + + + image property - LoadingImage class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            image
            + +
            + +
            + + + + +
            +
            + +

            image property + Null safety +

            + +
            + ImageProvider<Object> + image +
            final
            + +
            + +
            +

            The image being loaded.

            +
            + + +
            +

            Implementation

            +
            final ImageProvider image;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImageState-class.html b/docs/widgets/LoadingImageState-class.html new file mode 100644 index 000000000..c65f01416 --- /dev/null +++ b/docs/widgets/LoadingImageState-class.html @@ -0,0 +1,543 @@ + + + + + + + + LoadingImageState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            LoadingImageState
            + +
            + +
            + + + + +
            +
            + +

            LoadingImageState class + Null safety + +

            + + +
            +

            A state for a LoadingImage.

            +

            This state handles loading the image in the background and switching +out the placeholder animation with the actual image when it loads.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + LoadingImageState() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + aspectRatio + ↔ double + +
            +
            + The aspect ratio of the image. +
            read / write
            + +
            + +
            + context + BuildContext + +
            +
            + The location in the tree where this widget builds. [...] +
            read-only, inherited
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + listener + ImageStreamListener + +
            +
            + A listener that will notify when the image has loaded. +
            read / write
            + +
            + +
            + loading + ↔ bool + +
            +
            + Whether the image is still loading. +
            read / write
            + +
            + +
            + mounted + → bool + +
            +
            + Whether this State object is currently in a tree. [...] +
            read-only, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            + stream + ImageStream + +
            +
            + The stream of bytes in the image. +
            read / write
            + +
            + +
            + widget + LoadingImage + +
            +
            + The current configuration. [...] +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + build(BuildContext context) + Widget + + + +
            +
            + Describes the part of the user interface represented by this widget. [...] +
            override
            + +
            + +
            + deactivate() + → void + + + +
            +
            + Called when this object is removed from the tree. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + didChangeDependencies() + → void + + + +
            +
            + Called when a dependency of this State object changes. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + didUpdateWidget(covariant LoadingImage oldWidget) + → void + + + +
            +
            + Called whenever the widget configuration changes. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + dispose() + → void + + + +
            +
            + Called when this object is removed from the tree permanently. [...] +
            override
            + +
            + +
            + initState() + → void + + + +
            +
            + Called when this object is inserted into the tree. [...] +
            override
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + onLoad(ImageInfo info, bool _) + → void + + + +
            +
            + Rebuilds the widget tree to include the image. [...] + + +
            + +
            + reassemble() + → void + + + +
            +
            + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
            @mustCallSuper, @protected, inherited
            + +
            + +
            + setState(VoidCallback fn) + → void + + + +
            +
            + Notify the framework that the internal state of this object has changed. [...] +
            @protected, inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImageState/LoadingImageState.html b/docs/widgets/LoadingImageState/LoadingImageState.html new file mode 100644 index 000000000..c1cfc2bd6 --- /dev/null +++ b/docs/widgets/LoadingImageState/LoadingImageState.html @@ -0,0 +1,148 @@ + + + + + + + + LoadingImageState constructor - LoadingImageState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            LoadingImageState
            + +
            + +
            + + + + +
            +
            + +

            LoadingImageState constructor + Null safety +

            + +
            + LoadingImageState() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImageState/aspectRatio.html b/docs/widgets/LoadingImageState/aspectRatio.html new file mode 100644 index 000000000..fbee2c9c6 --- /dev/null +++ b/docs/widgets/LoadingImageState/aspectRatio.html @@ -0,0 +1,158 @@ + + + + + + + + aspectRatio property - LoadingImageState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            aspectRatio
            + +
            + +
            + + + + +
            +
            + +

            aspectRatio property + Null safety +

            + +
            + double + aspectRatio +
            read / write
            + +
            + +
            +

            The aspect ratio of the image.

            +
            + + +
            +

            Implementation

            +
            late double aspectRatio;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImageState/build.html b/docs/widgets/LoadingImageState/build.html new file mode 100644 index 000000000..1b74fe1d0 --- /dev/null +++ b/docs/widgets/LoadingImageState/build.html @@ -0,0 +1,259 @@ + + + + + + + + build method - LoadingImageState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            build
            + +
            + +
            + + + + +
            +
            + +

            build method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +Widget +build(
            1. BuildContext context
            2. +
            ) + +
            override
            + +
            + +
            +

            Describes the part of the user interface represented by this widget.

            +

            The framework calls this method in a number of different situations. For +example:

            + +

            This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

            +

            The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

            +

            Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

            +

            The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

            +

            Design discussion

            +

            Why is the build method on State, and not StatefulWidget?

            +

            Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

            +

            For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

            +

            Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

            +

            Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

            +
            class MyButton extends StatefulWidget {
            +  ...
            +  final Color color;
            +
            +  @override
            +  Widget build(BuildContext context, MyButtonState state) {
            +    ... () { print("color: $color"); } ...
            +  }
            +}
            +
            +

            For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

            +

            In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

            +
            class MyButtonState extends State<MyButton> {
            +  ...
            +  @override
            +  Widget build(BuildContext context) {
            +    ... () { print("color: ${widget.color}"); } ...
            +  }
            +}
            +
            +

            Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

            +

            See also:

            +
              +
            • StatefulWidget, which contains the discussion on performance considerations.
            • +
            +
            + + + +
            +

            Implementation

            +
            @override Widget build(BuildContext context) => loading
            +	? AspectRatio (
            +		aspectRatio: widget.aspectRatio ?? 1,
            +		child: const Center (child: CircularProgressIndicator()),
            +	)
            +	: AspectRatio (
            +		aspectRatio: aspectRatio,
            +		child: Image (image: widget.image)
            +	);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImageState/dispose.html b/docs/widgets/LoadingImageState/dispose.html new file mode 100644 index 000000000..71b4c1f75 --- /dev/null +++ b/docs/widgets/LoadingImageState/dispose.html @@ -0,0 +1,193 @@ + + + + + + + + dispose method - LoadingImageState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            dispose
            + +
            + +
            + + + + +
            +
            + +

            dispose method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +void +dispose() + +
            override
            + +
            + +
            +

            Called when this object is removed from the tree permanently.

            +

            The framework calls this method when this State object will never +build again. After the framework calls dispose, the State object is +considered unmounted and the mounted property is false. It is an error +to call setState at this point. This stage of the lifecycle is terminal: +there is no way to remount a State object that has been disposed.

            +

            Subclasses should override this method to release any resources retained +by this object (e.g., stop any active animations).

            +

            If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

            +
              +
            • In initState, subscribe to the object.
            • +
            • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
            • +
            • In dispose, unsubscribe from the object.
            • +
            +

            If you override this, make sure to end your method with a call to +super.dispose().

            +

            See also:

            + +
            + + + +
            +

            Implementation

            +
            @override void dispose () {
            +	stream.removeListener(listener);
            +	super.dispose();
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImageState/initState.html b/docs/widgets/LoadingImageState/initState.html new file mode 100644 index 000000000..679288520 --- /dev/null +++ b/docs/widgets/LoadingImageState/initState.html @@ -0,0 +1,193 @@ + + + + + + + + initState method - LoadingImageState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            initState
            + +
            + +
            + + + + +
            +
            + +

            initState method + Null safety +

            + +
            + +
            +
              +
            1. @override
            2. +
            +
            + +void +initState() + +
            override
            + +
            + +
            +

            Called when this object is inserted into the tree.

            +

            The framework will call this method exactly once for each State object +it creates.

            +

            Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

            +

            If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

            +
              +
            • In initState, subscribe to the object.
            • +
            • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
            • +
            • In dispose, unsubscribe from the object.
            • +
            +

            You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

            +

            If you override this, make sure your method starts with a call to +super.initState().

            +
            + + + +
            +

            Implementation

            +
            @override void initState() {
            +	super.initState();
            +	stream = widget.image.resolve(const ImageConfiguration());
            +	listener = ImageStreamListener(onLoad);
            +	stream.addListener(listener);
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImageState/listener.html b/docs/widgets/LoadingImageState/listener.html new file mode 100644 index 000000000..fa7ffa2c0 --- /dev/null +++ b/docs/widgets/LoadingImageState/listener.html @@ -0,0 +1,158 @@ + + + + + + + + listener property - LoadingImageState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            listener
            + +
            + +
            + + + + +
            +
            + +

            listener property + Null safety +

            + +
            + ImageStreamListener + listener +
            read / write
            + +
            + +
            +

            A listener that will notify when the image has loaded.

            +
            + + +
            +

            Implementation

            +
            late ImageStreamListener listener;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImageState/loading.html b/docs/widgets/LoadingImageState/loading.html new file mode 100644 index 000000000..d875fa395 --- /dev/null +++ b/docs/widgets/LoadingImageState/loading.html @@ -0,0 +1,158 @@ + + + + + + + + loading property - LoadingImageState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            loading
            + +
            + +
            + + + + +
            +
            + +

            loading property + Null safety +

            + +
            + bool + loading +
            read / write
            + +
            + +
            +

            Whether the image is still loading.

            +
            + + +
            +

            Implementation

            +
            bool loading = true;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImageState/onLoad.html b/docs/widgets/LoadingImageState/onLoad.html new file mode 100644 index 000000000..cd3d3e23a --- /dev/null +++ b/docs/widgets/LoadingImageState/onLoad.html @@ -0,0 +1,175 @@ + + + + + + + + onLoad method - LoadingImageState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            onLoad
            + +
            + +
            + + + + +
            +
            + +

            onLoad method + Null safety +

            + +
            + + +void +onLoad(
            1. ImageInfo info,
            2. +
            3. bool _
            4. +
            ) + + + +
            + +
            +

            Rebuilds the widget tree to include the image.

            +

            Also prints out the aspect ratio as a convenience to the developer.

            +
            + + + +
            +

            Implementation

            +
            // this is a Flutter function override
            +// BUG: Check if this actually works.
            +// ignore: avoid_positional_boolean_parameters
            +void onLoad (ImageInfo info, bool _) {
            +	aspectRatio = Size (
            +		info.image.width.toDouble(),
            +		info.image.height.toDouble()
            +	).aspectRatio;
            +	if (widget.aspectRatio == null) {
            +		debugPrint("LoadingImage: Aspect ratio for ${widget.image} is $aspectRatio");
            +	}
            +	setState(() => loading = false);
            +}
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/LoadingImageState/stream.html b/docs/widgets/LoadingImageState/stream.html new file mode 100644 index 000000000..f1fe4c0fc --- /dev/null +++ b/docs/widgets/LoadingImageState/stream.html @@ -0,0 +1,158 @@ + + + + + + + + stream property - LoadingImageState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            stream
            + +
            + +
            + + + + +
            +
            + +

            stream property + Null safety +

            + +
            + ImageStream + stream +
            read / write
            + +
            + +
            +

            The stream of bytes in the image.

            +
            + + +
            +

            Implementation

            +
            late ImageStream stream;
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos-class.html b/docs/widgets/Logos-class.html new file mode 100644 index 000000000..4af9e9a00 --- /dev/null +++ b/docs/widgets/Logos-class.html @@ -0,0 +1,376 @@ + + + + + + + + Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Logos
            + +
            + +
            + + + + +
            +
            + +

            Logos class + Null safety + +

            + + +
            +

            Brand logos used throughout the app.

            +

            Ram Life does not claim ownership of any brand +(except for the Ramaz logo).

            +
            + + + +
            +

            Constructors

            + +
            +
            + Logos() +
            +
            + +
            +
            +
            + +
            +

            Properties

            + +
            +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            read-only, inherited
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toString() + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            inherited
            + +
            + +
            +
            + + + +
            +

            Constants

            + +
            +
            + drive + → const Widget + + +
            +
            + The Google Drive logo. + + +
            + LinkIcon(path: "images/logos/drive.png", url: Urls.googleDrive) +
            +
            + +
            + google + → const Widget + + +
            +
            + The Google logo. + + +
            + CircleAvatar(backgroundColor: Colors.transparent, backgroundImage: AssetImage("images/logos/google_sign_in.png")) +
            +
            + +
            + outlook + → const Widget + + +
            +
            + The Microsoft Outlook logo. + + +
            + LinkIcon(path: "images/logos/outlook.jpg", url: Urls.email) +
            +
            + +
            + ramazIcon + → const Widget + + +
            +
            + The Ramaz website logo. + + +
            + LinkIcon(path: "images/logos/ramaz/teal.jpg", url: Urls.ramaz) +
            +
            + +
            + schoology + → const Widget + + +
            +
            + The Schoology logo. + + +
            + LinkIcon(path: "images/logos/schoology.png", url: Urls.schoology) +
            +
            + +
            + seniorSystems + → const LinkIcon + + +
            +
            + The Senior Systems (My Backpack) logo. + + +
            + LinkIcon(path: "images/logos/senior_systems.png", url: Urls.seniorSystems) +
            +
            + +
            +
            + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/Logos.html b/docs/widgets/Logos/Logos.html new file mode 100644 index 000000000..53ebd1e22 --- /dev/null +++ b/docs/widgets/Logos/Logos.html @@ -0,0 +1,136 @@ + + + + + + + + Logos constructor - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            Logos
            + +
            + +
            + + + + +
            +
            + +

            Logos constructor + Null safety +

            + +
            + Logos() +
            + + + + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/drive-constant.html b/docs/widgets/Logos/drive-constant.html new file mode 100644 index 000000000..327fd4daa --- /dev/null +++ b/docs/widgets/Logos/drive-constant.html @@ -0,0 +1,149 @@ + + + + + + + + drive constant - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            drive
            + +
            + +
            + + + + +
            +
            + +

            drive constant + Null safety +

            + +
            + Widget + const drive + + +
            + +
            +

            The Google Drive logo.

            +
            + + +
            +

            Implementation

            +
            static const Widget drive = LinkIcon (
            +	path: "images/logos/drive.png",
            +	url: Urls.googleDrive
            +);
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/google-constant.html b/docs/widgets/Logos/google-constant.html new file mode 100644 index 000000000..2e39a8113 --- /dev/null +++ b/docs/widgets/Logos/google-constant.html @@ -0,0 +1,151 @@ + + + + + + + + google constant - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            google
            + +
            + +
            + + + + +
            +
            + +

            google constant + Null safety +

            + +
            + Widget + const google + + +
            + +
            +

            The Google logo.

            +
            + + +
            +

            Implementation

            +
            static const Widget google = CircleAvatar (
            +	backgroundColor: Colors.transparent,
            +	backgroundImage: AssetImage(
            +		"images/logos/google_sign_in.png",
            +	),
            +);
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/hashCode.html b/docs/widgets/Logos/hashCode.html new file mode 100644 index 000000000..04af1ee43 --- /dev/null +++ b/docs/widgets/Logos/hashCode.html @@ -0,0 +1,175 @@ + + + + + + + + hashCode property - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            hashCode
            + +
            + +
            + + + + +
            +
            +

            hashCode property + Null safety +

            + + + +
            + +
            + int + hashCode +
            inherited
            + +
            + + +
            +

            The hash code for this object.

            +

            A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

            +

            All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

            +

            If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

            +

            Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

            +

            Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

            +

            If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

            +
            + + +
            +

            Implementation

            +
            external int get hashCode;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/noSuchMethod.html b/docs/widgets/Logos/noSuchMethod.html new file mode 100644 index 000000000..772544640 --- /dev/null +++ b/docs/widgets/Logos/noSuchMethod.html @@ -0,0 +1,183 @@ + + + + + + + + noSuchMethod method - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            noSuchMethod
            + +
            + +
            + + + + +
            +
            +

            noSuchMethod method + Null safety +

            + +
            + + +dynamic +noSuchMethod(
            1. Invocation invocation
            2. +
            ) + +
            inherited
            + +
            + +
            +

            Invoked when a non-existent method or property is accessed.

            +

            A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

            +
            dynamic object = 1;
            +object.add(42); // Statically allowed, run-time error
            +
            +

            This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

            +

            Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

            +

            A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

            +
            class MockList<T> implements List<T> {
            +  noSuchMethod(Invocation invocation) {
            +    log(invocation);
            +    super.noSuchMethod(invocation); // Will throw.
            +  }
            +}
            +void main() {
            +  MockList().add(42);
            +}
            +
            +

            This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

            +

            If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

            +

            The default behavior is to throw a NoSuchMethodError.

            +
            + + + +
            +

            Implementation

            +
            @pragma("vm:entry-point")
            +external dynamic noSuchMethod(Invocation invocation);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/operator_equals.html b/docs/widgets/Logos/operator_equals.html new file mode 100644 index 000000000..f2cc6720c --- /dev/null +++ b/docs/widgets/Logos/operator_equals.html @@ -0,0 +1,174 @@ + + + + + + + + operator == method - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            operator ==
            + +
            + +
            + + + + +
            +
            +

            operator == method + Null safety +

            + +
            + + +bool +operator ==(
            1. Object other
            2. +
            ) + +
            inherited
            + +
            + +
            +

            The equality operator.

            +

            The default behavior for all Objects is to return true if and +only if this object and other are the same object.

            +

            Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

            +
              +
            • +

              Total: It must return a boolean for all arguments. It should never throw.

              +
            • +
            • +

              Reflexive: For all objects o, o == o must be true.

              +
            • +
            • +

              Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

              +
            • +
            • +

              Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

              +
            • +
            +

            The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

            +

            If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

            +
            + + + +
            +

            Implementation

            +
            external bool operator ==(Object other);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/outlook-constant.html b/docs/widgets/Logos/outlook-constant.html new file mode 100644 index 000000000..97cbf0673 --- /dev/null +++ b/docs/widgets/Logos/outlook-constant.html @@ -0,0 +1,149 @@ + + + + + + + + outlook constant - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            outlook
            + +
            + +
            + + + + +
            +
            + +

            outlook constant + Null safety +

            + +
            + Widget + const outlook + + +
            + +
            +

            The Microsoft Outlook logo.

            +
            + + +
            +

            Implementation

            +
            static const Widget outlook = LinkIcon (
            +	path: "images/logos/outlook.jpg",
            +	url: Urls.email
            +);
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/ramazIcon-constant.html b/docs/widgets/Logos/ramazIcon-constant.html new file mode 100644 index 000000000..3d676dc14 --- /dev/null +++ b/docs/widgets/Logos/ramazIcon-constant.html @@ -0,0 +1,149 @@ + + + + + + + + ramazIcon constant - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ramazIcon
            + +
            + +
            + + + + +
            +
            + +

            ramazIcon constant + Null safety +

            + +
            + Widget + const ramazIcon + + +
            + +
            +

            The Ramaz website logo.

            +
            + + +
            +

            Implementation

            +
            static const Widget ramazIcon = LinkIcon (
            +	path: "images/logos/ramaz/teal.jpg",
            +	url: Urls.ramaz
            +);
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/runtimeType.html b/docs/widgets/Logos/runtimeType.html new file mode 100644 index 000000000..1dd95d1d3 --- /dev/null +++ b/docs/widgets/Logos/runtimeType.html @@ -0,0 +1,150 @@ + + + + + + + + runtimeType property - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            runtimeType
            + +
            + +
            + + + + +
            +
            +

            runtimeType property + Null safety +

            + + + +
            + +
            + Type + runtimeType +
            inherited
            + +
            + + +
            +

            A representation of the runtime type of the object.

            +
            + + +
            +

            Implementation

            +
            external Type get runtimeType;
            +
            + +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/schoology-constant.html b/docs/widgets/Logos/schoology-constant.html new file mode 100644 index 000000000..f5982a041 --- /dev/null +++ b/docs/widgets/Logos/schoology-constant.html @@ -0,0 +1,149 @@ + + + + + + + + schoology constant - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            schoology
            + +
            + +
            + + + + +
            +
            + +

            schoology constant + Null safety +

            + +
            + Widget + const schoology + + +
            + +
            +

            The Schoology logo.

            +
            + + +
            +

            Implementation

            +
            static const Widget schoology = LinkIcon (
            +	path: "images/logos/schoology.png",
            +	url: Urls.schoology
            +);
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/seniorSystems-constant.html b/docs/widgets/Logos/seniorSystems-constant.html new file mode 100644 index 000000000..c616a3e9d --- /dev/null +++ b/docs/widgets/Logos/seniorSystems-constant.html @@ -0,0 +1,149 @@ + + + + + + + + seniorSystems constant - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            seniorSystems
            + +
            + +
            + + + + +
            +
            + +

            seniorSystems constant + Null safety +

            + +
            + LinkIcon + const seniorSystems + + +
            + +
            +

            The Senior Systems (My Backpack) logo.

            +
            + + +
            +

            Implementation

            +
            static const seniorSystems = LinkIcon (
            +	path: "images/logos/senior_systems.png",
            +	url: Urls.seniorSystems
            +);
            +
            +
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/Logos/toString.html b/docs/widgets/Logos/toString.html new file mode 100644 index 000000000..bb6191c87 --- /dev/null +++ b/docs/widgets/Logos/toString.html @@ -0,0 +1,156 @@ + + + + + + + + toString method - Logos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            toString
            + +
            + +
            + + + + +
            +
            +

            toString method + Null safety +

            + +
            + + +String +toString() + +
            inherited
            + +
            + +
            +

            A string representation of this object.

            +

            Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

            +

            Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

            +
            + + + +
            +

            Implementation

            +
            external String toString();
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ModelBuilder.html b/docs/widgets/ModelBuilder.html new file mode 100644 index 000000000..bf7952425 --- /dev/null +++ b/docs/widgets/ModelBuilder.html @@ -0,0 +1,170 @@ + + + + + + + + ModelBuilder typedef - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ModelBuilder
            + +
            + +
            + + + + +
            +
            + +

            ModelBuilder<T extends ChangeNotifier> typedef + Null safety + +

            + +
            + + + +Widget +ModelBuilder<T>(
            1. BuildContext context,
            2. +
            3. T model,
            4. +
            5. Widget? child
            6. +
            ) + + +
            + + +
            +

            A function to build a widget with a ChangeNotifier subclass.

            +
            + + +
            +

            Implementation

            +
            typedef ModelBuilder<T extends ChangeNotifier> =
            +  Widget Function(BuildContext context, T model, Widget? child);
            +
            + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ModelListener-class.html b/docs/widgets/ModelListener-class.html new file mode 100644 index 000000000..a2d80d779 --- /dev/null +++ b/docs/widgets/ModelListener-class.html @@ -0,0 +1,464 @@ + + + + + + + + ModelListener class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ModelListener
            + +
            + +
            + + + + +
            +
            + +

            ModelListener<Model extends ChangeNotifier> class + Null safety + +

            + + +
            +

            A widget that listens to a ChangeNotifier and rebuilds the widget tree +when ChangeNotifier.notifyListeners.

            +
            + + +
            +
            +
            Inheritance
            +
            + + + + + +
            +
            + +
            +

            Constructors

            + +
            +
            + ModelListener({required Model model(), required ModelBuilder<Model> builder, Widget? child, bool dispose = true}) +
            +
            + Creates a widget that listens to a ChangeNotifier. +
            const
            +
            +
            +
            + +
            +

            Properties

            + +
            +
            + builder + ModelBuilder<Model> + +
            +
            + The function to build the widget tree underneath this. +
            final
            + +
            + +
            + child + Widget? + +
            +
            + An optional child to cache. [...] +
            final
            + +
            + +
            + dispose + → bool + +
            +
            + Whether or not to dispose the model. [...] +
            final
            + +
            + +
            + hashCode + → int + +
            +
            + The hash code for this object. [...] +
            @nonVirtual, read-only, inherited
            + +
            + +
            + key + Key? + +
            +
            + Controls how one widget replaces another widget in the tree. [...] +
            final, inherited
            + +
            + +
            + model + → Model Function() + +
            +
            + A function to create the model to listen to. [...] +
            final
            + +
            + +
            + runtimeType + → Type + +
            +
            + A representation of the runtime type of the object. +
            read-only, inherited
            + +
            + +
            +
            + +
            +

            Methods

            +
            +
            + createElement() + StatefulElement + + + +
            +
            + Creates a StatefulElement to manage this widget's location in the tree. [...] +
            inherited
            + +
            + +
            + createState() + ModelListenerState<ChangeNotifier> + + + +
            +
            + Creates the mutable state for this widget at a given location in the tree. [...] +
            override
            + +
            + +
            + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
            +
            + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
            @protected, inherited
            + +
            + +
            + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
            +
            + Add additional properties associated with the node. [...] +
            inherited
            + +
            + +
            + noSuchMethod(Invocation invocation) + → dynamic + + + +
            +
            + Invoked when a non-existent method or property is accessed. [...] +
            inherited
            + +
            + +
            + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
            +
            + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
            inherited
            + +
            + +
            + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
            +
            + A string representation of this object. [...] +
            inherited
            + +
            + +
            + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a string representation of this node and its descendants. [...] +
            inherited
            + +
            + +
            + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
            +
            + Returns a one-line detailed description of the object. [...] +
            inherited
            + +
            + +
            + toStringShort() + → String + + + +
            +
            + A short, textual description of this widget. +
            inherited
            + +
            + +
            +
            + +
            +

            Operators

            +
            +
            + operator ==(Object other) + → bool + + + +
            +
            + The equality operator. [...] +
            @nonVirtual, inherited
            + +
            + +
            +
            + + + + +
            + + + +
            + +
            + + ramaz + 2.1.1+1 + + + +
            + + + + + + + + + + + diff --git a/docs/widgets/ModelListener/ModelListener.html b/docs/widgets/ModelListener/ModelListener.html new file mode 100644 index 000000000..7861f0e4a --- /dev/null +++ b/docs/widgets/ModelListener/ModelListener.html @@ -0,0 +1,159 @@ + + + + + + + + ModelListener constructor - ModelListener class - widgets library - Dart API + + + + + + + + + + + + + + + + +
            + +
            + + +
            ModelListener
            + +
            + +
            + + + + +
            +
            + +

            ModelListener<Model extends ChangeNotifier> constructor + Null safety +

            + +
            const + ModelListener<Model extends ChangeNotifier>(
            1. {required Model model(
                +),
              1. +
              2. required ModelBuilder<Model> builder,
              3. +
              4. Widget? child,
              5. +
              6. bool dispose = true}
              7. +
              ) +
              + + +
              +

              Creates a widget that listens to a ChangeNotifier.

              +
              + + + +
              +

              Implementation

              +
              const ModelListener ({
              +  required this.model,
              +  required this.builder,
              +  this.child,
              +  this.dispose = true
              +});
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListener/builder.html b/docs/widgets/ModelListener/builder.html new file mode 100644 index 000000000..da55be59f --- /dev/null +++ b/docs/widgets/ModelListener/builder.html @@ -0,0 +1,152 @@ + + + + + + + + builder property - ModelListener class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              builder
              + +
              + +
              + + + + +
              +
              + +

              builder property + Null safety +

              + +
              + ModelBuilder<Model> + builder +
              final
              + +
              + +
              +

              The function to build the widget tree underneath this.

              +
              + + +
              +

              Implementation

              +
              final ModelBuilder<Model> builder;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListener/child.html b/docs/widgets/ModelListener/child.html new file mode 100644 index 000000000..080654e0c --- /dev/null +++ b/docs/widgets/ModelListener/child.html @@ -0,0 +1,155 @@ + + + + + + + + child property - ModelListener class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              child
              + +
              + +
              + + + + +
              +
              + +

              child property + Null safety +

              + +
              + Widget? + child +
              final
              + +
              + +
              +

              An optional child to cache.

              +

              This child is never re-built, so if there is an expensive widget that +does not depend on model, it would go here and can be +re-used in builder.

              +
              + + +
              +

              Implementation

              +
              final Widget? child;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListener/createState.html b/docs/widgets/ModelListener/createState.html new file mode 100644 index 000000000..f88c43e92 --- /dev/null +++ b/docs/widgets/ModelListener/createState.html @@ -0,0 +1,172 @@ + + + + + + + + createState method - ModelListener class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              createState
              + +
              + +
              + + + + +
              +
              + +

              createState method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +ModelListenerState<ChangeNotifier> +createState() + +
              override
              + +
              + +
              +

              Creates the mutable state for this widget at a given location in the tree.

              +

              Subclasses should override this method to return a newly created +instance of their associated State subclass:

              +
              @override
              +_MyState createState() => _MyState();
              +
              +

              The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

              +
              + + + +
              +

              Implementation

              +
              @override
              +ModelListenerState createState() => ModelListenerState<Model>();
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListener/dispose.html b/docs/widgets/ModelListener/dispose.html new file mode 100644 index 000000000..9f3bcf404 --- /dev/null +++ b/docs/widgets/ModelListener/dispose.html @@ -0,0 +1,154 @@ + + + + + + + + dispose property - ModelListener class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              dispose
              + +
              + +
              + + + + +
              +
              + +

              dispose property + Null safety +

              + +
              + bool + dispose +
              final
              + +
              + +
              +

              Whether or not to dispose the model.

              +

              Some models are used elsewhere in the app (like data models) while other +models (like view models) are only used in one screen.

              +
              + + +
              +

              Implementation

              +
              final bool dispose;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListener/model.html b/docs/widgets/ModelListener/model.html new file mode 100644 index 000000000..c4324b430 --- /dev/null +++ b/docs/widgets/ModelListener/model.html @@ -0,0 +1,156 @@ + + + + + + + + model property - ModelListener class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              model
              + +
              + +
              + + + + +
              +
              + +

              model property + Null safety +

              + +
              + Model Function() + model +
              final
              + +
              + +
              +

              A function to create the model to listen to.

              +

              It is important that this be a function and not an instance, because +otherwise the model will be recreated every time the widget tree +is updated. With a function, this widget can choose when to create +the model.

              +
              + + +
              +

              Implementation

              +
              final Model Function() model;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListenerState-class.html b/docs/widgets/ModelListenerState-class.html new file mode 100644 index 000000000..49ca7cf1e --- /dev/null +++ b/docs/widgets/ModelListenerState-class.html @@ -0,0 +1,505 @@ + + + + + + + + ModelListenerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ModelListenerState
              + +
              + +
              + + + + +
              +
              + +

              ModelListenerState<Model extends ChangeNotifier> class + Null safety + +

              + + +
              +

              A state for a ModelListener.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + ModelListenerState() +
              +
              + +
              +
              +
              + +
              +

              Properties

              + +
              +
              + context + BuildContext + +
              +
              + The location in the tree where this widget builds. [...] +
              read-only, inherited
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              read-only, inherited
              + +
              + +
              + model + ↔ Model + +
              +
              + The model to listen to. [...] +
              final, read / write, late
              + +
              + +
              + mounted + → bool + +
              +
              + Whether this State object is currently in a tree. [...] +
              read-only, inherited
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              + widget + ModelListener<Model> + +
              +
              + The current configuration. [...] +
              read-only, inherited
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + deactivate() + → void + + + +
              +
              + Called when this object is removed from the tree. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + didChangeDependencies() + → void + + + +
              +
              + Called when a dependency of this State object changes. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + didUpdateWidget(covariant ModelListener<Model> oldWidget) + → void + + + +
              +
              + Called whenever the widget configuration changes. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + dispose() + → void + + + +
              +
              + Called when this object is removed from the tree permanently. [...] +
              override
              + +
              + +
              + initState() + → void + + + +
              +
              + Called when this object is inserted into the tree. [...] +
              override
              + +
              + +
              + listener() + → void + + + +
              +
              + Rebuilds the widget tree whenever model updates. + + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + reassemble() + → void + + + +
              +
              + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + setState(VoidCallback fn) + → void + + + +
              +
              + Notify the framework that the internal state of this object has changed. [...] +
              @protected, inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListenerState/ModelListenerState.html b/docs/widgets/ModelListenerState/ModelListenerState.html new file mode 100644 index 000000000..9040753e9 --- /dev/null +++ b/docs/widgets/ModelListenerState/ModelListenerState.html @@ -0,0 +1,145 @@ + + + + + + + + ModelListenerState constructor - ModelListenerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ModelListenerState
              + +
              + +
              + + + + +
              +
              + +

              ModelListenerState<Model extends ChangeNotifier> constructor + Null safety +

              + +
              + ModelListenerState<Model extends ChangeNotifier>() +
              + + + + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListenerState/build.html b/docs/widgets/ModelListenerState/build.html new file mode 100644 index 000000000..a470d5a9b --- /dev/null +++ b/docs/widgets/ModelListenerState/build.html @@ -0,0 +1,251 @@ + + + + + + + + build method - ModelListenerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method in a number of different situations. For +example:

              + +

              This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

              +

              Design discussion

              +

              Why is the build method on State, and not StatefulWidget?

              +

              Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

              +

              For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

              +

              Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

              +

              Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

              +
              class MyButton extends StatefulWidget {
              +  ...
              +  final Color color;
              +
              +  @override
              +  Widget build(BuildContext context, MyButtonState state) {
              +    ... () { print("color: $color"); } ...
              +  }
              +}
              +
              +

              For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

              +

              In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

              +
              class MyButtonState extends State<MyButton> {
              +  ...
              +  @override
              +  Widget build(BuildContext context) {
              +    ... () { print("color: ${widget.color}"); } ...
              +  }
              +}
              +
              +

              Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

              +

              See also:

              +
                +
              • StatefulWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build (BuildContext context) => widget.builder (
              +  context, model, widget.child
              +);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListenerState/dispose.html b/docs/widgets/ModelListenerState/dispose.html new file mode 100644 index 000000000..225c464bc --- /dev/null +++ b/docs/widgets/ModelListenerState/dispose.html @@ -0,0 +1,198 @@ + + + + + + + + dispose method - ModelListenerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              dispose
              + +
              + +
              + + + + +
              +
              + +

              dispose method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +void +dispose() + +
              override
              + +
              + +
              +

              Called when this object is removed from the tree permanently.

              +

              The framework calls this method when this State object will never +build again. After the framework calls dispose, the State object is +considered unmounted and the mounted property is false. It is an error +to call setState at this point. This stage of the lifecycle is terminal: +there is no way to remount a State object that has been disposed.

              +

              Subclasses should override this method to release any resources retained +by this object (e.g., stop any active animations).

              +

              If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

              +
                +
              • In initState, subscribe to the object.
              • +
              • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
              • +
              • In dispose, unsubscribe from the object.
              • +
              +

              If you override this, make sure to end your method with a call to +super.dispose().

              +

              See also:

              + +
              + + + +
              +

              Implementation

              +
              @override
              +void dispose() {
              +  try {
              +    model.removeListener(listener);
              +  } catch(_) {  // ignore: avoid_catches_without_on_clauses
              +    // The model may have already been disposed. If so, we're good.
              +  }
              +  if (widget.dispose) {
              +    model.dispose();
              +  }
              +  super.dispose();
              +}
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListenerState/initState.html b/docs/widgets/ModelListenerState/initState.html new file mode 100644 index 000000000..afea43ac8 --- /dev/null +++ b/docs/widgets/ModelListenerState/initState.html @@ -0,0 +1,189 @@ + + + + + + + + initState method - ModelListenerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              initState
              + +
              + +
              + + + + +
              +
              + +

              initState method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +void +initState() + +
              override
              + +
              + +
              +

              Called when this object is inserted into the tree.

              +

              The framework will call this method exactly once for each State object +it creates.

              +

              Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

              +

              If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

              +
                +
              • In initState, subscribe to the object.
              • +
              • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
              • +
              • In dispose, unsubscribe from the object.
              • +
              +

              You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

              +

              If you override this, make sure your method starts with a call to +super.initState().

              +
              + + + +
              +

              Implementation

              +
              @override
              +void initState() {
              +  super.initState();
              +  model = widget.model()..addListener(listener);
              +}
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListenerState/listener.html b/docs/widgets/ModelListenerState/listener.html new file mode 100644 index 000000000..2c173869a --- /dev/null +++ b/docs/widgets/ModelListenerState/listener.html @@ -0,0 +1,157 @@ + + + + + + + + listener method - ModelListenerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              listener
              + +
              + +
              + + + + +
              +
              + +

              listener method + Null safety +

              + +
              + + +void +listener() + + + +
              + +
              +

              Rebuilds the widget tree whenever model updates.

              +
              + + + +
              +

              Implementation

              +
              void listener() => setState(() {});
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ModelListenerState/model.html b/docs/widgets/ModelListenerState/model.html new file mode 100644 index 000000000..b3bb8d2f7 --- /dev/null +++ b/docs/widgets/ModelListenerState/model.html @@ -0,0 +1,158 @@ + + + + + + + + model property - ModelListenerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              model
              + +
              + +
              + + + + +
              +
              + +

              model property + Null safety +

              + +
              + Model + model +
              final, read / write, late
              + +
              + +
              +

              The model to listen to.

              +

              This is different than ModelListener.model, which is a function that is +called to create the model. Here is where the result of that function is +actually stored.

              +
              + + +
              +

              Implementation

              +
              late final Model model;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NavigationItem-class.html b/docs/widgets/NavigationItem-class.html new file mode 100644 index 000000000..552c35276 --- /dev/null +++ b/docs/widgets/NavigationItem-class.html @@ -0,0 +1,522 @@ + + + + + + + + NavigationItem class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              NavigationItem
              + +
              + +
              + + + + +
              +
              + +

              NavigationItem class + Null safety + +

              + + +
              +

              Defines a common interface for BottomNavigationBar and NavigationRail.

              +

              This class maps to both BottomNavigationBarItem and +NavigationRailDestination with an icon and label property.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + +
              Implementers
              +
              + + +
              Annotations
              +
              +
              +
              + +
              +

              Constructors

              + +
              + +
              + Creates an abstraction for a navigation item. +
              const
              +
              +
              +
              + +
              +

              Properties

              + +
              +
              + appBar + AppBar + +
              +
              + +
              read-only
              + +
              + +
              + bottomNavBar + BottomNavigationBarItem + +
              +
              + Generates an item for BottomNavigationBar. +
              read-only
              + +
              + +
              + floatingActionButton + Widget? + +
              +
              + +
              read-only
              + +
              + +
              + floatingActionButtonLocation + FloatingActionButtonLocation? + +
              +
              + +
              read-only
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + icon + Widget + +
              +
              + The icon for this item. +
              final
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + +
              + label + → String + +
              +
              + The label for this item. [...] +
              final
              + +
              + + +
              + Generates an item for NavigationRail. +
              read-only
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              + sideSheet + Widget? + +
              +
              + +
              read-only
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              @protected, inherited
              + +
              + +
              + createElement() + StatelessElement + + + +
              +
              + Creates a StatelessElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NavigationItem/NavigationItem.html b/docs/widgets/NavigationItem/NavigationItem.html new file mode 100644 index 000000000..ef155e9e2 --- /dev/null +++ b/docs/widgets/NavigationItem/NavigationItem.html @@ -0,0 +1,155 @@ + + + + + + + + NavigationItem constructor - NavigationItem class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              NavigationItem
              + +
              + +
              + + + + +
              +
              + +

              NavigationItem constructor + Null safety +

              + +
              const + NavigationItem(
              1. {required Widget icon,
              2. +
              3. required String label}
              4. +
              ) +
              + + +
              +

              Creates an abstraction for a navigation item.

              +
              + + + +
              +

              Implementation

              +
              const NavigationItem({required this.icon, required this.label});
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NavigationItem/appBar.html b/docs/widgets/NavigationItem/appBar.html new file mode 100644 index 000000000..653e2edcb --- /dev/null +++ b/docs/widgets/NavigationItem/appBar.html @@ -0,0 +1,158 @@ + + + + + + + + appBar property - NavigationItem class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              appBar
              + +
              + +
              + + + + +
              +
              + +

              appBar property + Null safety +

              + + + +
              + +
              + AppBar + appBar + + +
              + + + + +
              +

              Implementation

              +
              AppBar get appBar;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NavigationItem/bottomNavBar.html b/docs/widgets/NavigationItem/bottomNavBar.html new file mode 100644 index 000000000..8bfbe162b --- /dev/null +++ b/docs/widgets/NavigationItem/bottomNavBar.html @@ -0,0 +1,162 @@ + + + + + + + + bottomNavBar property - NavigationItem class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              bottomNavBar
              + +
              + +
              + + + + +
              +
              + +

              bottomNavBar property + Null safety +

              + + + +
              + +
              + BottomNavigationBarItem + bottomNavBar + + +
              + + +
              +

              Generates an item for BottomNavigationBar.

              +
              + + +
              +

              Implementation

              +
              BottomNavigationBarItem get bottomNavBar =>
              +	BottomNavigationBarItem(icon: icon, label: label);
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NavigationItem/floatingActionButton.html b/docs/widgets/NavigationItem/floatingActionButton.html new file mode 100644 index 000000000..67d240d02 --- /dev/null +++ b/docs/widgets/NavigationItem/floatingActionButton.html @@ -0,0 +1,158 @@ + + + + + + + + floatingActionButton property - NavigationItem class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              floatingActionButton
              + +
              + +
              + + + + +
              +
              + +

              floatingActionButton property + Null safety +

              + + + +
              + +
              + Widget? + floatingActionButton + + +
              + + + + +
              +

              Implementation

              +
              Widget? get floatingActionButton => null;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NavigationItem/floatingActionButtonLocation.html b/docs/widgets/NavigationItem/floatingActionButtonLocation.html new file mode 100644 index 000000000..7baf6fdd5 --- /dev/null +++ b/docs/widgets/NavigationItem/floatingActionButtonLocation.html @@ -0,0 +1,158 @@ + + + + + + + + floatingActionButtonLocation property - NavigationItem class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              floatingActionButtonLocation
              + +
              + +
              + + + + +
              +
              + +

              floatingActionButtonLocation property + Null safety +

              + + + +
              + +
              + FloatingActionButtonLocation? + floatingActionButtonLocation + + +
              + + + + +
              +

              Implementation

              +
              FloatingActionButtonLocation? get floatingActionButtonLocation => null;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NavigationItem/icon.html b/docs/widgets/NavigationItem/icon.html new file mode 100644 index 000000000..20f966b6f --- /dev/null +++ b/docs/widgets/NavigationItem/icon.html @@ -0,0 +1,156 @@ + + + + + + + + icon property - NavigationItem class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              icon
              + +
              + +
              + + + + +
              +
              + +

              icon property + Null safety +

              + +
              + Widget + icon +
              final
              + +
              + +
              +

              The icon for this item.

              +
              + + +
              +

              Implementation

              +
              final Widget icon;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NavigationItem/label.html b/docs/widgets/NavigationItem/label.html new file mode 100644 index 000000000..e10aaa380 --- /dev/null +++ b/docs/widgets/NavigationItem/label.html @@ -0,0 +1,157 @@ + + + + + + + + label property - NavigationItem class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              label
              + +
              + +
              + + + + +
              +
              + +

              label property + Null safety +

              + +
              + String + label +
              final
              + +
              + +
              +

              The label for this item.

              +

              May also be used as semantics and tooltips.

              +
              + + +
              +

              Implementation

              +
              final String label;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NavigationItem/navRail.html b/docs/widgets/NavigationItem/navRail.html new file mode 100644 index 000000000..f25238aaa --- /dev/null +++ b/docs/widgets/NavigationItem/navRail.html @@ -0,0 +1,162 @@ + + + + + + + + navRail property - NavigationItem class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              navRail
              + +
              + +
              + + + + +
              +
              + +

              navRail property + Null safety +

              + + + +
              + +
              + NavigationRailDestination + navRail + + +
              + + +
              +

              Generates an item for NavigationRail.

              +
              + + +
              +

              Implementation

              +
              NavigationRailDestination get navRail =>
              +	NavigationRailDestination(icon: icon, label: Text(label));
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NavigationItem/sideSheet.html b/docs/widgets/NavigationItem/sideSheet.html new file mode 100644 index 000000000..28c395cfc --- /dev/null +++ b/docs/widgets/NavigationItem/sideSheet.html @@ -0,0 +1,158 @@ + + + + + + + + sideSheet property - NavigationItem class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              sideSheet
              + +
              + +
              + + + + +
              +
              + +

              sideSheet property + Null safety +

              + + + +
              + +
              + Widget? + sideSheet + + +
              + + + + +
              +

              Implementation

              +
              Widget? get sideSheet => null;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NextClass-class.html b/docs/widgets/NextClass-class.html new file mode 100644 index 000000000..3ce27106e --- /dev/null +++ b/docs/widgets/NextClass-class.html @@ -0,0 +1,463 @@ + + + + + + + + NextClass class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              NextClass
              + +
              + +
              + + + + +
              +
              + +

              NextClass class + Null safety + +

              + + +
              +

              A widget to represent the next class.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + NextClass({required List<int> reminders, Period? period, Subject? subject, bool next = false}) +
              +
              + Creates an info tile to represent a period. +
              const
              +
              +
              +
              + +
              +

              Properties

              + +
              +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + +
              + next + → bool + +
              +
              + Whether this is the next period or not. [...] +
              final
              + +
              + +
              + period + Period? + +
              +
              + The period to represent. +
              final
              + +
              + +
              + reminders + → List<int> + +
              +
              + The reminders that apply for this period. [...] +
              final
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              + subject + Subject? + +
              +
              + The subject associated with period. +
              final
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + createElement() + StatelessElement + + + +
              +
              + Creates a StatelessElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NextClass/NextClass.html b/docs/widgets/NextClass/NextClass.html new file mode 100644 index 000000000..70784cef2 --- /dev/null +++ b/docs/widgets/NextClass/NextClass.html @@ -0,0 +1,158 @@ + + + + + + + + NextClass constructor - NextClass class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              NextClass
              + +
              + +
              + + + + +
              +
              + +

              NextClass constructor + Null safety +

              + +
              const + NextClass(
              1. {required List<int> reminders,
              2. +
              3. Period? period,
              4. +
              5. Subject? subject,
              6. +
              7. bool next = false}
              8. +
              ) +
              + + +
              +

              Creates an info tile to represent a period.

              +
              + + + +
              +

              Implementation

              +
              const NextClass({
              +	required this.reminders,
              +	this.period,
              +	this.subject,
              +	this.next = false,
              +});
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NextClass/build.html b/docs/widgets/NextClass/build.html new file mode 100644 index 000000000..305b41299 --- /dev/null +++ b/docs/widgets/NextClass/build.html @@ -0,0 +1,208 @@ + + + + + + + + build method - NextClass class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

              +

              The implementation of this method must only depend on:

              + +

              If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

              +

              See also:

              +
                +
              • StatelessWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build (BuildContext context) => Column(
              +	children: [
              +		InfoCard(
              +			icon: next ? Icons.restore : Icons.school,
              +			children: period?.getInfo(subject),
              +			page: Routes.schedule,
              +			title: period == null
              +				? "School is over"
              +				: "${next ? 'Up next' : 'Right now'}: ${period!.getName(subject)}"
              +		),
              +		if (period?.activity != null)
              +			SpecialTile(child: ActivityTile(period!.activity!)),
              +		for (final int index in reminders)
              +			SpecialTile(child: ReminderTile(index: index))
              +	]
              +);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NextClass/next.html b/docs/widgets/NextClass/next.html new file mode 100644 index 000000000..df0cf96d5 --- /dev/null +++ b/docs/widgets/NextClass/next.html @@ -0,0 +1,153 @@ + + + + + + + + next property - NextClass class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              next
              + +
              + +
              + + + + +
              +
              + +

              next property + Null safety +

              + +
              + bool + next +
              final
              + +
              + +
              +

              Whether this is the next period or not.

              +

              This changes the text from "Right now" to "Up next".

              +
              + + +
              +

              Implementation

              +
              final bool next;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NextClass/period.html b/docs/widgets/NextClass/period.html new file mode 100644 index 000000000..7ba06cf56 --- /dev/null +++ b/docs/widgets/NextClass/period.html @@ -0,0 +1,152 @@ + + + + + + + + period property - NextClass class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              period
              + +
              + +
              + + + + +
              +
              + +

              period property + Null safety +

              + +
              + Period? + period +
              final
              + +
              + +
              +

              The period to represent.

              +
              + + +
              +

              Implementation

              +
              final Period? period;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NextClass/reminders.html b/docs/widgets/NextClass/reminders.html new file mode 100644 index 000000000..7530ebeac --- /dev/null +++ b/docs/widgets/NextClass/reminders.html @@ -0,0 +1,153 @@ + + + + + + + + reminders property - NextClass class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              reminders
              + +
              + +
              + + + + +
              +
              + +

              reminders property + Null safety +

              + +
              + List<int> + reminders +
              final
              + +
              + +
              +

              The reminders that apply for this period.

              +

              These are indices in the reminders data model.

              +
              + + +
              +

              Implementation

              +
              final List<int> reminders;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/NextClass/subject.html b/docs/widgets/NextClass/subject.html new file mode 100644 index 000000000..a3a494452 --- /dev/null +++ b/docs/widgets/NextClass/subject.html @@ -0,0 +1,152 @@ + + + + + + + + subject property - NextClass class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              subject
              + +
              + +
              + + + + +
              +
              + +

              subject property + Null safety +

              + +
              + Subject? + subject +
              final
              + +
              + +
              +

              The subject associated with period.

              +
              + + +
              +

              Implementation

              +
              final Subject? subject;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/PeriodTile-class.html b/docs/widgets/PeriodTile-class.html new file mode 100644 index 000000000..2cedcc4aa --- /dev/null +++ b/docs/widgets/PeriodTile-class.html @@ -0,0 +1,500 @@ + + + + + + + + PeriodTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              PeriodTile
              + +
              + +
              + + + + +
              +
              + +

              PeriodTile class + Null safety + +

              + + +
              +

              A widget to represent a Period when creating a Schedule.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + PeriodTile({required ScheduleBuilderModel model, required Range range, required int index}) +
              +
              + Creates a widget to edit a period in a Schedule. +
              +
              +
              + +
              +

              Properties

              + +
              +
              + activity + Activity? + +
              +
              + The Activity for this period. +
              final
              + +
              + +
              + end + TimeOfDay + +
              +
              + Allows range to be formatted according to the user's locale. +
              final
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + index + → int + +
              +
              + The index of this period in ScheduleBuilderModel.periods. +
              final
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + +
              + model + ScheduleBuilderModel + +
              +
              + The view model to decide the properties of this period. +
              final
              + +
              + +
              + range + Range + +
              +
              + The times for this period. +
              final
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              + start + TimeOfDay + +
              +
              + Allows range to be formatted according to the user's locale. +
              final
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + createElement() + StatelessElement + + + +
              +
              + Creates a StatelessElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + getRange(TimeOfDay time, {required bool start}) + Range + + + +
              +
              + Creates a Range from a TimeOfDay. [...] + + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/PeriodTile/PeriodTile.html b/docs/widgets/PeriodTile/PeriodTile.html new file mode 100644 index 000000000..e17f8c172 --- /dev/null +++ b/docs/widgets/PeriodTile/PeriodTile.html @@ -0,0 +1,162 @@ + + + + + + + + PeriodTile constructor - PeriodTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              PeriodTile
              + +
              + +
              + + + + +
              +
              + +

              PeriodTile constructor + Null safety +

              + +
              + PeriodTile(
              1. {required ScheduleBuilderModel model,
              2. +
              3. required Range range,
              4. +
              5. required int index}
              6. +
              ) +
              + + +
              +

              Creates a widget to edit a period in a Schedule.

              +
              + + + +
              +

              Implementation

              +
              PeriodTile({
              +	required this.model,
              +	required this.range,
              +	required this.index,
              +}) :
              +	activity = null,
              +	start = range.start.asTimeOfDay,
              +	end = range.end.asTimeOfDay;
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/PeriodTile/activity.html b/docs/widgets/PeriodTile/activity.html new file mode 100644 index 000000000..30ce02b43 --- /dev/null +++ b/docs/widgets/PeriodTile/activity.html @@ -0,0 +1,155 @@ + + + + + + + + activity property - PeriodTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              activity
              + +
              + +
              + + + + +
              +
              + +

              activity property + Null safety +

              + +
              + Activity? + activity +
              final
              + +
              + +
              +

              The Activity for this period.

              +
              + + +
              +

              Implementation

              +
              final Activity? activity;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/PeriodTile/build.html b/docs/widgets/PeriodTile/build.html new file mode 100644 index 000000000..621269b61 --- /dev/null +++ b/docs/widgets/PeriodTile/build.html @@ -0,0 +1,248 @@ + + + + + + + + build method - PeriodTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

              +

              The implementation of this method must only depend on:

              + +

              If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

              +

              See also:

              +
                +
              • StatelessWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build(BuildContext context) => SizedBox(
              +	height: 55,
              +	child: Stack (
              +		children: [
              +			ListTile(
              +				subtitle: Text(model.periods [index].name),
              +				title: Text.rich(
              +					TextSpan(
              +						children: [
              +							WidgetSpan(
              +								child: InkWell(
              +									onTap: () async => model.replaceTime(
              +										index,
              +										getRange(
              +											await showTimePicker(
              +												context: context,
              +												initialTime: start,
              +											) ?? start,
              +											start: true,
              +										)
              +									),
              +									child: Text(
              +										start.format(context),
              +										style: const TextStyle(color: Colors.blue)
              +									),
              +								),
              +							),
              +							const TextSpan(text: " -- "),
              +							WidgetSpan(
              +								child: InkWell(
              +									onTap: () async => model.replaceTime(
              +										index,
              +										getRange(
              +											await showTimePicker(
              +												context: context,
              +												initialTime: end,
              +											) ?? end,
              +											start: false,
              +										)
              +									),
              +									child: Text(
              +										end.format(context),
              +										style: const TextStyle(color: Colors.blue)
              +									),
              +								),
              +							),
              +						]
              +					)
              +				),
              +			)
              +		]
              +	)
              +);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/PeriodTile/end.html b/docs/widgets/PeriodTile/end.html new file mode 100644 index 000000000..8fbadb5f6 --- /dev/null +++ b/docs/widgets/PeriodTile/end.html @@ -0,0 +1,155 @@ + + + + + + + + end property - PeriodTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              end
              + +
              + +
              + + + + +
              +
              + +

              end property + Null safety +

              + +
              + TimeOfDay + end +
              final
              + +
              + +
              +

              Allows range to be formatted according to the user's locale.

              +
              + + +
              +

              Implementation

              +
              final TimeOfDay start, end;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/PeriodTile/getRange.html b/docs/widgets/PeriodTile/getRange.html new file mode 100644 index 000000000..af6016999 --- /dev/null +++ b/docs/widgets/PeriodTile/getRange.html @@ -0,0 +1,163 @@ + + + + + + + + getRange method - PeriodTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              getRange
              + +
              + +
              + + + + +
              +
              + +

              getRange method + Null safety +

              + +
              + + +Range +getRange(
              1. TimeOfDay time,
              2. +
              3. {required bool start}
              4. +
              ) + + + +
              + +
              +

              Creates a Range from a TimeOfDay.

              +

              start determines if the range starts with time or not.

              +
              + + + +
              +

              Implementation

              +
              Range getRange(TimeOfDay time, {required bool start}) => Range(
              +	start ? time.asTime : range.start,
              +	start ? range.end : time.asTime,
              +);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/PeriodTile/index.html b/docs/widgets/PeriodTile/index.html new file mode 100644 index 000000000..5d596381c --- /dev/null +++ b/docs/widgets/PeriodTile/index.html @@ -0,0 +1,155 @@ + + + + + + + + index property - PeriodTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              index
              + +
              + +
              + + + + +
              +
              + +

              index property + Null safety +

              + +
              + int + index +
              final
              + +
              + +
              +

              The index of this period in ScheduleBuilderModel.periods.

              +
              + + +
              +

              Implementation

              +
              final int index;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/PeriodTile/model.html b/docs/widgets/PeriodTile/model.html new file mode 100644 index 000000000..91f2937a5 --- /dev/null +++ b/docs/widgets/PeriodTile/model.html @@ -0,0 +1,155 @@ + + + + + + + + model property - PeriodTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              model
              + +
              + +
              + + + + +
              +
              + +

              model property + Null safety +

              + +
              + ScheduleBuilderModel + model +
              final
              + +
              + +
              +

              The view model to decide the properties of this period.

              +
              + + +
              +

              Implementation

              +
              final ScheduleBuilderModel model;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/PeriodTile/range.html b/docs/widgets/PeriodTile/range.html new file mode 100644 index 000000000..de896283b --- /dev/null +++ b/docs/widgets/PeriodTile/range.html @@ -0,0 +1,155 @@ + + + + + + + + range property - PeriodTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              range
              + +
              + +
              + + + + +
              +
              + +

              range property + Null safety +

              + +
              + Range + range +
              final
              + +
              + +
              +

              The times for this period.

              +
              + + +
              +

              Implementation

              +
              final Range range;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/PeriodTile/start.html b/docs/widgets/PeriodTile/start.html new file mode 100644 index 000000000..9c33f3a53 --- /dev/null +++ b/docs/widgets/PeriodTile/start.html @@ -0,0 +1,155 @@ + + + + + + + + start property - PeriodTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              start
              + +
              + +
              + + + + +
              +
              + +

              start property + Null safety +

              + +
              + TimeOfDay + start +
              final
              + +
              + +
              +

              Allows range to be formatted according to the user's locale.

              +
              + + +
              +

              Implementation

              +
              final TimeOfDay start, end;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos-class.html b/docs/widgets/RamazLogos-class.html new file mode 100644 index 000000000..56a5bca89 --- /dev/null +++ b/docs/widgets/RamazLogos-class.html @@ -0,0 +1,342 @@ + + + + + + + + RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              RamazLogos
              + +
              + +
              + + + + +
              +
              + +

              RamazLogos class + Null safety + +

              + + +
              +

              Logos belonging to ramaz.

              +
              + + + +
              +

              Constructors

              + +
              +
              + RamazLogos() +
              +
              + +
              +
              +
              + +
              +

              Properties

              + +
              +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              read-only, inherited
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toString() + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              inherited
              + +
              + +
              +
              + + + +
              +

              Constants

              + +
              +
              + ramRectangle + → const Widget + + +
              +
              + The Ramaz Ram with the word Ramaz to its right. [...] + + +
              + LoadingImage(image: AssetImage("images/logos/ramaz/ram_rectangle.png"), aspectRatio: 2.8915864378401004) +
              +
              + +
              + ramSquare + → const Widget + + +
              +
              + A ram head. [...] + + +
              + LoadingImage(image: AssetImage("images/logos/ramaz/ram_square.png"), aspectRatio: 1.0666666666666667) +
              +
              + +
              + ramSquareWords + → const Widget + + +
              +
              + The Ramaz logo with a Ram head and the words Ramaz underneath. [...] + + +
              + LoadingImage(image: AssetImage("images/logos/ramaz/ram_square_words.png"), aspectRatio: 0.9276218611521418) +
              +
              + +
              + teal + → const Widget + + +
              +
              + The light blue, square Ramaz logo. [...] + + +
              + LoadingImage(image: AssetImage("images/logos/ramaz/teal.jpg"), aspectRatio: 1) +
              +
              + +
              +
              + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos/RamazLogos.html b/docs/widgets/RamazLogos/RamazLogos.html new file mode 100644 index 000000000..78acbdf2f --- /dev/null +++ b/docs/widgets/RamazLogos/RamazLogos.html @@ -0,0 +1,134 @@ + + + + + + + + RamazLogos constructor - RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              RamazLogos
              + +
              + +
              + + + + +
              +
              + +

              RamazLogos constructor + Null safety +

              + +
              + RamazLogos() +
              + + + + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos/hashCode.html b/docs/widgets/RamazLogos/hashCode.html new file mode 100644 index 000000000..e01e309b2 --- /dev/null +++ b/docs/widgets/RamazLogos/hashCode.html @@ -0,0 +1,173 @@ + + + + + + + + hashCode property - RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              hashCode
              + +
              + +
              + + + + +
              +
              +

              hashCode property + Null safety +

              + + + +
              + +
              + int + hashCode +
              inherited
              + +
              + + +
              +

              The hash code for this object.

              +

              A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

              +

              All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

              +

              If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

              +

              Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

              +

              Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

              +

              If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

              +
              + + +
              +

              Implementation

              +
              external int get hashCode;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos/noSuchMethod.html b/docs/widgets/RamazLogos/noSuchMethod.html new file mode 100644 index 000000000..08c87e4d3 --- /dev/null +++ b/docs/widgets/RamazLogos/noSuchMethod.html @@ -0,0 +1,181 @@ + + + + + + + + noSuchMethod method - RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              noSuchMethod
              + +
              + +
              + + + + +
              +
              +

              noSuchMethod method + Null safety +

              + +
              + + +dynamic +noSuchMethod(
              1. Invocation invocation
              2. +
              ) + +
              inherited
              + +
              + +
              +

              Invoked when a non-existent method or property is accessed.

              +

              A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

              +
              dynamic object = 1;
              +object.add(42); // Statically allowed, run-time error
              +
              +

              This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

              +

              Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

              +

              A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

              +
              class MockList<T> implements List<T> {
              +  noSuchMethod(Invocation invocation) {
              +    log(invocation);
              +    super.noSuchMethod(invocation); // Will throw.
              +  }
              +}
              +void main() {
              +  MockList().add(42);
              +}
              +
              +

              This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

              +

              If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

              +

              The default behavior is to throw a NoSuchMethodError.

              +
              + + + +
              +

              Implementation

              +
              @pragma("vm:entry-point")
              +external dynamic noSuchMethod(Invocation invocation);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos/operator_equals.html b/docs/widgets/RamazLogos/operator_equals.html new file mode 100644 index 000000000..fa6174852 --- /dev/null +++ b/docs/widgets/RamazLogos/operator_equals.html @@ -0,0 +1,172 @@ + + + + + + + + operator == method - RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              operator ==
              + +
              + +
              + + + + +
              +
              +

              operator == method + Null safety +

              + +
              + + +bool +operator ==(
              1. Object other
              2. +
              ) + +
              inherited
              + +
              + +
              +

              The equality operator.

              +

              The default behavior for all Objects is to return true if and +only if this object and other are the same object.

              +

              Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

              +
                +
              • +

                Total: It must return a boolean for all arguments. It should never throw.

                +
              • +
              • +

                Reflexive: For all objects o, o == o must be true.

                +
              • +
              • +

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

                +
              • +
              • +

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

                +
              • +
              +

              The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

              +

              If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

              +
              + + + +
              +

              Implementation

              +
              external bool operator ==(Object other);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos/ramRectangle-constant.html b/docs/widgets/RamazLogos/ramRectangle-constant.html new file mode 100644 index 000000000..8c73065d3 --- /dev/null +++ b/docs/widgets/RamazLogos/ramRectangle-constant.html @@ -0,0 +1,150 @@ + + + + + + + + ramRectangle constant - RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ramRectangle
              + +
              + +
              + + + + +
              +
              + +

              ramRectangle constant + Null safety +

              + +
              + Widget + const ramRectangle + + +
              + +
              +

              The Ramaz Ram with the word Ramaz to its right.

              +

              https://www.the-rampage.org/wp-content/uploads/2019/08/IMG_0432.png +with https://upload.wikimedia.org/wikipedia/commons/a/aa/RamazNewLogo_BLUE_RGB_Large72dpi.jpg +next to it.

              +
              + + +
              +

              Implementation

              +
              static const Widget ramRectangle = LoadingImage(
              +	image: AssetImage("images/logos/ramaz/ram_rectangle.png"),
              +	aspectRatio: 2.8915864378401004
              +);
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos/ramSquare-constant.html b/docs/widgets/RamazLogos/ramSquare-constant.html new file mode 100644 index 000000000..a2faf8f70 --- /dev/null +++ b/docs/widgets/RamazLogos/ramSquare-constant.html @@ -0,0 +1,148 @@ + + + + + + + + ramSquare constant - RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ramSquare
              + +
              + +
              + + + + +
              +
              + +

              ramSquare constant + Null safety +

              + +
              + Widget + const ramSquare + + +
              + +
              +

              A ram head.

              +

              https://www.the-rampage.org/wp-content/uploads/2019/08/IMG_0432.png

              +
              + + +
              +

              Implementation

              +
              static const Widget ramSquare = LoadingImage(
              +	image: AssetImage("images/logos/ramaz/ram_square.png"),
              +	aspectRatio: 1.0666666666666667
              +);
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos/ramSquareWords-constant.html b/docs/widgets/RamazLogos/ramSquareWords-constant.html new file mode 100644 index 000000000..6006a38d7 --- /dev/null +++ b/docs/widgets/RamazLogos/ramSquareWords-constant.html @@ -0,0 +1,149 @@ + + + + + + + + ramSquareWords constant - RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ramSquareWords
              + +
              + +
              + + + + +
              +
              + +

              ramSquareWords constant + Null safety +

              + +
              + Widget + const ramSquareWords + + +
              + +
              +

              The Ramaz logo with a Ram head and the words Ramaz underneath.

              +

              Like https://www.the-rampage.org/wp-content/uploads/2019/08/IMG_0432.png, +but with the word Ramaz underneath.

              +
              + + +
              +

              Implementation

              +
              static const Widget ramSquareWords = LoadingImage(
              +	image: AssetImage("images/logos/ramaz/ram_square_words.png"),
              +	aspectRatio: 0.9276218611521418
              +);
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos/runtimeType.html b/docs/widgets/RamazLogos/runtimeType.html new file mode 100644 index 000000000..7da5b5190 --- /dev/null +++ b/docs/widgets/RamazLogos/runtimeType.html @@ -0,0 +1,148 @@ + + + + + + + + runtimeType property - RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              runtimeType
              + +
              + +
              + + + + +
              +
              +

              runtimeType property + Null safety +

              + + + +
              + +
              + Type + runtimeType +
              inherited
              + +
              + + +
              +

              A representation of the runtime type of the object.

              +
              + + +
              +

              Implementation

              +
              external Type get runtimeType;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos/teal-constant.html b/docs/widgets/RamazLogos/teal-constant.html new file mode 100644 index 000000000..afa9ae3ed --- /dev/null +++ b/docs/widgets/RamazLogos/teal-constant.html @@ -0,0 +1,148 @@ + + + + + + + + teal constant - RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              teal
              + +
              + +
              + + + + +
              +
              + +

              teal constant + Null safety +

              + +
              + Widget + const teal + + +
              + +
              +

              The light blue, square Ramaz logo.

              +

              https://pbs.twimg.com/profile_images/378800000152983492/5724a8d14e67b53234ed96e3235fe526.jpeg

              +
              + + +
              +

              Implementation

              +
              static const Widget teal = LoadingImage(
              +	image: AssetImage("images/logos/ramaz/teal.jpg"),
              +	aspectRatio: 1
              +);
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/RamazLogos/toString.html b/docs/widgets/RamazLogos/toString.html new file mode 100644 index 000000000..ea73303b9 --- /dev/null +++ b/docs/widgets/RamazLogos/toString.html @@ -0,0 +1,154 @@ + + + + + + + + toString method - RamazLogos class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              toString
              + +
              + +
              + + + + +
              +
              +

              toString method + Null safety +

              + +
              + + +String +toString() + +
              inherited
              + +
              + +
              +

              A string representation of this object.

              +

              Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

              +

              Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

              +
              + + + +
              +

              Implementation

              +
              external String toString();
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ReminderTile-class.html b/docs/widgets/ReminderTile-class.html new file mode 100644 index 000000000..6c6dfacd2 --- /dev/null +++ b/docs/widgets/ReminderTile-class.html @@ -0,0 +1,440 @@ + + + + + + + + ReminderTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ReminderTile
              + +
              + +
              + + + + +
              +
              + +

              ReminderTile class + Null safety + +

              + + +
              +

              A widget to represent a Reminder.

              +

              From the widget, the user will be able to delete or modify the reminder.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + ReminderTile({required int index, double height = 65}) +
              +
              + Creates a reminder tile. +
              const
              +
              +
              +
              + +
              +

              Properties

              + +
              +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + height + → double + +
              +
              + The height of this tile. +
              final
              + +
              + +
              + index + → int + +
              +
              + The index of this reminder in Reminders.reminders. +
              final
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + createElement() + StatelessElement + + + +
              +
              + Creates a StatelessElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ReminderTile/ReminderTile.html b/docs/widgets/ReminderTile/ReminderTile.html new file mode 100644 index 000000000..bf5fa771f --- /dev/null +++ b/docs/widgets/ReminderTile/ReminderTile.html @@ -0,0 +1,152 @@ + + + + + + + + ReminderTile constructor - ReminderTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ReminderTile
              + +
              + +
              + + + + +
              +
              + +

              ReminderTile constructor + Null safety +

              + +
              const + ReminderTile(
              1. {required int index,
              2. +
              3. double height = 65}
              4. +
              ) +
              + + +
              +

              Creates a reminder tile.

              +
              + + + +
              +

              Implementation

              +
              const ReminderTile({
              +	required this.index,
              +	this.height = 65,
              +});
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ReminderTile/build.html b/docs/widgets/ReminderTile/build.html new file mode 100644 index 000000000..8750fa957 --- /dev/null +++ b/docs/widgets/ReminderTile/build.html @@ -0,0 +1,227 @@ + + + + + + + + build method - ReminderTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

              +

              The implementation of this method must only depend on:

              + +

              If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

              +

              See also:

              +
                +
              • StatelessWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build (BuildContext context) {
              +	// The data model.
              +	final Reminders reminders = Models.instance.reminders;
              +
              +	// The reminder being represented
              +	final Reminder reminder = reminders.reminders [index];
              +
              +	return SizedBox (
              +		height: height,
              +		child: Center (
              +			child: ListTile(
              +				title: Text (reminder.message),
              +				subtitle: Text(reminder.time.toString()),
              +				onTap: () async {
              +					if (!Models.instance.schedule.isValidReminder(reminder)) {
              +						reminders.deleteReminder(index);
              +						ScaffoldMessenger.of(context).showSnackBar(
              +							const SnackBar(content: Text("Deleted outdated reminder"))
              +						);
              +						return;
              +					}
              +					reminders.replaceReminder(
              +						index,
              +						await ReminderBuilder.buildReminder(context, reminder),
              +					);
              +					},
              +				trailing: IconButton (
              +					icon: Icon (
              +						Icons.remove_circle,
              +						color: Theme.of(context).iconTheme.color
              +					),
              +					onPressed: () => reminders.deleteReminder(index),
              +				),
              +			),
              +		),
              +	);
              +}
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ReminderTile/height.html b/docs/widgets/ReminderTile/height.html new file mode 100644 index 000000000..7543e74cd --- /dev/null +++ b/docs/widgets/ReminderTile/height.html @@ -0,0 +1,150 @@ + + + + + + + + height property - ReminderTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              height
              + +
              + +
              + + + + +
              +
              + +

              height property + Null safety +

              + +
              + double + height +
              final
              + +
              + +
              +

              The height of this tile.

              +
              + + +
              +

              Implementation

              +
              final double height;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ReminderTile/index.html b/docs/widgets/ReminderTile/index.html new file mode 100644 index 000000000..0e6f80b1a --- /dev/null +++ b/docs/widgets/ReminderTile/index.html @@ -0,0 +1,150 @@ + + + + + + + + index property - ReminderTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              index
              + +
              + +
              + + + + +
              +
              + +

              index property + Null safety +

              + +
              + int + index +
              final
              + +
              + +
              +

              The index of this reminder in Reminders.reminders.

              +
              + + +
              +

              Implementation

              +
              final int index;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveBuilder-class.html b/docs/widgets/ResponsiveBuilder-class.html new file mode 100644 index 000000000..568f26456 --- /dev/null +++ b/docs/widgets/ResponsiveBuilder-class.html @@ -0,0 +1,439 @@ + + + + + + + + ResponsiveBuilder class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ResponsiveBuilder
              + +
              + +
              + + + + +
              +
              + +

              ResponsiveBuilder class + Null safety + +

              + + +
              +

              Builds a widget tree according to a LayoutInfo.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + ResponsiveBuilder({required ResponsiveWidgetBuilder builder, Widget? child}) +
              +
              + A builder to layout the widget tree based on the device size. +
              const
              +
              +
              +
              + +
              +

              Properties

              + +
              +
              + builder + ResponsiveWidgetBuilder + +
              +
              + A function to build the widget tree. +
              final
              + +
              + +
              + child + Widget? + +
              +
              + An optional widget that doesn't depend on the layout info. [...] +
              final
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + createElement() + StatelessElement + + + +
              +
              + Creates a StatelessElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveBuilder/ResponsiveBuilder.html b/docs/widgets/ResponsiveBuilder/ResponsiveBuilder.html new file mode 100644 index 000000000..8f1a49fe7 --- /dev/null +++ b/docs/widgets/ResponsiveBuilder/ResponsiveBuilder.html @@ -0,0 +1,152 @@ + + + + + + + + ResponsiveBuilder constructor - ResponsiveBuilder class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ResponsiveBuilder
              + +
              + +
              + + + + +
              +
              + +

              ResponsiveBuilder constructor + Null safety +

              + +
              const + ResponsiveBuilder(
              1. {required ResponsiveWidgetBuilder builder,
              2. +
              3. Widget? child}
              4. +
              ) +
              + + +
              +

              A builder to layout the widget tree based on the device size.

              +
              + + + +
              +

              Implementation

              +
              const ResponsiveBuilder({
              +	required this.builder,
              +	this.child,
              +});
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveBuilder/build.html b/docs/widgets/ResponsiveBuilder/build.html new file mode 100644 index 000000000..e1b8d093d --- /dev/null +++ b/docs/widgets/ResponsiveBuilder/build.html @@ -0,0 +1,192 @@ + + + + + + + + build method - ResponsiveBuilder class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

              +

              The implementation of this method must only depend on:

              + +

              If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

              +

              See also:

              +
                +
              • StatelessWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build(BuildContext context) =>
              +	builder(context, LayoutInfo(context), child);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveBuilder/builder.html b/docs/widgets/ResponsiveBuilder/builder.html new file mode 100644 index 000000000..e57e008ff --- /dev/null +++ b/docs/widgets/ResponsiveBuilder/builder.html @@ -0,0 +1,150 @@ + + + + + + + + builder property - ResponsiveBuilder class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              builder
              + +
              + +
              + + + + +
              +
              + +

              builder property + Null safety +

              + +
              + ResponsiveWidgetBuilder + builder +
              final
              + +
              + +
              +

              A function to build the widget tree.

              +
              + + +
              +

              Implementation

              +
              final ResponsiveWidgetBuilder builder;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveBuilder/child.html b/docs/widgets/ResponsiveBuilder/child.html new file mode 100644 index 000000000..3c5d89a42 --- /dev/null +++ b/docs/widgets/ResponsiveBuilder/child.html @@ -0,0 +1,152 @@ + + + + + + + + child property - ResponsiveBuilder class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              child
              + +
              + +
              + + + + +
              +
              + +

              child property + Null safety +

              + +
              + Widget? + child +
              final
              + +
              + +
              +

              An optional widget that doesn't depend on the layout info.

              +

              Use this field to cache large portions of the widget tree so they don't +rebuild every frame when a window resizes.

              +
              + + +
              +

              Implementation

              +
              final Widget? child;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold-class.html b/docs/widgets/ResponsiveScaffold-class.html new file mode 100644 index 000000000..209da33de --- /dev/null +++ b/docs/widgets/ResponsiveScaffold-class.html @@ -0,0 +1,560 @@ + + + + + + + + ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ResponsiveScaffold
              + +
              + +
              + + + + +
              +
              + +

              ResponsiveScaffold class + Null safety + +

              + + +
              +

              A Scaffold that rearranges itself according to the device size.

              +

              Uses LayoutInfo to decide key elements of the layout. This class has +two uses: with and without primary navigation items. These are items that +would normally be placed in a BottomNavigationBar. When primary navigation +items are provided, two different drawers are used: with and without the +primary navigation items (to avoid duplication in the UI).

              +

              See the package documentation for how the layout is determined.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + ResponsiveScaffold({required Widget drawer, required WidgetBuilder bodyBuilder, required PreferredSizeWidget appBar, Widget? floatingActionButton, Widget? sideSheet, FloatingActionButtonLocation? floatingActionButtonLocation}) +
              +
              + Creates a scaffold that responds to the screen size. +
              const
              +
              +
              + ResponsiveScaffold.navBar({required Widget drawer, required Widget? secondaryDrawer, required List<NavigationItem> navItems, required int navIndex, required ValueChanged<int>? onNavIndexChanged}) +
              +
              + Creates a responsive layout with primary navigation items. +
              +
              +
              + +
              +

              Properties

              + +
              +
              + appBar + PreferredSizeWidget + +
              +
              + The app bar. [...] +
              final
              + +
              + +
              + bodyBuilder + WidgetBuilder + +
              +
              + The main body of the scaffold. +
              final
              + +
              + +
              + drawer + Widget + +
              +
              + The full drawer to show. [...] +
              final
              + +
              + +
              + floatingActionButton + Widget? + +
              +
              + The Floating Action Button. [...] +
              final
              + +
              + +
              + floatingActionButtonLocation + FloatingActionButtonLocation? + +
              +
              + The location of the floating action button. +
              final
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + hasNavBar + → bool + +
              +
              + Whether this widget is being used with a navigation bar. +
              read-only
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + + +
              + The index of the current navigation item in navItems. +
              final
              + +
              + + +
              + The navigation items. [...] +
              final
              + +
              + +
              + onNavIndexChanged + ValueChanged<int>? + +
              +
              + A callback for when the user selects a navigation item. +
              final
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              + secondaryDrawer + Widget? + +
              +
              + The secondary, more compact, navigation drawer. [...] +
              final
              + +
              + +
              + sideSheet + Widget? + +
              +
              + The side sheet. [...] +
              final
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + createElement() + StatelessElement + + + +
              +
              + Creates a StatelessElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.html b/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.html new file mode 100644 index 000000000..cb3555765 --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.html @@ -0,0 +1,174 @@ + + + + + + + + ResponsiveScaffold constructor - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ResponsiveScaffold
              + +
              + +
              + + + + +
              +
              + +

              ResponsiveScaffold constructor + Null safety +

              + +
              const + ResponsiveScaffold(
              1. {required Widget drawer,
              2. +
              3. required WidgetBuilder bodyBuilder,
              4. +
              5. required PreferredSizeWidget appBar,
              6. +
              7. Widget? floatingActionButton,
              8. +
              9. Widget? sideSheet,
              10. +
              11. FloatingActionButtonLocation? floatingActionButtonLocation}
              12. +
              ) +
              + + +
              +

              Creates a scaffold that responds to the screen size.

              +
              + + + +
              +

              Implementation

              +
              const ResponsiveScaffold({
              +	required this.drawer,
              +	required this.bodyBuilder,
              +	required this.appBar,
              +	this.floatingActionButton,
              +	this.sideSheet,
              +	this.floatingActionButtonLocation,
              +}) :
              +	secondaryDrawer = null,
              +	navItems = null,
              +	navIndex = null,
              +	onNavIndexChanged = null;
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.navBar.html b/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.navBar.html new file mode 100644 index 000000000..dfd143f01 --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.navBar.html @@ -0,0 +1,174 @@ + + + + + + + + ResponsiveScaffold.navBar constructor - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ResponsiveScaffold.navBar
              + +
              + +
              + + + + +
              +
              + +

              ResponsiveScaffold.navBar constructor + Null safety +

              + +
              + ResponsiveScaffold.navBar(
              1. {required Widget drawer,
              2. +
              3. required Widget? secondaryDrawer,
              4. +
              5. required List<NavigationItem> navItems,
              6. +
              7. required int navIndex,
              8. +
              9. required ValueChanged<int>? onNavIndexChanged}
              10. +
              ) +
              + + +
              +

              Creates a responsive layout with primary navigation items.

              +
              + + + +
              +

              Implementation

              +
              ResponsiveScaffold.navBar({
              +	required this.drawer,
              +	required this.secondaryDrawer,
              +	required List<NavigationItem> this.navItems,
              +	required int this.navIndex,
              +	required this.onNavIndexChanged,
              +}) :
              +	appBar = navItems [navIndex].appBar,
              +	bodyBuilder = navItems [navIndex].build,
              +	floatingActionButton = navItems [navIndex].floatingActionButton,
              +	floatingActionButtonLocation = navItems [navIndex]
              +		.floatingActionButtonLocation,
              +	sideSheet = navItems [navIndex].sideSheet;
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/appBar.html b/docs/widgets/ResponsiveScaffold/appBar.html new file mode 100644 index 000000000..6a5b84e44 --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/appBar.html @@ -0,0 +1,161 @@ + + + + + + + + appBar property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              appBar
              + +
              + +
              + + + + +
              +
              + +

              appBar property + Null safety +

              + +
              + PreferredSizeWidget + appBar +
              final
              + +
              + +
              +

              The app bar.

              +

              This does not change with the layout, except for showing a drawer menu.

              +
              + + +
              +

              Implementation

              +
              final PreferredSizeWidget appBar;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/bodyBuilder.html b/docs/widgets/ResponsiveScaffold/bodyBuilder.html new file mode 100644 index 000000000..7ea960af1 --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/bodyBuilder.html @@ -0,0 +1,160 @@ + + + + + + + + bodyBuilder property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              bodyBuilder
              + +
              + +
              + + + + +
              +
              + +

              bodyBuilder property + Null safety +

              + +
              + WidgetBuilder + bodyBuilder +
              final
              + +
              + +
              +

              The main body of the scaffold.

              +
              + + +
              +

              Implementation

              +
              final WidgetBuilder bodyBuilder;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/build.html b/docs/widgets/ResponsiveScaffold/build.html new file mode 100644 index 000000000..d3de86972 --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/build.html @@ -0,0 +1,245 @@ + + + + + + + + build method - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

              +

              The implementation of this method must only depend on:

              + +

              If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

              +

              See also:

              +
                +
              • StatelessWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build(BuildContext context) => ResponsiveBuilder(
              +	child: bodyBuilder(context),  // ignore: sort_child_properties_last
              +	builder: (BuildContext context, LayoutInfo info, Widget? child) => Scaffold(
              +		appBar: appBar,
              +		drawer: info.hasStandardDrawer ? null
              +			: Drawer(child: hasNavBar ? secondaryDrawer : drawer),
              +		endDrawer: info.hasStandardSideSheet || sideSheet == null
              +			? null : Drawer(child: sideSheet),
              +		floatingActionButton: floatingActionButton,
              +		floatingActionButtonLocation: floatingActionButtonLocation,
              +		bottomNavigationBar: !hasNavBar || !info.hasBottomNavBar
              +			? null
              +			: BottomNavigationBar(
              +				type: BottomNavigationBarType.fixed,
              +				items: [
              +					for (final NavigationItem item in navItems!)
              +						item.bottomNavBar,
              +				],
              +				currentIndex: navIndex!,
              +				onTap: onNavIndexChanged,
              +			),
              +		body: Row(
              +			children: [
              +				if (hasNavBar && info.hasNavRail) NavigationRail(
              +					labelType: NavigationRailLabelType.all,
              +					destinations: [
              +						for (final NavigationItem item in navItems!)
              +							item.navRail,
              +					],
              +					selectedIndex: navIndex!,
              +					onDestinationSelected: onNavIndexChanged,
              +				)
              +				else if (info.hasStandardDrawer) drawer,
              +				Expanded(child: child!),
              +				if (sideSheet != null && info.hasStandardSideSheet) ...[
              +					const VerticalDivider(),
              +					SizedBox(
              +						width: 320,
              +						child: Drawer(elevation: 0, child: sideSheet),
              +					)
              +				]
              +			]
              +		)
              +	),
              +);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/drawer.html b/docs/widgets/ResponsiveScaffold/drawer.html new file mode 100644 index 000000000..4fe594010 --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/drawer.html @@ -0,0 +1,165 @@ + + + + + + + + drawer property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              drawer
              + +
              + +
              + + + + +
              +
              + +

              drawer property + Null safety +

              + +
              + Widget + drawer +
              final
              + +
              + +
              +

              The full drawer to show.

              +

              When there are primary navigation items, it is recommended not to include +them in the drawer, as that may confuse your users. Instead, provide two +drawers, one with them and the other, without.

              +

              This field should include all navigation items, whereas secondaryDrawer +should exclude all navigation items that are in navItems.

              +
              + + +
              +

              Implementation

              +
              final Widget drawer;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/floatingActionButton.html b/docs/widgets/ResponsiveScaffold/floatingActionButton.html new file mode 100644 index 000000000..3af7adbb6 --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/floatingActionButton.html @@ -0,0 +1,161 @@ + + + + + + + + floatingActionButton property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              floatingActionButton
              + +
              + +
              + + + + +
              +
              + +

              floatingActionButton property + Null safety +

              + +
              + Widget? + floatingActionButton +
              final
              + +
              + +
              +

              The Floating Action Button.

              +

              Currently, the position does not change based on layout.

              +
              + + +
              +

              Implementation

              +
              final Widget? floatingActionButton;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/floatingActionButtonLocation.html b/docs/widgets/ResponsiveScaffold/floatingActionButtonLocation.html new file mode 100644 index 000000000..c8a26bbd8 --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/floatingActionButtonLocation.html @@ -0,0 +1,160 @@ + + + + + + + + floatingActionButtonLocation property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              floatingActionButtonLocation
              + +
              + +
              + + + + +
              +
              + +

              floatingActionButtonLocation property + Null safety +

              + +
              + FloatingActionButtonLocation? + floatingActionButtonLocation +
              final
              + +
              + +
              +

              The location of the floating action button.

              +
              + + +
              +

              Implementation

              +
              final FloatingActionButtonLocation? floatingActionButtonLocation;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/hasNavBar.html b/docs/widgets/ResponsiveScaffold/hasNavBar.html new file mode 100644 index 000000000..99724f7d7 --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/hasNavBar.html @@ -0,0 +1,165 @@ + + + + + + + + hasNavBar property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              hasNavBar
              + +
              + +
              + + + + +
              +
              + +

              hasNavBar property + Null safety +

              + + + +
              + +
              + bool + hasNavBar + + +
              + + +
              +

              Whether this widget is being used with a navigation bar.

              +
              + + +
              +

              Implementation

              +
              bool get hasNavBar => navItems != null;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/navIndex.html b/docs/widgets/ResponsiveScaffold/navIndex.html new file mode 100644 index 000000000..02ce756d3 --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/navIndex.html @@ -0,0 +1,160 @@ + + + + + + + + navIndex property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              navIndex
              + +
              + +
              + + + + +
              +
              + +

              navIndex property + Null safety +

              + +
              + int? + navIndex +
              final
              + +
              + +
              +

              The index of the current navigation item in navItems.

              +
              + + +
              +

              Implementation

              +
              final int? navIndex;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/navItems.html b/docs/widgets/ResponsiveScaffold/navItems.html new file mode 100644 index 000000000..6a5c64b5d --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/navItems.html @@ -0,0 +1,165 @@ + + + + + + + + navItems property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              navItems
              + +
              + +
              + + + + +
              +
              + +

              navItems property + Null safety +

              + +
              + List<NavigationItem>? + navItems +
              final
              + +
              + +
              +

              The navigation items.

              +

              On phones, these will be in a BottomNavigationBar. On tablets, these +will be in a NavigationRail. On desktops, these should be included in +drawer instead.

              +

              On phones and tablets, so that the items do not appear twice, provide a +secondaryDrawer that does not include these items.

              +
              + + +
              +

              Implementation

              +
              final List<NavigationItem>? navItems;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/onNavIndexChanged.html b/docs/widgets/ResponsiveScaffold/onNavIndexChanged.html new file mode 100644 index 000000000..b2a5f075e --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/onNavIndexChanged.html @@ -0,0 +1,160 @@ + + + + + + + + onNavIndexChanged property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              onNavIndexChanged
              + +
              + +
              + + + + +
              +
              + +

              onNavIndexChanged property + Null safety +

              + +
              + ValueChanged<int>? + onNavIndexChanged +
              final
              + +
              + +
              +

              A callback for when the user selects a navigation item.

              +
              + + +
              +

              Implementation

              +
              final ValueChanged<int>? onNavIndexChanged;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/secondaryDrawer.html b/docs/widgets/ResponsiveScaffold/secondaryDrawer.html new file mode 100644 index 000000000..c43de608c --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/secondaryDrawer.html @@ -0,0 +1,165 @@ + + + + + + + + secondaryDrawer property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              secondaryDrawer
              + +
              + +
              + + + + +
              +
              + +

              secondaryDrawer property + Null safety +

              + +
              + Widget? + secondaryDrawer +
              final
              + +
              + +
              +

              The secondary, more compact, navigation drawer.

              +

              When there are primary navigation items, it is recommended not to include +them in the drawer, as that may confuse your users. Instead, provide two +drawers, one with them and the other, without.

              +

              This field should exclude all navigation items that are in navItems, +whereas drawer should include them.

              +
              + + +
              +

              Implementation

              +
              final Widget? secondaryDrawer;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveScaffold/sideSheet.html b/docs/widgets/ResponsiveScaffold/sideSheet.html new file mode 100644 index 000000000..bc89464ac --- /dev/null +++ b/docs/widgets/ResponsiveScaffold/sideSheet.html @@ -0,0 +1,163 @@ + + + + + + + + sideSheet property - ResponsiveScaffold class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              sideSheet
              + +
              + +
              + + + + +
              +
              + +

              sideSheet property + Null safety +

              + +
              + Widget? + sideSheet +
              final
              + +
              + +
              +

              The side sheet.

              +

              On larger screens (tablets and desktops), this will be a standard +(persistent) side sheet. On smaller screens, this will be modal.

              +

              See LayoutInfo.hasStandardSideSheet.

              +
              + + +
              +

              Implementation

              +
              final Widget? sideSheet;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ResponsiveWidgetBuilder.html b/docs/widgets/ResponsiveWidgetBuilder.html new file mode 100644 index 000000000..afd8bc348 --- /dev/null +++ b/docs/widgets/ResponsiveWidgetBuilder.html @@ -0,0 +1,171 @@ + + + + + + + + ResponsiveWidgetBuilder typedef - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ResponsiveWidgetBuilder
              + +
              + +
              + + + + +
              +
              + +

              ResponsiveWidgetBuilder typedef + Null safety + +

              + +
              + + + +Widget +ResponsiveWidgetBuilder(
              1. BuildContext,
              2. +
              3. LayoutInfo,
              4. +
              5. Widget?
              6. +
              ) + + +
              + + +
              +

              A function that returns a widget that depends on a LayoutInfo.

              +

              Used by ResponsiveBuilder.

              +
              + + +
              +

              Implementation

              +
              typedef ResponsiveWidgetBuilder =
              +	Widget Function(BuildContext, LayoutInfo, Widget?);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ScoreUpdaterState-class.html b/docs/widgets/ScoreUpdaterState-class.html new file mode 100644 index 000000000..f32808cb9 --- /dev/null +++ b/docs/widgets/ScoreUpdaterState-class.html @@ -0,0 +1,552 @@ + + + + + + + + ScoreUpdaterState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ScoreUpdaterState
              + +
              + +
              + + + + +
              +
              + +

              ScoreUpdaterState class + Null safety + +

              + + +
              +

              The state for SportsScoreUpdater.

              +

              Needed to keep the state of the TextEditingControllers.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + ScoreUpdaterState() +
              +
              + +
              +
              +
              + +
              +

              Properties

              + +
              +
              + context + BuildContext + +
              +
              + The location in the tree where this widget builds. [...] +
              read-only, inherited
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              read-only, inherited
              + +
              + +
              + mounted + → bool + +
              +
              + Whether this State object is currently in a tree. [...] +
              read-only, inherited
              + +
              + +
              + otherController + TextEditingController + +
              +
              + The controller for the opponent's score TextField/ +
              final
              + +
              + +
              + otherScore + ↔ int? + +
              +
              + The value of otherController as a number. +
              read / write
              + +
              + +
              + ramazController + TextEditingController + +
              +
              + The controller for the Ramaz score TextField/ +
              final
              + +
              + +
              + ramazScore + ↔ int? + +
              +
              + The value of ramazController as a number. +
              read / write
              + +
              + +
              + ready + → bool + +
              +
              + Whether scores is valid and ready to submit. +
              read-only
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              + scores + Scores + +
              +
              + The Scores object represented by this widget. +
              read-only
              + +
              + +
              + widget + SportsScoreUpdater + +
              +
              + The current configuration. [...] +
              read-only, inherited
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + deactivate() + → void + + + +
              +
              + Called when this object is removed from the tree. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + didChangeDependencies() + → void + + + +
              +
              + Called when a dependency of this State object changes. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + didUpdateWidget(covariant SportsScoreUpdater oldWidget) + → void + + + +
              +
              + Called whenever the widget configuration changes. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + dispose() + → void + + + +
              +
              + Called when this object is removed from the tree permanently. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + initState() + → void + + + +
              +
              + Called when this object is inserted into the tree. [...] +
              override
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + reassemble() + → void + + + +
              +
              + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + setState(VoidCallback fn) + → void + + + +
              +
              + Notify the framework that the internal state of this object has changed. [...] +
              @protected, inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ScoreUpdaterState/ScoreUpdaterState.html b/docs/widgets/ScoreUpdaterState/ScoreUpdaterState.html new file mode 100644 index 000000000..ff97ea78b --- /dev/null +++ b/docs/widgets/ScoreUpdaterState/ScoreUpdaterState.html @@ -0,0 +1,149 @@ + + + + + + + + ScoreUpdaterState constructor - ScoreUpdaterState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ScoreUpdaterState
              + +
              + +
              + + + + +
              +
              + +

              ScoreUpdaterState constructor + Null safety +

              + +
              + ScoreUpdaterState() +
              + + + + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ScoreUpdaterState/build.html b/docs/widgets/ScoreUpdaterState/build.html new file mode 100644 index 000000000..81d861eae --- /dev/null +++ b/docs/widgets/ScoreUpdaterState/build.html @@ -0,0 +1,305 @@ + + + + + + + + build method - ScoreUpdaterState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method in a number of different situations. For +example:

              + +

              This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

              +

              Design discussion

              +

              Why is the build method on State, and not StatefulWidget?

              +

              Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

              +

              For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

              +

              Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

              +

              Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

              +
              class MyButton extends StatefulWidget {
              +  ...
              +  final Color color;
              +
              +  @override
              +  Widget build(BuildContext context, MyButtonState state) {
              +    ... () { print("color: $color"); } ...
              +  }
              +}
              +
              +

              For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

              +

              In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

              +
              class MyButtonState extends State<MyButton> {
              +  ...
              +  @override
              +  Widget build(BuildContext context) {
              +    ... () { print("color: ${widget.color}"); } ...
              +  }
              +}
              +
              +

              Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

              +

              See also:

              +
                +
              • StatefulWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build(BuildContext context) => AlertDialog(
              +  title: const Text("Update Scores"),
              +  content: Column(
              +    mainAxisSize: MainAxisSize.min,
              +    children: [
              +      Row(
              +        mainAxisAlignment: MainAxisAlignment.center,
              +        children: [
              +          const Text("Ramaz"),
              +          const SizedBox(width: 50),
              +          Text(widget.game.opponent),
              +        ]
              +      ),
              +      const SizedBox(height: 20),
              +      Row(
              +        mainAxisAlignment: MainAxisAlignment.center,
              +        children: [
              +          SizedBox(
              +            width: 20,
              +            child: TextField(
              +              controller: ramazController,
              +              onChanged: (String score) => setState(
              +                () => ramazScore = int.tryParse(score)
              +              ),
              +              keyboardType: TextInputType.number,
              +            )
              +          ),
              +          const SizedBox(width: 50),
              +          SizedBox(
              +            width: 20,
              +            child: TextField(
              +              controller: otherController,
              +              onChanged: (String score) => setState(
              +                () => otherScore = int.tryParse(score)
              +              ),
              +              keyboardType: TextInputType.number,
              +            )
              +          ),
              +        ]
              +      )
              +    ]
              +  ),
              +  actions: [
              +    TextButton(
              +      onPressed: () => Navigator.of(context).pop(),
              +      child: const Text("Cancel"),
              +    ),
              +    ElevatedButton(
              +      onPressed: !ready ? null : () => Navigator.of(context).pop(scores),
              +      child: const Text("Save"),
              +    )
              +  ]
              +);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ScoreUpdaterState/initState.html b/docs/widgets/ScoreUpdaterState/initState.html new file mode 100644 index 000000000..50701666a --- /dev/null +++ b/docs/widgets/ScoreUpdaterState/initState.html @@ -0,0 +1,196 @@ + + + + + + + + initState method - ScoreUpdaterState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              initState
              + +
              + +
              + + + + +
              +
              + +

              initState method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +void +initState() + +
              override
              + +
              + +
              +

              Called when this object is inserted into the tree.

              +

              The framework will call this method exactly once for each State object +it creates.

              +

              Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

              +

              If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

              +
                +
              • In initState, subscribe to the object.
              • +
              • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
              • +
              • In dispose, unsubscribe from the object.
              • +
              +

              You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

              +

              If you override this, make sure your method starts with a call to +super.initState().

              +
              + + + +
              +

              Implementation

              +
              @override
              +void initState() {
              +  super.initState();
              +  ramazController.text = widget.game.scores?.ramazScore.toString() ?? "";
              +  otherController.text = widget.game.scores?.otherScore.toString() ?? "";
              +  ramazScore = int.tryParse(ramazController.text);
              +  otherScore = int.tryParse(otherController.text);
              +}
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ScoreUpdaterState/otherController.html b/docs/widgets/ScoreUpdaterState/otherController.html new file mode 100644 index 000000000..cdbce3fd3 --- /dev/null +++ b/docs/widgets/ScoreUpdaterState/otherController.html @@ -0,0 +1,159 @@ + + + + + + + + otherController property - ScoreUpdaterState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              otherController
              + +
              + +
              + + + + +
              +
              + +

              otherController property + Null safety +

              + +
              + TextEditingController + otherController +
              final
              + +
              + +
              +

              The controller for the opponent's score TextField/

              +
              + + +
              +

              Implementation

              +
              final TextEditingController otherController = TextEditingController();
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ScoreUpdaterState/otherScore.html b/docs/widgets/ScoreUpdaterState/otherScore.html new file mode 100644 index 000000000..ba0c136ce --- /dev/null +++ b/docs/widgets/ScoreUpdaterState/otherScore.html @@ -0,0 +1,159 @@ + + + + + + + + otherScore property - ScoreUpdaterState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              otherScore
              + +
              + +
              + + + + +
              +
              + +

              otherScore property + Null safety +

              + +
              + int? + otherScore +
              read / write
              + +
              + +
              +

              The value of otherController as a number.

              +
              + + +
              +

              Implementation

              +
              int? otherScore;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ScoreUpdaterState/ramazController.html b/docs/widgets/ScoreUpdaterState/ramazController.html new file mode 100644 index 000000000..6c423bbc7 --- /dev/null +++ b/docs/widgets/ScoreUpdaterState/ramazController.html @@ -0,0 +1,159 @@ + + + + + + + + ramazController property - ScoreUpdaterState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ramazController
              + +
              + +
              + + + + +
              +
              + +

              ramazController property + Null safety +

              + +
              + TextEditingController + ramazController +
              final
              + +
              + +
              +

              The controller for the Ramaz score TextField/

              +
              + + +
              +

              Implementation

              +
              final TextEditingController ramazController = TextEditingController();
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ScoreUpdaterState/ramazScore.html b/docs/widgets/ScoreUpdaterState/ramazScore.html new file mode 100644 index 000000000..06fd8cc46 --- /dev/null +++ b/docs/widgets/ScoreUpdaterState/ramazScore.html @@ -0,0 +1,159 @@ + + + + + + + + ramazScore property - ScoreUpdaterState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ramazScore
              + +
              + +
              + + + + +
              +
              + +

              ramazScore property + Null safety +

              + +
              + int? + ramazScore +
              read / write
              + +
              + +
              +

              The value of ramazController as a number.

              +
              + + +
              +

              Implementation

              +
              int? ramazScore;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ScoreUpdaterState/ready.html b/docs/widgets/ScoreUpdaterState/ready.html new file mode 100644 index 000000000..48c5af058 --- /dev/null +++ b/docs/widgets/ScoreUpdaterState/ready.html @@ -0,0 +1,167 @@ + + + + + + + + ready property - ScoreUpdaterState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ready
              + +
              + +
              + + + + +
              +
              + +

              ready property + Null safety +

              + + + +
              + +
              + bool + ready + + +
              + + +
              +

              Whether scores is valid and ready to submit.

              +
              + + +
              +

              Implementation

              +
              bool get ready => ramazController.text.isNotEmpty &&
              +  otherController.text.isNotEmpty &&
              +  ramazScore != null &&
              +  otherScore != null;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ScoreUpdaterState/scores.html b/docs/widgets/ScoreUpdaterState/scores.html new file mode 100644 index 000000000..bea2a7d20 --- /dev/null +++ b/docs/widgets/ScoreUpdaterState/scores.html @@ -0,0 +1,168 @@ + + + + + + + + scores property - ScoreUpdaterState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              scores
              + +
              + +
              + + + + +
              +
              + +

              scores property + Null safety +

              + + + +
              + +
              + Scores + scores + + +
              + + +
              +

              The Scores object represented by this widget.

              +
              + + +
              +

              Implementation

              +
              Scores get scores => Scores(
              +  ramazScore: ramazScore!,  // only called if [ready] == true
              +  otherScore: otherScore!,  // only called if [ready] == true
              +  isHome: widget.game.isHome
              +);
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SpecialTile-class.html b/docs/widgets/SpecialTile-class.html new file mode 100644 index 000000000..969b64566 --- /dev/null +++ b/docs/widgets/SpecialTile-class.html @@ -0,0 +1,427 @@ + + + + + + + + SpecialTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              SpecialTile
              + +
              + +
              + + + + +
              +
              + +

              SpecialTile class + Null safety + +

              + + +
              +

              A decorative border around a special addition to NextClass.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + SpecialTile({required Widget child}) +
              +
              + Creates a decorative border. +
              const
              +
              +
              +
              + +
              +

              Properties

              + +
              +
              + child + Widget + +
              +
              + The widget to go inside the border. +
              final
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + createElement() + StatelessElement + + + +
              +
              + Creates a StatelessElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SpecialTile/SpecialTile.html b/docs/widgets/SpecialTile/SpecialTile.html new file mode 100644 index 000000000..c6f159a2a --- /dev/null +++ b/docs/widgets/SpecialTile/SpecialTile.html @@ -0,0 +1,147 @@ + + + + + + + + SpecialTile constructor - SpecialTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              SpecialTile
              + +
              + +
              + + + + +
              +
              + +

              SpecialTile constructor + Null safety +

              + +
              const + SpecialTile(
              1. {required Widget child}
              2. +
              ) +
              + + +
              +

              Creates a decorative border.

              +
              + + + +
              +

              Implementation

              +
              const SpecialTile({required this.child});
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SpecialTile/build.html b/docs/widgets/SpecialTile/build.html new file mode 100644 index 000000000..40664f3ff --- /dev/null +++ b/docs/widgets/SpecialTile/build.html @@ -0,0 +1,201 @@ + + + + + + + + build method - SpecialTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

              +

              The implementation of this method must only depend on:

              + +

              If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

              +

              See also:

              +
                +
              • StatelessWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build (BuildContext context) => Padding (
              +	padding: const EdgeInsets.symmetric(horizontal: 10),
              +	child: Container (
              +		foregroundDecoration: ShapeDecoration(
              +			shape: RoundedRectangleBorder(
              +				side: BorderSide(color: Theme.of(context).primaryColor),
              +				borderRadius: BorderRadius.circular(20),
              +			)
              +		),
              +		child: child,
              +	)
              +);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SpecialTile/child.html b/docs/widgets/SpecialTile/child.html new file mode 100644 index 000000000..c9b40d856 --- /dev/null +++ b/docs/widgets/SpecialTile/child.html @@ -0,0 +1,149 @@ + + + + + + + + child property - SpecialTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              child
              + +
              + +
              + + + + +
              +
              + +

              child property + Null safety +

              + +
              + Widget + child +
              final
              + +
              + +
              +

              The widget to go inside the border.

              +
              + + +
              +

              Implementation

              +
              final Widget child;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons-class.html b/docs/widgets/SportsIcons-class.html new file mode 100644 index 000000000..7b3b02c69 --- /dev/null +++ b/docs/widgets/SportsIcons-class.html @@ -0,0 +1,376 @@ + + + + + + + + SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              SportsIcons
              + +
              + +
              + + + + +
              +
              + +

              SportsIcons class + Null safety + +

              + + +
              +

              A collection of icons for sports.

              +

              These icons are Strings so that the background color of the icon can be +determined in the build method.

              +
              + + + +
              +

              Constructors

              + +
              +
              + SportsIcons() +
              +
              + +
              +
              +
              + +
              +

              Properties

              + +
              +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              read-only, inherited
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toString() + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              inherited
              + +
              + +
              +
              + + + +
              +

              Constants

              + +
              +
              + baseball + → const ImageProvider<Object> + + +
              +
              + A baseball icon. + + +
              + AssetImage("images/icons/baseball.png") +
              +
              + +
              + basketball + → const ImageProvider<Object> + + +
              +
              + A basketball icon. + + +
              + AssetImage("images/icons/basketball.png") +
              +
              + +
              + hockey + → const ImageProvider<Object> + + +
              +
              + A hockey icon. + + +
              + AssetImage("images/icons/hockey.png") +
              +
              + +
              + soccer + → const ImageProvider<Object> + + +
              +
              + A soccer icon. + + +
              + AssetImage("images/icons/soccer.png") +
              +
              + +
              + tennis + → const ImageProvider<Object> + + +
              +
              + A tennis icon. + + +
              + AssetImage("images/icons/tennis.png") +
              +
              + +
              + volleyball + → const ImageProvider<Object> + + +
              +
              + A volleyball icon. + + +
              + AssetImage("images/icons/volleyball.png") +
              +
              + +
              +
              + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/SportsIcons.html b/docs/widgets/SportsIcons/SportsIcons.html new file mode 100644 index 000000000..794ef97bb --- /dev/null +++ b/docs/widgets/SportsIcons/SportsIcons.html @@ -0,0 +1,136 @@ + + + + + + + + SportsIcons constructor - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              SportsIcons
              + +
              + +
              + + + + +
              +
              + +

              SportsIcons constructor + Null safety +

              + +
              + SportsIcons() +
              + + + + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/baseball-constant.html b/docs/widgets/SportsIcons/baseball-constant.html new file mode 100644 index 000000000..de937d5a2 --- /dev/null +++ b/docs/widgets/SportsIcons/baseball-constant.html @@ -0,0 +1,146 @@ + + + + + + + + baseball constant - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              baseball
              + +
              + +
              + + + + +
              +
              + +

              baseball constant + Null safety +

              + +
              + ImageProvider<Object> + const baseball + + +
              + +
              +

              A baseball icon.

              +
              + + +
              +

              Implementation

              +
              static const ImageProvider baseball = AssetImage("images/icons/baseball.png");
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/basketball-constant.html b/docs/widgets/SportsIcons/basketball-constant.html new file mode 100644 index 000000000..6a560ec25 --- /dev/null +++ b/docs/widgets/SportsIcons/basketball-constant.html @@ -0,0 +1,146 @@ + + + + + + + + basketball constant - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              basketball
              + +
              + +
              + + + + +
              +
              + +

              basketball constant + Null safety +

              + +
              + ImageProvider<Object> + const basketball + + +
              + +
              +

              A basketball icon.

              +
              + + +
              +

              Implementation

              +
              static const ImageProvider basketball = AssetImage("images/icons/basketball.png");
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/hashCode.html b/docs/widgets/SportsIcons/hashCode.html new file mode 100644 index 000000000..ce57cfe43 --- /dev/null +++ b/docs/widgets/SportsIcons/hashCode.html @@ -0,0 +1,175 @@ + + + + + + + + hashCode property - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              hashCode
              + +
              + +
              + + + + +
              +
              +

              hashCode property + Null safety +

              + + + +
              + +
              + int + hashCode +
              inherited
              + +
              + + +
              +

              The hash code for this object.

              +

              A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

              +

              All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

              +

              If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

              +

              Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

              +

              Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

              +

              If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

              +
              + + +
              +

              Implementation

              +
              external int get hashCode;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/hockey-constant.html b/docs/widgets/SportsIcons/hockey-constant.html new file mode 100644 index 000000000..df815100c --- /dev/null +++ b/docs/widgets/SportsIcons/hockey-constant.html @@ -0,0 +1,146 @@ + + + + + + + + hockey constant - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              hockey
              + +
              + +
              + + + + +
              +
              + +

              hockey constant + Null safety +

              + +
              + ImageProvider<Object> + const hockey + + +
              + +
              +

              A hockey icon.

              +
              + + +
              +

              Implementation

              +
              static const ImageProvider hockey = AssetImage("images/icons/hockey.png");
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/noSuchMethod.html b/docs/widgets/SportsIcons/noSuchMethod.html new file mode 100644 index 000000000..b3de15b81 --- /dev/null +++ b/docs/widgets/SportsIcons/noSuchMethod.html @@ -0,0 +1,183 @@ + + + + + + + + noSuchMethod method - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              noSuchMethod
              + +
              + +
              + + + + +
              +
              +

              noSuchMethod method + Null safety +

              + +
              + + +dynamic +noSuchMethod(
              1. Invocation invocation
              2. +
              ) + +
              inherited
              + +
              + +
              +

              Invoked when a non-existent method or property is accessed.

              +

              A dynamic member invocation can attempt to call a member which +doesn't exist on the receiving object. Example:

              +
              dynamic object = 1;
              +object.add(42); // Statically allowed, run-time error
              +
              +

              This invalid code will invoke the noSuchMethod memthod +of the integer 1 with an Invocation representing the +.add(42) call and arguments (which then throws).

              +

              Classes can override noSuchMethod to provide custom behavior +for such invalid dynamic invocations.

              +

              A class with a non-default noSuchMethod invocation can also +omit implementations for members of its interface. +Example:

              +
              class MockList<T> implements List<T> {
              +  noSuchMethod(Invocation invocation) {
              +    log(invocation);
              +    super.noSuchMethod(invocation); // Will throw.
              +  }
              +}
              +void main() {
              +  MockList().add(42);
              +}
              +
              +

              This code has no compile-time warnings or errors even though +the MockList class has no concrete implementation of +any of the List interface methods. +Calls to List methods are forwarded to noSuchMethod, +so this code will log an invocation similar to +Invocation.method(#add, [42]) and then throw.

              +

              If a value is returned from noSuchMethod, +it becomes the result of the original invocation. +If the value is not of a type that can be returned by the original +invocation, a type error occurs at the invocation.

              +

              The default behavior is to throw a NoSuchMethodError.

              +
              + + + +
              +

              Implementation

              +
              @pragma("vm:entry-point")
              +external dynamic noSuchMethod(Invocation invocation);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/operator_equals.html b/docs/widgets/SportsIcons/operator_equals.html new file mode 100644 index 000000000..dc148e629 --- /dev/null +++ b/docs/widgets/SportsIcons/operator_equals.html @@ -0,0 +1,174 @@ + + + + + + + + operator == method - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              operator ==
              + +
              + +
              + + + + +
              +
              +

              operator == method + Null safety +

              + +
              + + +bool +operator ==(
              1. Object other
              2. +
              ) + +
              inherited
              + +
              + +
              +

              The equality operator.

              +

              The default behavior for all Objects is to return true if and +only if this object and other are the same object.

              +

              Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

              +
                +
              • +

                Total: It must return a boolean for all arguments. It should never throw.

                +
              • +
              • +

                Reflexive: For all objects o, o == o must be true.

                +
              • +
              • +

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

                +
              • +
              • +

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

                +
              • +
              +

              The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

              +

              If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

              +
              + + + +
              +

              Implementation

              +
              external bool operator ==(Object other);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/runtimeType.html b/docs/widgets/SportsIcons/runtimeType.html new file mode 100644 index 000000000..386e004ef --- /dev/null +++ b/docs/widgets/SportsIcons/runtimeType.html @@ -0,0 +1,150 @@ + + + + + + + + runtimeType property - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              runtimeType
              + +
              + +
              + + + + +
              +
              +

              runtimeType property + Null safety +

              + + + +
              + +
              + Type + runtimeType +
              inherited
              + +
              + + +
              +

              A representation of the runtime type of the object.

              +
              + + +
              +

              Implementation

              +
              external Type get runtimeType;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/soccer-constant.html b/docs/widgets/SportsIcons/soccer-constant.html new file mode 100644 index 000000000..1f65f761b --- /dev/null +++ b/docs/widgets/SportsIcons/soccer-constant.html @@ -0,0 +1,146 @@ + + + + + + + + soccer constant - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              soccer
              + +
              + +
              + + + + +
              +
              + +

              soccer constant + Null safety +

              + +
              + ImageProvider<Object> + const soccer + + +
              + +
              +

              A soccer icon.

              +
              + + +
              +

              Implementation

              +
              static const ImageProvider soccer = AssetImage("images/icons/soccer.png");
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/tennis-constant.html b/docs/widgets/SportsIcons/tennis-constant.html new file mode 100644 index 000000000..c8ff2068a --- /dev/null +++ b/docs/widgets/SportsIcons/tennis-constant.html @@ -0,0 +1,146 @@ + + + + + + + + tennis constant - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              tennis
              + +
              + +
              + + + + +
              +
              + +

              tennis constant + Null safety +

              + +
              + ImageProvider<Object> + const tennis + + +
              + +
              +

              A tennis icon.

              +
              + + +
              +

              Implementation

              +
              static const ImageProvider tennis = AssetImage("images/icons/tennis.png");
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/toString.html b/docs/widgets/SportsIcons/toString.html new file mode 100644 index 000000000..8e63dcbbe --- /dev/null +++ b/docs/widgets/SportsIcons/toString.html @@ -0,0 +1,156 @@ + + + + + + + + toString method - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              toString
              + +
              + +
              + + + + +
              +
              +

              toString method + Null safety +

              + +
              + + +String +toString() + +
              inherited
              + +
              + +
              +

              A string representation of this object.

              +

              Some classes have a default textual representation, +often paired with a static parse function (like int.parse). +These classes will provide the textual representation as +their string represetion.

              +

              Other classes have no meaningful textual representation +that a program will care about. +Such classes will typically override toString to provide +useful information when inspecting the object, +mainly for debugging or logging.

              +
              + + + +
              +

              Implementation

              +
              external String toString();
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsIcons/volleyball-constant.html b/docs/widgets/SportsIcons/volleyball-constant.html new file mode 100644 index 000000000..698baca53 --- /dev/null +++ b/docs/widgets/SportsIcons/volleyball-constant.html @@ -0,0 +1,146 @@ + + + + + + + + volleyball constant - SportsIcons class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              volleyball
              + +
              + +
              + + + + +
              +
              + +

              volleyball constant + Null safety +

              + +
              + ImageProvider<Object> + const volleyball + + +
              + +
              +

              A volleyball icon.

              +
              + + +
              +

              Implementation

              +
              static const ImageProvider volleyball = AssetImage("images/icons/volleyball.png");
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsScoreUpdater-class.html b/docs/widgets/SportsScoreUpdater-class.html new file mode 100644 index 000000000..08f19cbde --- /dev/null +++ b/docs/widgets/SportsScoreUpdater-class.html @@ -0,0 +1,448 @@ + + + + + + + + SportsScoreUpdater class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              SportsScoreUpdater
              + +
              + +
              + + + + +
              +
              + +

              SportsScoreUpdater class + Null safety + +

              + + +
              +

              A dialog to update the scores for a SportsGame.

              +

              Use SportsScoreUpdater.updateScores to display this widget.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + SportsScoreUpdater(SportsGame game) +
              +
              + Creates a widget to get the scores for game from the user. +
              const
              +
              +
              +
              + +
              +

              Properties

              + +
              +
              + game + SportsGame + +
              +
              + The game being edited. [...] +
              final
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + createElement() + StatefulElement + + + +
              +
              + Creates a StatefulElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + createState() + ScoreUpdaterState + + + +
              +
              + Creates the mutable state for this widget at a given location in the tree. [...] +
              override
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + +
              +

              Static Methods

              +
              +
              + updateScores(BuildContext context, SportsGame game) + → Future<Scores?> + + + +
              +
              + Opens a dialog to prompt the user for the scores of the game. [...] + + +
              + +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsScoreUpdater/SportsScoreUpdater.html b/docs/widgets/SportsScoreUpdater/SportsScoreUpdater.html new file mode 100644 index 000000000..c7bf3ee24 --- /dev/null +++ b/docs/widgets/SportsScoreUpdater/SportsScoreUpdater.html @@ -0,0 +1,149 @@ + + + + + + + + SportsScoreUpdater constructor - SportsScoreUpdater class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              SportsScoreUpdater
              + +
              + +
              + + + + +
              +
              + +

              SportsScoreUpdater constructor + Null safety +

              + +
              const + SportsScoreUpdater(
              1. SportsGame game
              2. +
              ) +
              + + +
              +

              Creates a widget to get the scores for game from the user.

              +
              + + + +
              +

              Implementation

              +
              const SportsScoreUpdater(this.game);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsScoreUpdater/createState.html b/docs/widgets/SportsScoreUpdater/createState.html new file mode 100644 index 000000000..c61106e44 --- /dev/null +++ b/docs/widgets/SportsScoreUpdater/createState.html @@ -0,0 +1,171 @@ + + + + + + + + createState method - SportsScoreUpdater class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              createState
              + +
              + +
              + + + + +
              +
              + +

              createState method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +ScoreUpdaterState +createState() + +
              override
              + +
              + +
              +

              Creates the mutable state for this widget at a given location in the tree.

              +

              Subclasses should override this method to return a newly created +instance of their associated State subclass:

              +
              @override
              +_MyState createState() => _MyState();
              +
              +

              The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

              +
              + + + +
              +

              Implementation

              +
              @override
              +ScoreUpdaterState createState() => ScoreUpdaterState();
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsScoreUpdater/game.html b/docs/widgets/SportsScoreUpdater/game.html new file mode 100644 index 000000000..d85e4cb54 --- /dev/null +++ b/docs/widgets/SportsScoreUpdater/game.html @@ -0,0 +1,152 @@ + + + + + + + + game property - SportsScoreUpdater class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              game
              + +
              + +
              + + + + +
              +
              + +

              game property + Null safety +

              + +
              + SportsGame + game +
              final
              + +
              + +
              +

              The game being edited.

              +

              SportsGame.isHome is used to fill Scores.isHome.

              +
              + + +
              +

              Implementation

              +
              final SportsGame game;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsScoreUpdater/updateScores.html b/docs/widgets/SportsScoreUpdater/updateScores.html new file mode 100644 index 000000000..391cd47cc --- /dev/null +++ b/docs/widgets/SportsScoreUpdater/updateScores.html @@ -0,0 +1,162 @@ + + + + + + + + updateScores method - SportsScoreUpdater class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              updateScores
              + +
              + +
              + + + + +
              +
              + +

              updateScores method + Null safety +

              + +
              + + +Future<Scores?> +updateScores(
              1. BuildContext context,
              2. +
              3. SportsGame game
              4. +
              ) + + + +
              + +
              +

              Opens a dialog to prompt the user for the scores of the game.

              +

              Returns the scores as inputted.

              +
              + + + +
              +

              Implementation

              +
              static Future<Scores?> updateScores(
              +	BuildContext context,
              +	SportsGame game
              +	) => showDialog<Scores>(
              +  context: context,
              +  builder: (_) => SportsScoreUpdater(game),
              +);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsStats-class.html b/docs/widgets/SportsStats-class.html new file mode 100644 index 000000000..99aa0ade4 --- /dev/null +++ b/docs/widgets/SportsStats-class.html @@ -0,0 +1,452 @@ + + + + + + + + SportsStats class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              SportsStats
              + +
              + +
              + + + + +
              +
              + +

              SportsStats class + Null safety + +

              + + +
              +

              A row in a SportsTile that displays a team, their score, +and a part of the date.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + SportsStats({required String team, required String dateTime, int? score}) +
              +
              + Creates a row to represent some stats in a SportsTile. +
              const
              +
              +
              +
              + +
              +

              Properties

              + +
              +
              + dateTime + → String + +
              +
              + The date or time. [...] +
              final
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              + score + → int? + +
              +
              + The score for team. +
              final
              + +
              + +
              + team + → String + +
              +
              + The team being represented. +
              final
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + createElement() + StatelessElement + + + +
              +
              + Creates a StatelessElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsStats/SportsStats.html b/docs/widgets/SportsStats/SportsStats.html new file mode 100644 index 000000000..704f19125 --- /dev/null +++ b/docs/widgets/SportsStats/SportsStats.html @@ -0,0 +1,155 @@ + + + + + + + + SportsStats constructor - SportsStats class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              SportsStats
              + +
              + +
              + + + + +
              +
              + +

              SportsStats constructor + Null safety +

              + +
              const + SportsStats(
              1. {required String team,
              2. +
              3. required String dateTime,
              4. +
              5. int? score}
              6. +
              ) +
              + + +
              +

              Creates a row to represent some stats in a SportsTile.

              +
              + + + +
              +

              Implementation

              +
              const SportsStats({
              +  required this.team,
              +  required this.dateTime,
              +  this.score,
              +});
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsStats/build.html b/docs/widgets/SportsStats/build.html new file mode 100644 index 000000000..2a8820fdc --- /dev/null +++ b/docs/widgets/SportsStats/build.html @@ -0,0 +1,202 @@ + + + + + + + + build method - SportsStats class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

              +

              The implementation of this method must only depend on:

              + +

              If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

              +

              See also:

              +
                +
              • StatelessWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build(BuildContext context) => Row(
              +  mainAxisAlignment: MainAxisAlignment.spaceBetween,
              +  children: [
              +    Text(team),
              +    const Spacer(flex: 2),
              +    Text(score?.toString() ?? ""),
              +    const Spacer(flex: 3),
              +    Text(dateTime),
              +    const Spacer(),
              +  ]
              +);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsStats/dateTime.html b/docs/widgets/SportsStats/dateTime.html new file mode 100644 index 000000000..21c598899 --- /dev/null +++ b/docs/widgets/SportsStats/dateTime.html @@ -0,0 +1,154 @@ + + + + + + + + dateTime property - SportsStats class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              dateTime
              + +
              + +
              + + + + +
              +
              + +

              dateTime property + Null safety +

              + +
              + String + dateTime +
              final
              + +
              + +
              +

              The date or time.

              +

              There are two SportsStats in a SportsTile. The top one shows the date, +and the bottom one shows the time.

              +

              This type is a String so it can represent both.

              +
              + + +
              +

              Implementation

              +
              final String dateTime;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsStats/score.html b/docs/widgets/SportsStats/score.html new file mode 100644 index 000000000..265ee570a --- /dev/null +++ b/docs/widgets/SportsStats/score.html @@ -0,0 +1,151 @@ + + + + + + + + score property - SportsStats class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              score
              + +
              + +
              + + + + +
              +
              + +

              score property + Null safety +

              + +
              + int? + score +
              final
              + +
              + +
              +

              The score for team.

              +
              + + +
              +

              Implementation

              +
              final int? score;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsStats/team.html b/docs/widgets/SportsStats/team.html new file mode 100644 index 000000000..3be4a99d9 --- /dev/null +++ b/docs/widgets/SportsStats/team.html @@ -0,0 +1,151 @@ + + + + + + + + team property - SportsStats class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              team
              + +
              + +
              + + + + +
              +
              + +

              team property + Null safety +

              + +
              + String + team +
              final
              + +
              + +
              +

              The team being represented.

              +
              + + +
              +

              Implementation

              +
              final String team;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsTile-class.html b/docs/widgets/SportsTile-class.html new file mode 100644 index 000000000..42788146a --- /dev/null +++ b/docs/widgets/SportsTile-class.html @@ -0,0 +1,500 @@ + + + + + + + + SportsTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              SportsTile
              + +
              + +
              + + + + +
              +
              + +

              SportsTile class + Null safety + +

              + + +
              +

              A widget to represent a SportsGame.

              +

              If onTap is not null, tapping on the card will allow the user to +input new scores. To keep layers modular, and to be more flexible, +the logic for what to do with game, as well as determining if the user +has the right permissions, is kept separate from this widget.

              +

              Instead, a pass onTap to SportsTile().

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + SportsTile(SportsGame game, {VoidCallback? onTap}) +
              +
              + Creates a widget to display a SportsGame. +
              const
              +
              +
              +
              + +
              +

              Properties

              + +
              +
              + cardColor + Color? + +
              +
              + The color of this widget. [...] +
              read-only
              + +
              + +
              + game + SportsGame + +
              +
              + The game for this widget to represent. +
              final
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + icon + ImageProvider<Object> + +
              +
              + Retrieves the icon for game.sport. [...] +
              read-only
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + +
              + onTap + VoidCallback? + +
              +
              + What to do when the user taps this tile. [...] +
              final
              + +
              + +
              + padLength + → int + +
              +
              + Determines how long to pad the team names so they align. +
              read-only
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + createElement() + StatelessElement + + + +
              +
              + Creates a StatelessElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + +
              +

              Static Methods

              +
              +
              + formatDate(DateTime? date) + → String + + + +
              +
              + Formats date into month-day-year form. + + +
              + +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsTile/SportsTile.html b/docs/widgets/SportsTile/SportsTile.html new file mode 100644 index 000000000..26bcf37a1 --- /dev/null +++ b/docs/widgets/SportsTile/SportsTile.html @@ -0,0 +1,154 @@ + + + + + + + + SportsTile constructor - SportsTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              SportsTile
              + +
              + +
              + + + + +
              +
              + +

              SportsTile constructor + Null safety +

              + +
              const + SportsTile(
              1. SportsGame game,
              2. +
              3. {VoidCallback? onTap}
              4. +
              ) +
              + + +
              +

              Creates a widget to display a SportsGame.

              +
              + + + +
              +

              Implementation

              +
              const SportsTile(this.game, {this.onTap});
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsTile/build.html b/docs/widgets/SportsTile/build.html new file mode 100644 index 000000000..3934460c6 --- /dev/null +++ b/docs/widgets/SportsTile/build.html @@ -0,0 +1,235 @@ + + + + + + + + build method - SportsTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

              +

              The implementation of this method must only depend on:

              + +

              If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

              +

              See also:

              +
                +
              • StatelessWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build(BuildContext context) => SizedBox(
              +  height: 160,
              +  child: Card(
              +    color: cardColor,
              +    child: InkWell(
              +      onTap: onTap,
              +      child: Padding(
              +        padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
              +        child: Column(
              +          children: [
              +            ListTile(
              +              leading: CircleAvatar (
              +                backgroundImage: icon,
              +                backgroundColor: cardColor ?? Theme.of(context).cardColor,
              +              ),
              +              title: Text(game.team),
              +              subtitle: Text(game.isHome
              +              	? "${game.opponent} @ Ramaz"
              +              	: "Ramaz @ ${game.opponent}"
              +            	),
              +              trailing: onTap == null ? null : const Icon(Icons.edit),
              +            ),
              +            const SizedBox(height: 20),
              +            SportsStats(
              +              team: game.awayTeam.padRight(padLength),
              +              score: game.scores?.getScore(home: false),
              +              dateTime: formatDate(game.date),
              +            ),
              +            const SizedBox(height: 10),
              +            SportsStats(
              +              team: game.homeTeam.padRight(padLength),
              +              score: game.scores?.getScore(home: true),
              +              dateTime: (game.times).toString(),
              +            ),
              +          ]
              +        )
              +      ),
              +    )
              +  )
              +);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsTile/cardColor.html b/docs/widgets/SportsTile/cardColor.html new file mode 100644 index 000000000..8ffe99f02 --- /dev/null +++ b/docs/widgets/SportsTile/cardColor.html @@ -0,0 +1,167 @@ + + + + + + + + cardColor property - SportsTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              cardColor
              + +
              + +
              + + + + +
              +
              + +

              cardColor property + Null safety +

              + + + +
              + +
              + Color? + cardColor + + +
              + + +
              +

              The color of this widget.

              +

              If Ramaz won, it's green. +If Ramaz lost, it's red. +If the game was tied, it's a light gray.

              +

              This is a great example of why the helper class Scores exists.

              +
              + + +
              +

              Implementation

              +
              Color? get cardColor => game.scores == null ? null :
              +  game.scores!.didDraw
              +			? Colors.blueGrey
              +			: (game.scores!.didWin ? Colors.lightGreen : Colors.red [400]);
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsTile/formatDate.html b/docs/widgets/SportsTile/formatDate.html new file mode 100644 index 000000000..86b7811ad --- /dev/null +++ b/docs/widgets/SportsTile/formatDate.html @@ -0,0 +1,159 @@ + + + + + + + + formatDate method - SportsTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              formatDate
              + +
              + +
              + + + + +
              +
              + +

              formatDate method + Null safety +

              + +
              + + +String +formatDate(
              1. DateTime? date
              2. +
              ) + + + +
              + +
              +

              Formats date into month-day-year form.

              +
              + + + +
              +

              Implementation

              +
              static String formatDate(DateTime? date) =>
              +  "${date?.month ?? ' '}-${date?.day ?? ' '}-${date?.year ?? ' '}";
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsTile/game.html b/docs/widgets/SportsTile/game.html new file mode 100644 index 000000000..81ef21d7b --- /dev/null +++ b/docs/widgets/SportsTile/game.html @@ -0,0 +1,155 @@ + + + + + + + + game property - SportsTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              game
              + +
              + +
              + + + + +
              +
              + +

              game property + Null safety +

              + +
              + SportsGame + game +
              final
              + +
              + +
              +

              The game for this widget to represent.

              +
              + + +
              +

              Implementation

              +
              final SportsGame game;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsTile/icon.html b/docs/widgets/SportsTile/icon.html new file mode 100644 index 000000000..3dcd22cdc --- /dev/null +++ b/docs/widgets/SportsTile/icon.html @@ -0,0 +1,174 @@ + + + + + + + + icon property - SportsTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              icon
              + +
              + +
              + + + + +
              +
              + +

              icon property + Null safety +

              + + + +
              + +
              + ImageProvider<Object> + icon + + +
              + + +
              +

              Retrieves the icon for game.sport.

              +

              This is deliberately kept as a switch-case (with no default) and not a +Map<Sport, ImageProvider> so that static analysis will report any missed +cases. This use case is especially important (as opposed to parts of the +data library which are Maps) because any error here will show up on the +screen, instead of simply sending a bug report.

              +
              + + +
              +

              Implementation

              +
              ImageProvider get icon {
              +		switch (game.sport) {
              +			case Sport.baseball: return SportsIcons.baseball;
              +			case Sport.basketball: return SportsIcons.basketball;
              +			case Sport.soccer: return SportsIcons.soccer;
              +			case Sport.hockey: return SportsIcons.hockey;
              +			case Sport.tennis: return SportsIcons.tennis;
              +			case Sport.volleyball: return SportsIcons.volleyball;
              +		}
              +	}
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsTile/onTap.html b/docs/widgets/SportsTile/onTap.html new file mode 100644 index 000000000..e744177a5 --- /dev/null +++ b/docs/widgets/SportsTile/onTap.html @@ -0,0 +1,159 @@ + + + + + + + + onTap property - SportsTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              onTap
              + +
              + +
              + + + + +
              +
              + +

              onTap property + Null safety +

              + +
              + VoidCallback? + onTap +
              final
              + +
              + +
              +

              What to do when the user taps this tile.

              +

              Only administrators should be allowed to do anything, so this function +should be null if the user is not an admin. However, what to do with +game depends on the context, so is left to the parent widget.

              +

              If this is non-null, an edit icon will be shown on this widget.

              +
              + + +
              +

              Implementation

              +
              final VoidCallback? onTap;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/SportsTile/padLength.html b/docs/widgets/SportsTile/padLength.html new file mode 100644 index 000000000..5b702e5c6 --- /dev/null +++ b/docs/widgets/SportsTile/padLength.html @@ -0,0 +1,161 @@ + + + + + + + + padLength property - SportsTile class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              padLength
              + +
              + +
              + + + + +
              +
              + +

              padLength property + Null safety +

              + + + +
              + +
              + int + padLength + + +
              + + +
              +

              Determines how long to pad the team names so they align.

              +
              + + +
              +

              Implementation

              +
              int get padLength => game.opponent.length > "Ramaz".length
              +  ? game.opponent.length : "Ramaz".length;
              +
              + +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeBuilder.html b/docs/widgets/ThemeBuilder.html new file mode 100644 index 000000000..f7cf61f1b --- /dev/null +++ b/docs/widgets/ThemeBuilder.html @@ -0,0 +1,168 @@ + + + + + + + + ThemeBuilder typedef - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ThemeBuilder
              + +
              + +
              + + + + +
              +
              + +

              ThemeBuilder typedef + Null safety + +

              + +
              + + + +Widget +ThemeBuilder(
              1. BuildContext,
              2. +
              3. ThemeData
              4. +
              ) + + +
              + + +
              +

              Builds a widget with the given theme.

              +
              + + +
              +

              Implementation

              +
              typedef ThemeBuilder = Widget Function(BuildContext, ThemeData);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChanger-class.html b/docs/widgets/ThemeChanger-class.html new file mode 100644 index 000000000..1fd50b11c --- /dev/null +++ b/docs/widgets/ThemeChanger-class.html @@ -0,0 +1,513 @@ + + + + + + + + ThemeChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ThemeChanger
              + +
              + +
              + + + + +
              +
              + +

              ThemeChanger class + Null safety + +

              + + +
              +

              A widget to change the theme.

              +

              There are three ways to change the theme:

              +
                +
              1. +

                By theme: set a new theme (as a ThemeData) with +ThemeChanger.of(context).theme = newTheme. See ThemeChangerState.theme

                +
              2. +
              3. +

                By key: pass a map of themes to ThemeChanger() as themes and call +ThemeChanger.of(context).themeName = key. See +ThemeChangerState.themeName.

                +
              4. +
              5. +

                By brightness: pass in a light theme, dark theme, and default brightness +to ThemeChanger() and call +ThemeChanger.of(context).brightness = brightness. See +ThemeChangerState.brightness.

                +
              6. +
              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + ThemeChanger({required ThemeBuilder builder, required Brightness defaultBrightness, required ThemeData light, required ThemeData dark, Map<String, ThemeData> themes = const {}}) +
              +
              + Creates a widget to change the theme. +
              const
              +
              +
              +
              + +
              +

              Properties

              + +
              +
              + builder + ThemeBuilder + +
              +
              + The function that builds the widgets from the theme. +
              final
              + +
              + +
              + dark + ThemeData + +
              +
              + The dark theme. [...] +
              final
              + +
              + +
              + defaultBrightness + Brightness + +
              +
              + The default brightness to use with light and dark. +
              final
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              @nonVirtual, read-only, inherited
              + +
              + +
              + key + Key? + +
              +
              + Controls how one widget replaces another widget in the tree. [...] +
              final, inherited
              + +
              + +
              + light + ThemeData + +
              +
              + The light theme. [...] +
              final
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              + themes + → Map<String, ThemeData> + +
              +
              + A collection of predefined themes. [...] +
              final
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + createElement() + StatefulElement + + + +
              +
              + Creates a StatefulElement to manage this widget's location in the tree. [...] +
              inherited
              + +
              + +
              + createState() + ThemeChangerState + + + +
              +
              + Creates the mutable state for this widget at a given location in the tree. [...] +
              override
              + +
              + +
              + debugDescribeChildren() + → List<DiagnosticsNode> + + + +
              +
              + Returns a list of DiagnosticsNode objects describing this node's +children. [...] +
              @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a string representation of this node and its descendants. [...] +
              inherited
              + +
              + +
              + toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) + → String + + + +
              +
              + Returns a one-line detailed description of the object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A short, textual description of this widget. +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              @nonVirtual, inherited
              + +
              + +
              +
              + + +
              +

              Static Methods

              +
              +
              + of(BuildContext context) + ThemeChangerState + + + +
              +
              + Gets the ThemeChangerState from a BuildContext. [...] + + +
              + +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChanger/ThemeChanger.html b/docs/widgets/ThemeChanger/ThemeChanger.html new file mode 100644 index 000000000..b4a76dc70 --- /dev/null +++ b/docs/widgets/ThemeChanger/ThemeChanger.html @@ -0,0 +1,163 @@ + + + + + + + + ThemeChanger constructor - ThemeChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ThemeChanger
              + +
              + +
              + + + + +
              +
              + +

              ThemeChanger constructor + Null safety +

              + +
              const + ThemeChanger(
              1. {required ThemeBuilder builder,
              2. +
              3. required Brightness defaultBrightness,
              4. +
              5. required ThemeData light,
              6. +
              7. required ThemeData dark,
              8. +
              9. Map<String, ThemeData> themes = const {}}
              10. +
              ) +
              + + +
              +

              Creates a widget to change the theme.

              +
              + + + +
              +

              Implementation

              +
              const ThemeChanger ({
              +	required this.builder,
              +	required this.defaultBrightness,
              +	required this.light,
              +	required this.dark,
              +	this.themes = const {},
              +});
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChanger/builder.html b/docs/widgets/ThemeChanger/builder.html new file mode 100644 index 000000000..976456024 --- /dev/null +++ b/docs/widgets/ThemeChanger/builder.html @@ -0,0 +1,155 @@ + + + + + + + + builder property - ThemeChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              builder
              + +
              + +
              + + + + +
              +
              + +

              builder property + Null safety +

              + +
              + ThemeBuilder + builder +
              final
              + +
              + +
              +

              The function that builds the widgets from the theme.

              +
              + + +
              +

              Implementation

              +
              final ThemeBuilder builder;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChanger/createState.html b/docs/widgets/ThemeChanger/createState.html new file mode 100644 index 000000000..1f2a9d88e --- /dev/null +++ b/docs/widgets/ThemeChanger/createState.html @@ -0,0 +1,175 @@ + + + + + + + + createState method - ThemeChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              createState
              + +
              + +
              + + + + +
              +
              + +

              createState method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +ThemeChangerState +createState() + +
              override
              + +
              + +
              +

              Creates the mutable state for this widget at a given location in the tree.

              +

              Subclasses should override this method to return a newly created +instance of their associated State subclass:

              +
              @override
              +_MyState createState() => _MyState();
              +
              +

              The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

              +
              + + + +
              +

              Implementation

              +
              @override
              +ThemeChangerState createState() => ThemeChangerState();
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChanger/dark.html b/docs/widgets/ThemeChanger/dark.html new file mode 100644 index 000000000..d98c822c4 --- /dev/null +++ b/docs/widgets/ThemeChanger/dark.html @@ -0,0 +1,157 @@ + + + + + + + + dark property - ThemeChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              dark
              + +
              + +
              + + + + +
              +
              + +

              dark property + Null safety +

              + +
              + ThemeData + dark +
              final
              + +
              + +
              +

              The dark theme.

              +

              To switch between themes, change ThemeChangerState.brightness with +ThemeChanger.of(context).brightness = newBrightness.

              +
              + + +
              +

              Implementation

              +
              final ThemeData dark;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChanger/defaultBrightness.html b/docs/widgets/ThemeChanger/defaultBrightness.html new file mode 100644 index 000000000..1e6cda6bf --- /dev/null +++ b/docs/widgets/ThemeChanger/defaultBrightness.html @@ -0,0 +1,155 @@ + + + + + + + + defaultBrightness property - ThemeChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              defaultBrightness
              + +
              + +
              + + + + +
              +
              + +

              defaultBrightness property + Null safety +

              + +
              + Brightness + defaultBrightness +
              final
              + +
              + +
              +

              The default brightness to use with light and dark.

              +
              + + +
              +

              Implementation

              +
              final Brightness defaultBrightness;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChanger/light.html b/docs/widgets/ThemeChanger/light.html new file mode 100644 index 000000000..b07ca08f9 --- /dev/null +++ b/docs/widgets/ThemeChanger/light.html @@ -0,0 +1,157 @@ + + + + + + + + light property - ThemeChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              light
              + +
              + +
              + + + + +
              +
              + +

              light property + Null safety +

              + +
              + ThemeData + light +
              final
              + +
              + +
              +

              The light theme.

              +

              To switch between themes, change ThemeChangerState.brightness with +ThemeChanger.of(context).brightness = newBrightness.

              +
              + + +
              +

              Implementation

              +
              final ThemeData light;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChanger/of.html b/docs/widgets/ThemeChanger/of.html new file mode 100644 index 000000000..23fcab6a0 --- /dev/null +++ b/docs/widgets/ThemeChanger/of.html @@ -0,0 +1,166 @@ + + + + + + + + of method - ThemeChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              of
              + +
              + +
              + + + + +
              +
              + +

              of method + Null safety +

              + +
              + + +ThemeChangerState +of(
              1. BuildContext context
              2. +
              ) + + + +
              + +
              +

              Gets the ThemeChangerState from a BuildContext.

              +

              Use this function to switch the theme.

              +
              + + + +
              +

              Implementation

              +
              static ThemeChangerState of(BuildContext context) {
              +	final state = context.findAncestorStateOfType<ThemeChangerState>();
              +	if (state == null) {
              +		throw StateError("No theme changer found in the widget tree");
              +	} else {
              +		return state;
              +	}
              +}
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChanger/themes.html b/docs/widgets/ThemeChanger/themes.html new file mode 100644 index 000000000..474174288 --- /dev/null +++ b/docs/widgets/ThemeChanger/themes.html @@ -0,0 +1,157 @@ + + + + + + + + themes property - ThemeChanger class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              themes
              + +
              + +
              + + + + +
              +
              + +

              themes property + Null safety +

              + +
              + Map<String, ThemeData> + themes +
              final
              + +
              + +
              +

              A collection of predefined themes.

              +

              To switch between themes, change ThemeChangerState.themeName with +ThemeChanger.of(context).themeName = key.

              +
              + + +
              +

              Implementation

              +
              final Map<String, ThemeData> themes;
              +
              +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChangerState-class.html b/docs/widgets/ThemeChangerState-class.html new file mode 100644 index 000000000..a3c17e49f --- /dev/null +++ b/docs/widgets/ThemeChangerState-class.html @@ -0,0 +1,516 @@ + + + + + + + + ThemeChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ThemeChangerState
              + +
              + +
              + + + + +
              +
              + +

              ThemeChangerState class + Null safety + +

              + + +
              +

              The state for a ThemeChanger.

              +

              This class has properties that control the theme.

              +
              + + +
              +
              +
              Inheritance
              +
              + + + + + +
              +
              + +
              +

              Constructors

              + +
              +
              + ThemeChangerState() +
              +
              + +
              +
              +
              + +
              +

              Properties

              + +
              +
              + brightness + Brightness + +
              +
              + The current brightness. [...] +
              read / write
              + +
              + +
              + context + BuildContext + +
              +
              + The location in the tree where this widget builds. [...] +
              read-only, inherited
              + +
              + +
              + hashCode + → int + +
              +
              + The hash code for this object. [...] +
              read-only, inherited
              + +
              + +
              + mounted + → bool + +
              +
              + Whether this State object is currently in a tree. [...] +
              read-only, inherited
              + +
              + +
              + runtimeType + → Type + +
              +
              + A representation of the runtime type of the object. +
              read-only, inherited
              + +
              + +
              + theme + ThemeData + +
              +
              + The current theme. [...] +
              read / write
              + +
              + +
              + themeName + ↔ String? + +
              +
              + The name of the theme. [...] +
              read / write
              + +
              + +
              + widget + ThemeChanger + +
              +
              + The current configuration. [...] +
              read-only, inherited
              + +
              + +
              +
              + +
              +

              Methods

              +
              +
              + build(BuildContext context) + Widget + + + +
              +
              + Describes the part of the user interface represented by this widget. [...] +
              override
              + +
              + +
              + deactivate() + → void + + + +
              +
              + Called when this object is removed from the tree. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + debugFillProperties(DiagnosticPropertiesBuilder properties) + → void + + + +
              +
              + Add additional properties associated with the node. [...] +
              inherited
              + +
              + +
              + didChangeDependencies() + → void + + + +
              +
              + Called when a dependency of this State object changes. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + didUpdateWidget(covariant ThemeChanger oldWidget) + → void + + + +
              +
              + Called whenever the widget configuration changes. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + dispose() + → void + + + +
              +
              + Called when this object is removed from the tree permanently. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + initState() + → void + + + +
              +
              + Called when this object is inserted into the tree. [...] +
              override
              + +
              + +
              + noSuchMethod(Invocation invocation) + → dynamic + + + +
              +
              + Invoked when a non-existent method or property is accessed. [...] +
              inherited
              + +
              + +
              + reassemble() + → void + + + +
              +
              + Called whenever the application is reassembled during debugging, for +example during hot reload. [...] +
              @mustCallSuper, @protected, inherited
              + +
              + +
              + setState(VoidCallback fn) + → void + + + +
              +
              + Notify the framework that the internal state of this object has changed. [...] +
              @protected, inherited
              + +
              + +
              + toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) + DiagnosticsNode + + + +
              +
              + Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. [...] +
              inherited
              + +
              + +
              + toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) + → String + + + +
              +
              + A string representation of this object. [...] +
              inherited
              + +
              + +
              + toStringShort() + → String + + + +
              +
              + A brief description of this object, usually just the runtimeType and the +hashCode. [...] +
              inherited
              + +
              + +
              +
              + +
              +

              Operators

              +
              +
              + operator ==(Object other) + → bool + + + +
              +
              + The equality operator. [...] +
              inherited
              + +
              + +
              +
              + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChangerState/ThemeChangerState.html b/docs/widgets/ThemeChangerState/ThemeChangerState.html new file mode 100644 index 000000000..826233c6b --- /dev/null +++ b/docs/widgets/ThemeChangerState/ThemeChangerState.html @@ -0,0 +1,146 @@ + + + + + + + + ThemeChangerState constructor - ThemeChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              ThemeChangerState
              + +
              + +
              + + + + +
              +
              + +

              ThemeChangerState constructor + Null safety +

              + +
              + ThemeChangerState() +
              + + + + + + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChangerState/brightness.html b/docs/widgets/ThemeChangerState/brightness.html new file mode 100644 index 000000000..5dcb2bf1e --- /dev/null +++ b/docs/widgets/ThemeChangerState/brightness.html @@ -0,0 +1,189 @@ + + + + + + + + brightness property - ThemeChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              brightness
              + +
              + +
              + + + + +
              +
              + +

              brightness property + Null safety +

              + + + +
              + +
              + Brightness + brightness + + +
              + + +
              +

              The current brightness.

              +

              When changed, the theme will be changed to the appropriate theme (set by +ThemeChanger.light and ThemeChanger.dark).

              +
              + + +
              +

              Implementation

              +
              Brightness get brightness => _brightness;
              +
              + +
              + + + +
              + +
              + void + brightness=(Brightness value) + + +
              + + + + +
              +

              Implementation

              +
              set brightness(Brightness value) {
              +	_key = null;
              +	_brightness = value;
              +	setState(() => _theme = value == Brightness.light
              +		? widget.light : widget.dark
              +	);
              +}
              +
              + +
              + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChangerState/build.html b/docs/widgets/ThemeChangerState/build.html new file mode 100644 index 000000000..923dbf20c --- /dev/null +++ b/docs/widgets/ThemeChangerState/build.html @@ -0,0 +1,250 @@ + + + + + + + + build method - ThemeChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              build
              + +
              + +
              + + + + +
              +
              + +

              build method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +Widget +build(
              1. BuildContext context
              2. +
              ) + +
              override
              + +
              + +
              +

              Describes the part of the user interface represented by this widget.

              +

              The framework calls this method in a number of different situations. For +example:

              + +

              This method can potentially be called in every frame and should not have +any side effects beyond building a widget.

              +

              The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

              +

              Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor, the +given BuildContext, and the internal state of this State object.

              +

              The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. The +BuildContext argument is always the same as the context property of +this State object and will remain the same for the lifetime of this +object. The BuildContext argument is provided redundantly here so that +this method matches the signature for a WidgetBuilder.

              +

              Design discussion

              +

              Why is the build method on State, and not StatefulWidget?

              +

              Putting a Widget build(BuildContext context) method on State rather +than putting a Widget build(BuildContext context, State state) method +on StatefulWidget gives developers more flexibility when subclassing +StatefulWidget.

              +

              For example, AnimatedWidget is a subclass of StatefulWidget that +introduces an abstract Widget build(BuildContext context) method for its +subclasses to implement. If StatefulWidget already had a build method +that took a State argument, AnimatedWidget would be forced to provide +its State object to subclasses even though its State object is an +internal implementation detail of AnimatedWidget.

              +

              Conceptually, StatelessWidget could also be implemented as a subclass of +StatefulWidget in a similar manner. If the build method were on +StatefulWidget rather than State, that would not be possible anymore.

              +

              Putting the build function on State rather than StatefulWidget also +helps avoid a category of bugs related to closures implicitly capturing +this. If you defined a closure in a build function on a +StatefulWidget, that closure would implicitly capture this, which is +the current widget instance, and would have the (immutable) fields of that +instance in scope:

              +
              class MyButton extends StatefulWidget {
              +  ...
              +  final Color color;
              +
              +  @override
              +  Widget build(BuildContext context, MyButtonState state) {
              +    ... () { print("color: $color"); } ...
              +  }
              +}
              +
              +

              For example, suppose the parent builds MyButton with color being blue, +the $color in the print function refers to blue, as expected. Now, +suppose the parent rebuilds MyButton with green. The closure created by +the first build still implicitly refers to the original widget and the +$color still prints blue even through the widget has been updated to +green.

              +

              In contrast, with the build function on the State object, closures +created during build implicitly capture the State instance instead of +the widget instance:

              +
              class MyButtonState extends State<MyButton> {
              +  ...
              +  @override
              +  Widget build(BuildContext context) {
              +    ... () { print("color: ${widget.color}"); } ...
              +  }
              +}
              +
              +

              Now when the parent rebuilds MyButton with green, the closure created by +the first build still refers to State object, which is preserved across +rebuilds, but the framework has updated that State object's widget +property to refer to the new MyButton instance and ${widget.color} +prints green, as expected.

              +

              See also:

              +
                +
              • StatefulWidget, which contains the discussion on performance considerations.
              • +
              +
              + + + +
              +

              Implementation

              +
              @override
              +Widget build (BuildContext context) => widget.builder (context, _theme);
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChangerState/initState.html b/docs/widgets/ThemeChangerState/initState.html new file mode 100644 index 000000000..3e7d7d8f4 --- /dev/null +++ b/docs/widgets/ThemeChangerState/initState.html @@ -0,0 +1,190 @@ + + + + + + + + initState method - ThemeChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              initState
              + +
              + +
              + + + + +
              +
              + +

              initState method + Null safety +

              + +
              + +
              +
                +
              1. @override
              2. +
              +
              + +void +initState() + +
              override
              + +
              + +
              +

              Called when this object is inserted into the tree.

              +

              The framework will call this method exactly once for each State object +it creates.

              +

              Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

              +

              If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

              +
                +
              • In initState, subscribe to the object.
              • +
              • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
              • +
              • In dispose, unsubscribe from the object.
              • +
              +

              You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

              +

              If you override this, make sure your method starts with a call to +super.initState().

              +
              + + + +
              +

              Implementation

              +
              @override
              +void initState() {
              +	super.initState();
              +	brightness = widget.defaultBrightness;
              +}
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChangerState/theme.html b/docs/widgets/ThemeChangerState/theme.html new file mode 100644 index 000000000..e5ed1939a --- /dev/null +++ b/docs/widgets/ThemeChangerState/theme.html @@ -0,0 +1,186 @@ + + + + + + + + theme property - ThemeChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              theme
              + +
              + +
              + + + + +
              +
              + +

              theme property + Null safety +

              + + + +
              + +
              + ThemeData + theme + + +
              + + +
              +

              The current theme.

              +

              Changing this will rebuild the widget tree.

              +
              + + +
              +

              Implementation

              +
              ThemeData get theme => _theme;
              +
              + +
              + + + +
              + +
              + void + theme=(ThemeData data) + + +
              + + + + +
              +

              Implementation

              +
              set theme(ThemeData data) {
              +	_brightness = data.brightness;
              +	_key = null;
              +	setState(() => _theme = data);
              +}
              +
              + +
              + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/ThemeChangerState/themeName.html b/docs/widgets/ThemeChangerState/themeName.html new file mode 100644 index 000000000..c6db888df --- /dev/null +++ b/docs/widgets/ThemeChangerState/themeName.html @@ -0,0 +1,190 @@ + + + + + + + + themeName property - ThemeChangerState class - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              themeName
              + +
              + +
              + + + + +
              +
              + +

              themeName property + Null safety +

              + + + +
              + +
              + String? + themeName + + +
              + + +
              +

              The name of the theme.

              +

              This name matches the name associated with the theme in +ThemeChanger.themes. Changing this will update theme to the theme in +ThemeChanger.themes with this key.

              +

              When brightness or theme are changed, theme may not exist in +ThemeChanger.themes, in which case themeName will equal null.

              +
              + + +
              +

              Implementation

              +
              String? get themeName => _key;
              +
              + +
              + + + +
              + +
              + void + themeName=(String? key) + + +
              + + + + +
              +

              Implementation

              +
              set themeName (String? key) {
              +	setState(() => _theme = (widget.themes) [key] ?? _theme);
              +	_key = key;
              +	_brightness = _theme.brightness;
              +}
              +
              + +
              + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/caseConverter.html b/docs/widgets/caseConverter.html new file mode 100644 index 000000000..003f6ba86 --- /dev/null +++ b/docs/widgets/caseConverter.html @@ -0,0 +1,174 @@ + + + + + + + + caseConverter function - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              caseConverter
              + +
              + +
              + + + + +
              +
              + +

              caseConverter<T> function + Null safety + +

              + +
              + + +T +caseConverter<T>(
              1. {required bool? value,
              2. +
              3. required T onNull,
              4. +
              5. required T onTrue,
              6. +
              7. required T onFalse}
              8. +
              ) + +
              + +
              +

              Returns a custom value if value is null, true, or false.

              +
              + + + +
              +

              Implementation

              +
              T caseConverter<T>({
              +	required bool? value,
              +	required T onNull,
              +	required T onTrue,
              +	required T onFalse,
              +}) => value == null ? onNull
              +	: value ? onTrue : onFalse;
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/pickDate.html b/docs/widgets/pickDate.html new file mode 100644 index 000000000..e5164e97d --- /dev/null +++ b/docs/widgets/pickDate.html @@ -0,0 +1,184 @@ + + + + + + + + pickDate function - widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              pickDate
              + +
              + +
              + + + + +
              +
              + +

              pickDate function + Null safety + +

              + +
              + + +Future<DateTime?> +pickDate(
              1. {required BuildContext context,
              2. +
              3. required DateTime initialDate}
              4. +
              ) + +
              + +
              +

              Prompts the user to pick a date from the calendar.

              +

              The calendar will show the days of the school year.

              +
              + + + +
              +

              Implementation

              +
              Future<DateTime?> pickDate({
              +	required BuildContext context,
              +	required DateTime initialDate
              +}) async {
              +	final DateTime now = DateTime.now();
              +	final DateTime beginningOfYear = DateTime(
              +		now.month > 6 ? now.year : now.year - 1, 9, 1
              +	);
              +	final DateTime endOfYear = DateTime (
              +		now.month > 6 ? now.year + 1 : now.year, 7, 1
              +	);
              +	return showDatePicker(
              +		context: context,
              +		initialDate: initialDate,
              +		firstDate: beginningOfYear,
              +		lastDate: endOfYear,
              +	);
              +}
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + diff --git a/docs/widgets/widgets-library.html b/docs/widgets/widgets-library.html new file mode 100644 index 000000000..450b0ee63 --- /dev/null +++ b/docs/widgets/widgets-library.html @@ -0,0 +1,523 @@ + + + + + + + + widgets library - Dart API + + + + + + + + + + + + + + + + +
              + +
              + + +
              widgets
              + +
              + +
              + + + + +
              +
              + +

              widgets library + Null safety + +

              + + +
              +

              A collection of widgets to use.

              +

              There are three types of widgets in this library:

              +
                +
              1. +

                Generic widgets: miscellaneous widgets for use all around the app.

                +
              2. +
              3. +

                Atomic widgets: widgets that represent a single piece of data, (something +from the data library) with a canonic form all around the app. These +widgets usually have InfoTile (defined here) as a base.

                +
              4. +
              5. +

                Ambient widgets: Inherited widgets that can be accessed anywhere +in the app using BuildContexts.

                +
              6. +
              +
              + + +
              +

              Classes

              + +
              +
              + ActivityTile + +
              +
              + A widget that represents an Activity. [...] +
              + +
              + BrightnessChanger + +
              +
              + A widget to toggle the app between light mode and dark mode. +
              + +
              + BrightnessChangerState + +
              +
              + +
              + +
              + CalendarTile + +
              +
              + A cell in a calendar that represents a Day. [...] +
              + +
              + ClassList + +
              +
              + A list of all the classes for a given day. [...] +
              + +
              + ClassPanel + +
              +
              + An ExpansionTile for an individual period in a list. +
              + + +
              + A footer to display all around the app. [...] +
              + +
              + LayoutInfo + +
              +
              + Provides info about how this scaffold should be laid out. [...] +
              + +
              + LinkIcon + +
              +
              + An icon that opens a link when tapped. +
              + +
              + LoadingImage + +
              +
              + An image that displays a CircularProgressIndicator while loading. [...] +
              + +
              + LoadingImageState + +
              +
              + A state for a LoadingImage. [...] +
              + +
              + Logos + +
              +
              + Brand logos used throughout the app. [...] +
              + +
              + ModelListener<Model extends ChangeNotifier> + +
              +
              + A widget that listens to a ChangeNotifier and rebuilds the widget tree +when ChangeNotifier.notifyListeners. +
              + +
              + ModelListenerState<Model extends ChangeNotifier> + +
              +
              + A state for a ModelListener. +
              + + +
              + Defines a common interface for BottomNavigationBar and NavigationRail. [...] +
              + +
              + NextClass + +
              +
              + A widget to represent the next class. +
              + +
              + PeriodTile + +
              +
              + A widget to represent a Period when creating a Schedule. +
              + +
              + RamazLogos + +
              +
              + Logos belonging to ramaz. +
              + +
              + ReminderTile + +
              +
              + A widget to represent a Reminder. [...] +
              + +
              + ResponsiveBuilder + +
              +
              + Builds a widget tree according to a LayoutInfo. +
              + +
              + ResponsiveScaffold + +
              +
              + A Scaffold that rearranges itself according to the device size. [...] +
              + +
              + ScoreUpdaterState + +
              +
              + The state for SportsScoreUpdater. [...] +
              + +
              + SpecialTile + +
              +
              + A decorative border around a special addition to NextClass. +
              + +
              + SportsIcons + +
              +
              + A collection of icons for sports. [...] +
              + +
              + SportsScoreUpdater + +
              +
              + A dialog to update the scores for a SportsGame. [...] +
              + +
              + SportsStats + +
              +
              + A row in a SportsTile that displays a team, their score, +and a part of the date. +
              + +
              + SportsTile + +
              +
              + A widget to represent a SportsGame. [...] +
              + +
              + ThemeChanger + +
              +
              + A widget to change the theme. [...] +
              + +
              + ThemeChangerState + +
              +
              + The state for a ThemeChanger. [...] +
              + +
              +
              + + + + + +
              +

              Functions

              + +
              +
              + caseConverter<T>({required bool? value, required T onNull, required T onTrue, required T onFalse}) + → T + + + +
              +
              + Returns a custom value if value is null, true, or false. + + +
              + +
              + pickDate({required BuildContext context, required DateTime initialDate}) + → Future<DateTime?> + + + +
              +
              + Prompts the user to pick a date from the calendar. [...] + + +
              + +
              +
              + +
              +

              Enums

              + +
              +
              + BrightnessChangerForm + +
              +
              + The form the BrightnessChanger widget should take. +
              + +
              +
              + +
              +

              Typedefs

              + +
              + +
              + ModelBuilder<T extends ChangeNotifier>(BuildContext context, T model, Widget? child) + Widget + + + +
              +
              + A function to build a widget with a ChangeNotifier subclass. + + +
              + + + +
              + ResponsiveWidgetBuilder(BuildContext, LayoutInfo, Widget?) + Widget + + + +
              +
              + A function that returns a widget that depends on a LayoutInfo. [...] + + +
              + + + +
              + ThemeBuilder(BuildContext, ThemeData) + Widget + + + +
              +
              + Builds a widget with the given theme. + + +
              + + +
              +
              + + +
              + + + +
              + +
              + + ramaz + 2.1.1+1 + + + +
              + + + + + + + + + + + From 8cd3b302322bcc3fab76ee743dbe001681a6c37c Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 01:21:58 -0400 Subject: [PATCH 150/251] Fixed BrightnessChanger regression --- lib/src/widgets/ambient/brightness_changer.dart | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/src/widgets/ambient/brightness_changer.dart b/lib/src/widgets/ambient/brightness_changer.dart index c9975d240..741ca7d98 100644 --- a/lib/src/widgets/ambient/brightness_changer.dart +++ b/lib/src/widgets/ambient/brightness_changer.dart @@ -45,6 +45,18 @@ class BrightnessChanger extends StatefulWidget { class BrightnessChangerState extends State { bool? _brightness; + @override + void initState() { + super.initState(); + _brightness = Services.instance.prefs.brightness; + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + Future(() => setBrightness(context, value: _brightness)); + } + /// The icon for this widget. Icon get icon => Icon ( caseConverter( From 873f4597377590aceaf09182c46e64cd3c6f416f Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 13:06:28 -0400 Subject: [PATCH 151/251] Update documentation.yml --- .github/workflows/documentation.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 001ea847c..15945fd46 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -29,6 +29,11 @@ jobs: run: | flutter pub global run dartdoc --version flutter --version + + - name: Switch branches + run: | + git switch --track origin/documentation + git merge master - name: Generate documentation run: flutter pub global run dartdoc --ignore 'unresolved-doc-reference,not-implemented,no-documentable-libraries,ambiguous-reexport' --exclude 'dart:async,dart:collection,dart:convert,dart:core,dart:developer,dart:io,dart:isolate,dart:math,dart:typed_data,dart:ui,dart:html,dart:js,dart:ffi,dart:js_util' --quiet --json --output docs --no-auto-include-dependencies --no-validate-links --no-verbose-warnings --no-allow-non-local-warnings From be993c72e7d0d36b039dba88063641b08db049e1 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 13:10:04 -0400 Subject: [PATCH 152/251] Improved documentation bot --- .github/workflows/documentation.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 001ea847c..d2a66ccce 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -29,6 +29,12 @@ jobs: run: | flutter pub global run dartdoc --version flutter --version + + - name: Prepare Git + run: | + git switch --track origin/documentation + git merge master + - name: Generate documentation run: flutter pub global run dartdoc --ignore 'unresolved-doc-reference,not-implemented,no-documentable-libraries,ambiguous-reexport' --exclude 'dart:async,dart:collection,dart:convert,dart:core,dart:developer,dart:io,dart:isolate,dart:math,dart:typed_data,dart:ui,dart:html,dart:js,dart:ffi,dart:js_util' --quiet --json --output docs --no-auto-include-dependencies --no-validate-links --no-verbose-warnings --no-allow-non-local-warnings From 1f04891bb311692977645535db4b3b3280a611ac Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 13:13:02 -0400 Subject: [PATCH 153/251] Make doc bot pull branches first --- .github/workflows/documentation.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index d2a66ccce..9fd07087a 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -32,6 +32,7 @@ jobs: - name: Prepare Git run: | + git pull git switch --track origin/documentation git merge master From 102ba70f48ad6542fa52c4e32afc431332409b23 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 13:19:49 -0400 Subject: [PATCH 154/251] deleted docs folder --- docs/__404error.html | 109 -- docs/app/RamLife-class.html | 417 ------- docs/app/RamLife/RamLife.html | 149 --- docs/app/RamLife/build.html | 270 ----- docs/app/RamLife/hasAdminScope.html | 154 --- docs/app/RamLife/routes.html | 181 --- docs/app/app-library.html | 145 --- docs/categories.json | 1 - docs/constants/DayComparison.html | 167 --- docs/constants/DayComparison/isSameDay.html | 134 --- docs/constants/RamazColors-class.html | 346 ------ docs/constants/RamazColors/RamazColors.html | 136 --- docs/constants/RamazColors/blue-constant.html | 146 --- .../RamazColors/blueDark-constant.html | 146 --- .../RamazColors/blueLight-constant.html | 146 --- docs/constants/RamazColors/gold-constant.html | 146 --- .../RamazColors/goldDark-constant.html | 146 --- .../RamazColors/goldLight-constant.html | 146 --- docs/constants/RamazColors/hashCode.html | 175 --- docs/constants/RamazColors/noSuchMethod.html | 183 --- .../RamazColors/operator_equals.html | 174 --- docs/constants/RamazColors/runtimeType.html | 150 --- docs/constants/RamazColors/toString.html | 156 --- docs/constants/TimeConverter.html | 167 --- docs/constants/TimeConverter/asTime.html | 135 --- docs/constants/TimeOfDayConverter.html | 169 --- .../TimeOfDayConverter/asTimeOfDay.html | 135 --- docs/constants/Times-class.html | 343 ------ docs/constants/Times/Times.html | 136 --- docs/constants/Times/hashCode.html | 175 --- docs/constants/Times/noSuchMethod.html | 183 --- docs/constants/Times/operator_equals.html | 174 --- docs/constants/Times/runtimeType.html | 150 --- docs/constants/Times/schoolEnd-constant.html | 146 --- .../constants/Times/schoolStart-constant.html | 146 --- docs/constants/Times/toString.html | 156 --- .../Times/winterFridayDayEnd-constant.html | 146 --- .../Times/winterFridayDayStart-constant.html | 146 --- .../Times/winterFridayMonthEnd-constant.html | 146 --- .../winterFridayMonthStart-constant.html | 146 --- docs/constants/Urls-class.html | 343 ------ docs/constants/Urls/Urls.html | 136 --- docs/constants/Urls/email-constant.html | 146 --- docs/constants/Urls/googleDrive-constant.html | 146 --- docs/constants/Urls/hashCode.html | 175 --- docs/constants/Urls/noSuchMethod.html | 183 --- docs/constants/Urls/operator_equals.html | 174 --- docs/constants/Urls/ramaz-constant.html | 146 --- docs/constants/Urls/runtimeType.html | 150 --- docs/constants/Urls/schoology-constant.html | 146 --- .../Urls/seniorSystems-constant.html | 146 --- .../Urls/sportsLivestream-constant.html | 146 --- docs/constants/Urls/toString.html | 156 --- docs/constants/constants-library.html | 200 ---- docs/data/Activity-class.html | 361 ------ docs/data/Activity/Activity.fromJson.html | 151 --- docs/data/Activity/Activity.grade.html | 146 --- docs/data/Activity/Activity.html | 148 --- docs/data/Activity/getActivities.html | 157 --- docs/data/Activity/hashCode.html | 175 --- docs/data/Activity/message.html | 148 --- docs/data/Activity/noSuchMethod.html | 183 --- docs/data/Activity/operator_equals.html | 174 --- docs/data/Activity/runtimeType.html | 150 --- docs/data/Activity/toJson.html | 148 --- docs/data/Activity/toString.html | 170 --- docs/data/Activity/type.html | 146 --- docs/data/ActivityType-class.html | 357 ------ docs/data/ActivityType/hashCode.html | 171 --- docs/data/ActivityType/noSuchMethod.html | 179 --- docs/data/ActivityType/operator_equals.html | 170 --- docs/data/ActivityType/runtimeType.html | 146 --- docs/data/ActivityType/toString.html | 149 --- docs/data/AdminScope-class.html | 338 ------ docs/data/AdminScope/hashCode.html | 170 --- docs/data/AdminScope/noSuchMethod.html | 178 --- docs/data/AdminScope/operator_equals.html | 169 --- docs/data/AdminScope/runtimeType.html | 145 --- docs/data/AdminScope/toString.html | 148 --- docs/data/Advisory-class.html | 318 ------ docs/data/Advisory/Advisory.fromJson.html | 143 --- docs/data/Advisory/Advisory.html | 144 --- docs/data/Advisory/hashCode.html | 171 --- docs/data/Advisory/id.html | 142 --- docs/data/Advisory/noSuchMethod.html | 179 --- docs/data/Advisory/operator_equals.html | 170 --- docs/data/Advisory/room.html | 142 --- docs/data/Advisory/runtimeType.html | 146 --- docs/data/Advisory/toString.html | 152 --- docs/data/Club-class.html | 400 ------- docs/data/Club/Club.html | 164 --- docs/data/Club/attendance.html | 147 --- docs/data/Club/captains.html | 147 --- docs/data/Club/description.html | 147 --- docs/data/Club/facultyAdvisor.html | 147 --- docs/data/Club/formUrl.html | 147 --- docs/data/Club/hashCode.html | 179 --- docs/data/Club/image.html | 147 --- docs/data/Club/members.html | 147 --- docs/data/Club/messages.html | 147 --- docs/data/Club/name.html | 147 --- docs/data/Club/noSuchMethod.html | 187 --- docs/data/Club/operator_equals.html | 178 --- docs/data/Club/phoneNumberRequested.html | 147 --- docs/data/Club/runtimeType.html | 154 --- docs/data/Club/shortDescription.html | 147 --- docs/data/Club/toString.html | 160 --- docs/data/Day-class.html | 406 ------- docs/data/Day/Day.fromJson.html | 162 --- docs/data/Day/Day.html | 151 --- docs/data/Day/displayName.html | 154 --- docs/data/Day/getCalendar.html | 160 --- docs/data/Day/getCurrentPeriod.html | 168 --- docs/data/Day/getDate.html | 154 --- docs/data/Day/hashCode.html | 180 --- docs/data/Day/n.html | 158 --- docs/data/Day/name.html | 150 --- docs/data/Day/noSuchMethod.html | 186 --- docs/data/Day/operator_equals.html | 186 --- docs/data/Day/runtimeType.html | 153 --- docs/data/Day/schedule.html | 150 --- docs/data/Day/toJson.html | 154 --- docs/data/Day/toString.html | 166 --- docs/data/Feedback-class.html | 346 ------ docs/data/Feedback/Feedback.html | 157 --- docs/data/Feedback/anonymous.html | 145 --- docs/data/Feedback/email.html | 145 --- docs/data/Feedback/hashCode.html | 174 --- docs/data/Feedback/message.html | 145 --- docs/data/Feedback/name.html | 145 --- docs/data/Feedback/noSuchMethod.html | 182 --- docs/data/Feedback/operator_equals.html | 173 --- docs/data/Feedback/runtimeType.html | 149 --- docs/data/Feedback/timestamp.html | 145 --- docs/data/Feedback/toJson.html | 153 --- docs/data/Feedback/toString.html | 155 --- docs/data/Grade-class.html | 357 ------ docs/data/Grade/hashCode.html | 171 --- docs/data/Grade/noSuchMethod.html | 179 --- docs/data/Grade/operator_equals.html | 170 --- docs/data/Grade/runtimeType.html | 146 --- docs/data/Grade/toString.html | 149 --- docs/data/GradeActivity-class.html | 340 ------ .../GradeActivity/GradeActivity.fromJson.html | 148 --- docs/data/GradeActivity/GradeActivity.html | 150 --- docs/data/GradeActivity/freshmen.html | 144 --- docs/data/GradeActivity/hashCode.html | 173 --- docs/data/GradeActivity/juniors.html | 144 --- docs/data/GradeActivity/noSuchMethod.html | 181 --- docs/data/GradeActivity/operator_equals.html | 172 --- docs/data/GradeActivity/runtimeType.html | 148 --- docs/data/GradeActivity/seniors.html | 144 --- docs/data/GradeActivity/sophomores.html | 144 --- docs/data/GradeActivity/toString.html | 165 --- docs/data/Message-class.html | 304 ----- docs/data/Message/Message.html | 143 --- docs/data/Message/body.html | 139 --- docs/data/Message/hashCode.html | 171 --- docs/data/Message/noSuchMethod.html | 179 --- docs/data/Message/operator_equals.html | 170 --- docs/data/Message/runtimeType.html | 146 --- docs/data/Message/sender.html | 139 --- docs/data/Message/timestamp.html | 139 --- docs/data/Message/toString.html | 152 --- docs/data/Period-class.html | 430 ------- docs/data/Period/Period.fromJson.html | 155 --- docs/data/Period/Period.html | 157 --- docs/data/Period/Period.raw.html | 157 --- docs/data/Period/activity.html | 151 --- docs/data/Period/copyWith.html | 164 --- docs/data/Period/data.html | 152 --- docs/data/Period/getInfo.html | 168 --- docs/data/Period/getName.html | 166 --- docs/data/Period/hashCode.html | 182 --- docs/data/Period/id.html | 157 --- docs/data/Period/isFree.html | 156 --- docs/data/Period/name.html | 154 --- docs/data/Period/noSuchMethod.html | 188 --- docs/data/Period/operator_equals.html | 189 --- docs/data/Period/runtimeType.html | 155 --- docs/data/Period/time.html | 151 --- docs/data/Period/toJson.html | 157 --- docs/data/Period/toString.html | 159 --- docs/data/PeriodData-class.html | 339 ------ docs/data/PeriodData/PeriodData.fromJson.html | 146 --- docs/data/PeriodData/PeriodData.html | 147 --- docs/data/PeriodData/getList.html | 154 --- docs/data/PeriodData/hashCode.html | 175 --- docs/data/PeriodData/id.html | 145 --- docs/data/PeriodData/noSuchMethod.html | 181 --- docs/data/PeriodData/operator_equals.html | 181 --- docs/data/PeriodData/room.html | 144 --- docs/data/PeriodData/runtimeType.html | 148 --- docs/data/PeriodData/toString.html | 161 --- docs/data/PeriodReminderTime-class.html | 382 ------- .../PeriodReminderTime.fromJson.html | 151 --- .../PeriodReminderTime.html | 152 --- docs/data/PeriodReminderTime/dayName.html | 147 --- docs/data/PeriodReminderTime/doesApply.html | 162 --- docs/data/PeriodReminderTime/hash.html | 150 --- docs/data/PeriodReminderTime/period.html | 147 --- docs/data/PeriodReminderTime/toJson.html | 160 --- docs/data/PeriodReminderTime/toString.html | 157 --- docs/data/Range-class.html | 379 ------ docs/data/Range/Range.fromJson.html | 150 --- docs/data/Range/Range.html | 146 --- docs/data/Range/Range.nums.html | 155 --- docs/data/Range/contains.html | 150 --- docs/data/Range/end.html | 147 --- docs/data/Range/hashCode.html | 177 --- docs/data/Range/noSuchMethod.html | 184 --- docs/data/Range/operator_equals.html | 182 --- docs/data/Range/operator_greater.html | 154 --- docs/data/Range/operator_less.html | 154 --- docs/data/Range/runtimeType.html | 151 --- docs/data/Range/start.html | 147 --- docs/data/Range/toJson.html | 152 --- docs/data/Range/toString.html | 163 --- docs/data/Reminder-class.html | 376 ------ docs/data/Reminder/Reminder.fromJson.html | 149 --- docs/data/Reminder/Reminder.html | 149 --- docs/data/Reminder/fromList.html | 154 --- docs/data/Reminder/getReminders.html | 167 --- docs/data/Reminder/hash.html | 149 --- docs/data/Reminder/hashCode.html | 176 --- docs/data/Reminder/message.html | 147 --- docs/data/Reminder/noSuchMethod.html | 184 --- docs/data/Reminder/operator_equals.html | 175 --- docs/data/Reminder/runtimeType.html | 151 --- docs/data/Reminder/time.html | 147 --- docs/data/Reminder/toJson.html | 153 --- docs/data/Reminder/toString.html | 163 --- docs/data/ReminderTime-class.html | 370 ------ .../ReminderTime/ReminderTime.fromJson.html | 164 --- .../ReminderTime/ReminderTime.fromType.html | 167 --- docs/data/ReminderTime/ReminderTime.html | 148 --- docs/data/ReminderTime/doesApply.html | 156 --- docs/data/ReminderTime/hash.html | 148 --- docs/data/ReminderTime/hashCode.html | 175 --- docs/data/ReminderTime/noSuchMethod.html | 183 --- docs/data/ReminderTime/operator_equals.html | 174 --- docs/data/ReminderTime/repeats.html | 146 --- docs/data/ReminderTime/runtimeType.html | 150 --- docs/data/ReminderTime/toJson.html | 148 --- docs/data/ReminderTime/toString.html | 155 --- docs/data/ReminderTime/type.html | 147 --- docs/data/ReminderTimeType-class.html | 323 ------ docs/data/ReminderTimeType/hashCode.html | 169 --- docs/data/ReminderTimeType/noSuchMethod.html | 177 --- .../ReminderTimeType/operator_equals.html | 168 --- docs/data/ReminderTimeType/runtimeType.html | 144 --- docs/data/ReminderTimeType/toString.html | 147 --- docs/data/Schedule-class.html | 539 --------- docs/data/Schedule/Schedule.fromJson.html | 166 --- docs/data/Schedule/Schedule.html | 160 --- docs/data/Schedule/amAssembly-constant.html | 175 --- docs/data/Schedule/covid-constant.html | 172 --- docs/data/Schedule/early-constant.html | 175 --- docs/data/Schedule/fastDay-constant.html | 171 --- docs/data/Schedule/friday-constant.html | 170 --- .../Schedule/fridayRoshChodesh-constant.html | 170 --- docs/data/Schedule/getWinterFriday.html | 184 --- docs/data/Schedule/hashCode.html | 189 --- docs/data/Schedule/name.html | 158 --- docs/data/Schedule/noSuchMethod.html | 195 ---- docs/data/Schedule/operator_equals.html | 194 ---- docs/data/Schedule/periods.html | 158 --- docs/data/Schedule/pmAssembly-constant.html | 174 --- docs/data/Schedule/roshChodesh-constant.html | 175 --- docs/data/Schedule/runtimeType.html | 162 --- docs/data/Schedule/schedules.html | 167 --- docs/data/Schedule/toJson.html | 166 --- docs/data/Schedule/toString.html | 175 --- docs/data/Schedule/winterFriday-constant.html | 170 --- .../winterFridayRoshChodesh-constant.html | 170 --- docs/data/Scores-class.html | 381 ------- docs/data/Scores/Scores.fromJson.html | 157 --- docs/data/Scores/Scores.html | 151 --- docs/data/Scores/didDraw.html | 152 --- docs/data/Scores/didWin.html | 152 --- docs/data/Scores/getScore.html | 151 --- docs/data/Scores/hashCode.html | 176 --- docs/data/Scores/isHome.html | 148 --- docs/data/Scores/noSuchMethod.html | 184 --- docs/data/Scores/operator_equals.html | 175 --- docs/data/Scores/otherScore.html | 147 --- docs/data/Scores/ramazScore.html | 147 --- docs/data/Scores/runtimeType.html | 151 --- docs/data/Scores/toJson.html | 155 --- docs/data/Scores/toString.html | 164 --- docs/data/Sport-class.html | 385 ------- docs/data/Sport/hashCode.html | 173 --- docs/data/Sport/noSuchMethod.html | 181 --- docs/data/Sport/operator_equals.html | 172 --- docs/data/Sport/runtimeType.html | 148 --- docs/data/Sport/toString.html | 151 --- docs/data/SportsGame-class.html | 500 -------- docs/data/SportsGame/SportsGame.fromJson.html | 174 --- docs/data/SportsGame/SportsGame.html | 169 --- docs/data/SportsGame/awayTeam.html | 162 --- docs/data/SportsGame/capitalize.html | 163 --- docs/data/SportsGame/date.html | 158 --- docs/data/SportsGame/dateTime.html | 169 --- docs/data/SportsGame/description.html | 162 --- docs/data/SportsGame/fromList.html | 166 --- docs/data/SportsGame/getJsonList.html | 163 --- docs/data/SportsGame/hashCode.html | 188 --- docs/data/SportsGame/homeTeam.html | 162 --- docs/data/SportsGame/isHome.html | 158 --- docs/data/SportsGame/noSuchMethod.html | 194 ---- docs/data/SportsGame/operator_equals.html | 198 ---- docs/data/SportsGame/opponent.html | 157 --- docs/data/SportsGame/replaceScores.html | 169 --- docs/data/SportsGame/runtimeType.html | 161 --- docs/data/SportsGame/scores.html | 159 --- docs/data/SportsGame/sport.html | 157 --- docs/data/SportsGame/team.html | 158 --- docs/data/SportsGame/times.html | 158 --- docs/data/SportsGame/toJson.html | 169 --- docs/data/SportsGame/toString.html | 167 --- docs/data/Subject-class.html | 352 ------ docs/data/Subject/Subject.fromJson.html | 147 --- docs/data/Subject/Subject.html | 149 --- docs/data/Subject/getSubjects.html | 158 --- docs/data/Subject/hashCode.html | 176 --- docs/data/Subject/name.html | 145 --- docs/data/Subject/noSuchMethod.html | 182 --- docs/data/Subject/operator_equals.html | 182 --- docs/data/Subject/runtimeType.html | 149 --- docs/data/Subject/teacher.html | 145 --- docs/data/Subject/toString.html | 162 --- docs/data/Subject/virtualLink.html | 145 --- docs/data/SubjectReminderTime-class.html | 371 ------ .../SubjectReminderTime.fromJson.html | 147 --- .../SubjectReminderTime.html | 148 --- docs/data/SubjectReminderTime/doesApply.html | 162 --- docs/data/SubjectReminderTime/hash.html | 149 --- docs/data/SubjectReminderTime/name.html | 146 --- docs/data/SubjectReminderTime/toJson.html | 158 --- docs/data/SubjectReminderTime/toString.html | 155 --- docs/data/Time-class.html | 399 ------- docs/data/Time/Time.fromDateTime.html | 148 --- docs/data/Time/Time.fromJson.html | 149 --- docs/data/Time/Time.html | 147 --- docs/data/Time/hashCode.html | 179 --- docs/data/Time/hour.html | 148 --- docs/data/Time/minutes.html | 148 --- docs/data/Time/noSuchMethod.html | 185 --- docs/data/Time/operator_equals.html | 185 --- docs/data/Time/operator_greater.html | 152 --- docs/data/Time/operator_greater_equal.html | 151 --- docs/data/Time/operator_less.html | 152 --- docs/data/Time/operator_less_equal.html | 151 --- docs/data/Time/runtimeType.html | 152 --- docs/data/Time/toJson.html | 153 --- docs/data/Time/toString.html | 166 --- docs/data/User-class.html | 412 ------- docs/data/User/User.fromJson.html | 161 --- docs/data/User/User.html | 160 --- docs/data/User/advisory.html | 150 --- docs/data/User/contactInfo.html | 150 --- docs/data/User/dayNames.html | 151 --- docs/data/User/getPeriods.html | 161 --- docs/data/User/grade.html | 151 --- docs/data/User/hashCode.html | 179 --- docs/data/User/noSuchMethod.html | 187 --- docs/data/User/operator_equals.html | 178 --- docs/data/User/registeredClubs.html | 151 --- docs/data/User/runtimeType.html | 154 --- docs/data/User/safeJson.html | 162 --- docs/data/User/schedule.html | 154 --- docs/data/User/sectionIDs.html | 161 --- docs/data/User/toString.html | 160 --- docs/data/activityTypeToString.html | 172 --- docs/data/adminScopeToString.html | 171 --- docs/data/data-library.html | 525 --------- docs/data/intToGrade.html | 168 --- docs/data/parseActivityType.html | 173 --- docs/data/parseAdminScope.html | 172 --- docs/data/reminderTimeToString-constant.html | 166 --- docs/data/sportToString.html | 168 --- docs/data/stringToReminderTime-constant.html | 166 --- docs/data/stringToSport-constant.html | 171 --- .../generated_plugin_registrant-library.html | 150 --- .../registerPlugins.html | 134 --- docs/index.html | 271 ----- docs/index.json | 1 - docs/main/main-library.html | 150 --- docs/main/main.html | 124 -- docs/models/AdminScheduleModel-class.html | 399 ------- .../AdminScheduleModel.html | 139 --- .../AdminScheduleModel/createSchedule.html | 152 --- .../AdminScheduleModel/deleteSchedule.html | 154 --- .../AdminScheduleModel/jsonSchedules.html | 154 --- .../AdminScheduleModel/saveSchedules.html | 152 --- docs/models/AdminScheduleModel/schedules.html | 146 --- docs/models/CalendarDay-class.html | 272 ----- docs/models/CalendarDay/CalendarDay.html | 137 --- docs/models/CalendarDay/date.html | 138 --- docs/models/CalendarDay/hashCode.html | 170 --- docs/models/CalendarDay/noSuchMethod.html | 178 --- docs/models/CalendarDay/operator_equals.html | 169 --- docs/models/CalendarDay/runtimeType.html | 145 --- docs/models/CalendarDay/schoolDay.html | 138 --- docs/models/CalendarDay/toString.html | 151 --- docs/models/CalendarEditor-class.html | 470 -------- .../models/CalendarEditor/CalendarEditor.html | 145 --- docs/models/CalendarEditor/calendar.html | 156 --- docs/models/CalendarEditor/currentMonth.html | 155 --- docs/models/CalendarEditor/currentYear.html | 155 --- docs/models/CalendarEditor/daysInMonth.html | 155 --- docs/models/CalendarEditor/dispose.html | 172 --- docs/models/CalendarEditor/layoutMonth.html | 186 --- docs/models/CalendarEditor/loadMonth.html | 168 --- docs/models/CalendarEditor/now.html | 155 --- docs/models/CalendarEditor/subscriptions.html | 155 --- docs/models/CalendarEditor/updateDay.html | 174 --- docs/models/CalendarEditor/years.html | 163 --- docs/models/DayBuilderModel-class.html | 408 ------- .../DayBuilderModel/DayBuilderModel.html | 152 --- docs/models/DayBuilderModel/date.html | 147 --- docs/models/DayBuilderModel/day.html | 158 --- docs/models/DayBuilderModel/hasSchool.html | 178 --- docs/models/DayBuilderModel/name.html | 178 --- docs/models/DayBuilderModel/ready.html | 155 --- docs/models/DayBuilderModel/schedule.html | 181 --- docs/models/FeedbackModel-class.html | 386 ------- docs/models/FeedbackModel/FeedbackModel.html | 138 --- docs/models/FeedbackModel/anonymous.html | 176 --- docs/models/FeedbackModel/message.html | 176 --- docs/models/FeedbackModel/ready.html | 154 --- docs/models/FeedbackModel/send.html | 163 --- docs/models/HomeModel-class.html | 358 ------ docs/models/HomeModel/HomeModel.html | 145 --- docs/models/HomeModel/dispose.html | 161 --- docs/models/HomeModel/refresh.html | 160 --- docs/models/Models-class.html | 423 ------- docs/models/Models/Models.html | 142 --- docs/models/Models/dispose.html | 177 --- docs/models/Models/init.html | 175 --- docs/models/Models/instance.html | 152 --- docs/models/Models/isReady.html | 152 --- docs/models/Models/reminders.html | 157 --- docs/models/Models/schedule.html | 157 --- docs/models/Models/sports.html | 157 --- docs/models/Models/user.html | 157 --- docs/models/Reminders-class.html | 510 --------- docs/models/Reminders/Reminders.html | 148 --- docs/models/Reminders/addReminder.html | 168 --- docs/models/Reminders/cleanReminders.html | 171 --- docs/models/Reminders/currentReminders.html | 159 --- docs/models/Reminders/deleteReminder.html | 167 --- docs/models/Reminders/getReminders.html | 174 --- docs/models/Reminders/hasNextReminder.html | 163 --- docs/models/Reminders/hasReminder.html | 163 --- docs/models/Reminders/init.html | 172 --- docs/models/Reminders/markShown.html | 169 --- docs/models/Reminders/nextReminders.html | 159 --- docs/models/Reminders/readReminders.html | 159 --- docs/models/Reminders/reminders.html | 158 --- docs/models/Reminders/replaceReminder.html | 171 --- docs/models/Reminders/verifyReminders.html | 175 --- docs/models/RemindersBuilderModel-class.html | 554 --------- .../RemindersBuilderModel.html | 189 --- docs/models/RemindersBuilderModel/build.html | 172 --- .../RemindersBuilderModel/changeCourse.html | 168 --- .../RemindersBuilderModel/changeDay.html | 169 --- .../RemindersBuilderModel/changePeriod.html | 168 --- docs/models/RemindersBuilderModel/course.html | 162 --- .../models/RemindersBuilderModel/courses.html | 161 --- .../models/RemindersBuilderModel/dayName.html | 161 --- .../models/RemindersBuilderModel/message.html | 161 --- .../onMessageChanged.html | 168 --- docs/models/RemindersBuilderModel/period.html | 162 --- .../models/RemindersBuilderModel/periods.html | 176 --- docs/models/RemindersBuilderModel/ready.html | 184 --- .../RemindersBuilderModel/shouldRepeat.html | 163 --- docs/models/RemindersBuilderModel/time.html | 161 --- .../RemindersBuilderModel/toggleRepeat.html | 168 --- .../toggleRepeatType.html | 167 --- docs/models/RemindersBuilderModel/type.html | 161 --- docs/models/ScheduleBuilderModel-class.html | 436 ------- .../ScheduleBuilderModel.html | 149 --- docs/models/ScheduleBuilderModel/name.html | 181 --- .../ScheduleBuilderModel/numPeriods.html | 201 ---- docs/models/ScheduleBuilderModel/periods.html | 153 --- docs/models/ScheduleBuilderModel/preset.html | 152 --- docs/models/ScheduleBuilderModel/ready.html | 160 --- .../ScheduleBuilderModel/replaceTime.html | 162 --- .../models/ScheduleBuilderModel/schedule.html | 157 --- .../ScheduleBuilderModel/usePreset.html | 165 --- docs/models/ScheduleModel-class.html | 633 ---------- docs/models/ScheduleModel/ScheduleModel.html | 159 --- docs/models/ScheduleModel/calendar.html | 169 --- docs/models/ScheduleModel/dispose.html | 185 --- docs/models/ScheduleModel/hasSchool.html | 174 --- docs/models/ScheduleModel/init.html | 184 --- docs/models/ScheduleModel/initCalendar.html | 179 --- .../models/ScheduleModel/isValidReminder.html | 188 --- docs/models/ScheduleModel/nextPeriod.html | 169 --- docs/models/ScheduleModel/nextSubject.html | 174 --- docs/models/ScheduleModel/now.html | 170 --- docs/models/ScheduleModel/onNewPeriod.html | 211 ---- docs/models/ScheduleModel/period.html | 169 --- docs/models/ScheduleModel/periodIndex.html | 169 --- docs/models/ScheduleModel/periods.html | 169 --- docs/models/ScheduleModel/reminders.html | 169 --- .../ScheduleModel/remindersListener.html | 172 --- .../ScheduleModel/scheduleReminders.html | 205 ---- docs/models/ScheduleModel/setToday.html | 189 --- docs/models/ScheduleModel/subject.html | 174 --- docs/models/ScheduleModel/subjects.html | 169 --- docs/models/ScheduleModel/timer.html | 171 --- .../ScheduleModel/timerInterval-constant.html | 169 --- docs/models/ScheduleModel/today.html | 169 --- .../models/ScheduleModel/updateReminders.html | 196 ---- docs/models/ScheduleModel/user.html | 169 --- docs/models/ScheduleViewModel-class.html | 417 ------- .../ScheduleViewModel/ScheduleViewModel.html | 157 --- docs/models/ScheduleViewModel/dataModel.html | 152 --- docs/models/ScheduleViewModel/date.html | 194 ---- docs/models/ScheduleViewModel/day.html | 151 --- .../ScheduleViewModel/defatulSchedule.html | 156 --- docs/models/ScheduleViewModel/defaultDay.html | 151 --- docs/models/ScheduleViewModel/update.html | 177 --- docs/models/SortOption-class.html | 303 ----- docs/models/SortOption/hashCode.html | 169 --- docs/models/SortOption/noSuchMethod.html | 177 --- docs/models/SortOption/operator_equals.html | 168 --- docs/models/SortOption/runtimeType.html | 144 --- docs/models/SortOption/toString.html | 147 --- docs/models/Sports-class.html | 457 -------- docs/models/Sports/Sports.html | 144 --- docs/models/Sports/addGame.html | 163 --- docs/models/Sports/delete.html | 160 --- docs/models/Sports/games.html | 154 --- docs/models/Sports/getTodayGames.html | 161 --- docs/models/Sports/init.html | 167 --- docs/models/Sports/now.html | 154 --- docs/models/Sports/replace.html | 166 --- docs/models/Sports/saveGames.html | 158 --- docs/models/Sports/timer.html | 154 --- docs/models/Sports/todayGames.html | 154 --- docs/models/SportsBuilderModel-class.html | 468 -------- .../SportsBuilderModel.html | 163 --- docs/models/SportsBuilderModel/away.html | 184 --- docs/models/SportsBuilderModel/date.html | 184 --- docs/models/SportsBuilderModel/end.html | 184 --- docs/models/SportsBuilderModel/game.html | 168 --- docs/models/SportsBuilderModel/loading.html | 183 --- docs/models/SportsBuilderModel/opponent.html | 184 --- docs/models/SportsBuilderModel/ready.html | 165 --- docs/models/SportsBuilderModel/scores.html | 185 --- docs/models/SportsBuilderModel/sport.html | 184 --- docs/models/SportsBuilderModel/start.html | 184 --- docs/models/SportsBuilderModel/team.html | 184 --- docs/models/SportsModel-class.html | 519 --------- docs/models/SportsModel/SportsModel.html | 165 --- docs/models/SportsModel/adminFunc.html | 167 --- docs/models/SportsModel/data.html | 158 --- docs/models/SportsModel/dispose.html | 173 --- docs/models/SportsModel/divideGames.html | 169 --- docs/models/SportsModel/isAdmin.html | 159 --- docs/models/SportsModel/loading.html | 186 --- docs/models/SportsModel/recentBySport.html | 159 --- docs/models/SportsModel/recents.html | 158 --- docs/models/SportsModel/setup.html | 164 --- docs/models/SportsModel/sortByDate.html | 164 --- docs/models/SportsModel/sortBySport.html | 177 --- docs/models/SportsModel/sortGames.html | 170 --- docs/models/SportsModel/sortOption.html | 187 --- docs/models/SportsModel/upcoming.html | 158 --- docs/models/SportsModel/upcomingBySport.html | 159 --- docs/models/UserModel-class.html | 389 ------- docs/models/UserModel/UserModel.html | 139 --- docs/models/UserModel/adminScopes.html | 149 --- docs/models/UserModel/data.html | 149 --- docs/models/UserModel/init.html | 168 --- docs/models/UserModel/isAdmin.html | 156 --- docs/models/UserModel/subjects.html | 151 --- docs/models/models-library.html | 321 ------ docs/pages/AdminCalendarPage-class.html | 406 ------- .../AdminCalendarPage/AdminCalendarPage.html | 142 --- docs/pages/AdminCalendarPage/createState.html | 168 --- docs/pages/AdminCalendarState-class.html | 558 --------- .../AdminCalendarState.html | 150 --- docs/pages/AdminCalendarState/build.html | 326 ------ .../AdminCalendarState/currentMonth.html | 186 --- docs/pages/AdminCalendarState/dispose.html | 198 ---- docs/pages/AdminCalendarState/initState.html | 196 ---- docs/pages/AdminCalendarState/listener.html | 159 --- docs/pages/AdminCalendarState/loopMonth.html | 168 --- docs/pages/AdminCalendarState/model.html | 157 --- .../AdminCalendarState/months-constant.html | 165 --- .../AdminCalendarState/weekdays-constant.html | 163 --- docs/pages/AdminSchedulesPage-class.html | 406 ------- .../AdminSchedulesPage.html | 142 --- docs/pages/AdminSchedulesPage/build.html | 231 ---- docs/pages/DayBuilder-class.html | 446 -------- docs/pages/DayBuilder/DayBuilder.html | 157 --- docs/pages/DayBuilder/build.html | 272 ----- docs/pages/DayBuilder/date.html | 148 --- docs/pages/DayBuilder/day.html | 151 --- docs/pages/DayBuilder/upload.html | 148 --- docs/pages/FeedbackPage-class.html | 406 ------- docs/pages/FeedbackPage/FeedbackPage.html | 142 --- docs/pages/FeedbackPage/build.html | 232 ---- docs/pages/FormRow-class.html | 462 -------- docs/pages/FormRow/FormRow.editable.html | 176 --- docs/pages/FormRow/FormRow.html | 154 --- docs/pages/FormRow/build.html | 213 ---- docs/pages/FormRow/moreSpace.html | 157 --- docs/pages/FormRow/picker.html | 153 --- docs/pages/FormRow/sized.html | 153 --- docs/pages/FormRow/title.html | 153 --- docs/pages/GenericSportsView-class.html | 469 -------- .../GenericSportsView/GenericSportsView.html | 164 --- docs/pages/GenericSportsView/build.html | 209 ---- docs/pages/GenericSportsView/builder.html | 153 --- docs/pages/GenericSportsView/loading.html | 153 --- docs/pages/GenericSportsView/onRefresh.html | 153 --- docs/pages/GenericSportsView/recents.html | 155 --- docs/pages/GenericSportsView/upcoming.html | 155 --- docs/pages/HomePage-class.html | 415 ------- docs/pages/HomePage/HomePage.html | 144 --- docs/pages/HomePage/createState.html | 169 --- docs/pages/HomePage/pageIndex.html | 146 --- docs/pages/HomePageState-class.html | 491 -------- docs/pages/HomePageState/HomePageState.html | 145 --- docs/pages/HomePageState/build.html | 257 ----- docs/pages/HomePageState/index.html | 152 --- docs/pages/HomePageState/initState.html | 189 --- docs/pages/HomePageState/navItems.html | 156 --- docs/pages/Login-class.html | 425 ------- docs/pages/Login/Login.html | 147 --- docs/pages/Login/createState.html | 169 --- docs/pages/Login/destination.html | 149 --- docs/pages/LoginState-class.html | 525 --------- docs/pages/LoginState/LoginState.html | 147 --- docs/pages/LoginState/build.html | 283 ----- docs/pages/LoginState/initState.html | 194 ---- docs/pages/LoginState/isLoading.html | 157 --- docs/pages/LoginState/onError.html | 199 ---- docs/pages/LoginState/safely.html | 188 --- docs/pages/LoginState/signIn.html | 172 --- docs/pages/NavigationDrawer-class.html | 464 -------- .../NavigationDrawer/NavigationDrawer.html | 147 --- docs/pages/NavigationDrawer/build.html | 314 ----- docs/pages/NavigationDrawer/getRouteName.html | 154 --- .../NavigationDrawer/isScheduleAdmin.html | 156 --- .../pages/NavigationDrawer/isSportsAdmin.html | 156 --- docs/pages/NavigationDrawer/pushRoute.html | 158 --- docs/pages/OldCalendarWidget-class.html | 411 ------- .../OldCalendarWidget/OldCalendarWidget.html | 145 --- docs/pages/OldCalendarWidget/build.html | 221 ---- docs/pages/ReminderBuilder-class.html | 454 -------- .../ReminderBuilder/ReminderBuilder.html | 150 --- docs/pages/ReminderBuilder/buildReminder.html | 161 --- docs/pages/ReminderBuilder/createState.html | 172 --- docs/pages/ReminderBuilder/reminder.html | 154 --- docs/pages/ReminderBuilder/trimString.html | 159 --- docs/pages/ReminderBuilderState-class.html | 484 -------- .../ReminderBuilderState.html | 144 --- docs/pages/ReminderBuilderState/build.html | 364 ------ .../ReminderBuilderState/controller.html | 154 --- .../pages/ReminderBuilderState/initState.html | 188 --- docs/pages/ResponsiveReminders-class.html | 511 --------- .../ResponsiveReminders.html | 152 --- docs/pages/ResponsiveReminders/appBar.html | 160 --- docs/pages/ResponsiveReminders/build.html | 217 ---- .../floatingActionButton.html | 166 --- docs/pages/ResponsiveReminders/model.html | 154 --- docs/pages/ResponsiveSchedule-class.html | 539 --------- .../ResponsiveSchedule.html | 154 --- docs/pages/ResponsiveSchedule/appBar.html | 162 --- docs/pages/ResponsiveSchedule/build.html | 250 ---- .../floatingActionButton.html | 167 --- .../handleInvalidSchedule.html | 165 --- docs/pages/ResponsiveSchedule/model.html | 156 --- docs/pages/ResponsiveSchedule/viewDay.html | 181 --- docs/pages/RouteInitializer-class.html | 474 -------- .../RouteInitializer/RouteInitializer.html | 161 --- docs/pages/RouteInitializer/child.html | 154 --- docs/pages/RouteInitializer/createState.html | 174 --- docs/pages/RouteInitializer/isAllowed.html | 154 --- docs/pages/RouteInitializer/isSignedIn.html | 157 --- docs/pages/RouteInitializer/onError.html | 154 --- docs/pages/RouteInitializer/onFailure.html | 154 --- docs/pages/RouteInitializerState-class.html | 496 -------- .../RouteInitializerState.html | 145 --- docs/pages/RouteInitializerState/build.html | 259 ----- docs/pages/RouteInitializerState/init.html | 176 --- .../RouteInitializerState/initFuture.html | 155 --- .../RouteInitializerState/initState.html | 189 --- docs/pages/Routes-class.html | 398 ------- docs/pages/Routes/Routes.html | 138 --- docs/pages/Routes/calendar-constant.html | 148 --- docs/pages/Routes/feedback-constant.html | 148 --- docs/pages/Routes/hashCode.html | 177 --- docs/pages/Routes/home-constant.html | 148 --- docs/pages/Routes/login-constant.html | 148 --- docs/pages/Routes/noSuchMethod.html | 185 --- docs/pages/Routes/operator_equals.html | 176 --- docs/pages/Routes/reminders-constant.html | 148 --- docs/pages/Routes/runtimeType.html | 152 --- docs/pages/Routes/schedule-constant.html | 148 --- docs/pages/Routes/schedules-constant.html | 148 --- docs/pages/Routes/sports-constant.html | 148 --- docs/pages/Routes/toString.html | 158 --- docs/pages/ScheduleBuilder-class.html | 440 ------- .../ScheduleBuilder/ScheduleBuilder.html | 149 --- docs/pages/ScheduleBuilder/buildSchedule.html | 161 --- docs/pages/ScheduleBuilder/createState.html | 171 --- docs/pages/ScheduleBuilder/preset.html | 151 --- docs/pages/ScheduleBuilderState-class.html | 495 -------- .../ScheduleBuilderState.html | 145 --- docs/pages/ScheduleBuilderState/build.html | 350 ------ .../ScheduleBuilderState/conflicting.html | 158 --- .../ScheduleBuilderState/controller.html | 156 --- .../pages/ScheduleBuilderState/initState.html | 189 --- docs/pages/SportBuilderState-class.html | 495 -------- .../SportBuilderState/SportBuilderState.html | 145 --- docs/pages/SportBuilderState/build.html | 370 ------ docs/pages/SportBuilderState/initState.html | 190 --- .../SportBuilderState/opponentController.html | 155 --- .../SportBuilderState/teamController.html | 155 --- docs/pages/SportsBuilder-class.html | 441 ------- docs/pages/SportsBuilder/SportsBuilder.html | 151 --- docs/pages/SportsBuilder/createGame.html | 162 --- docs/pages/SportsBuilder/createState.html | 171 --- docs/pages/SportsBuilder/parent.html | 151 --- docs/pages/SportsPage-class.html | 406 ------- docs/pages/SportsPage/SportsPage.html | 142 --- docs/pages/SportsPage/build.html | 199 ---- docs/pages/buildAppBar.html | 195 ---- docs/pages/getLayout.html | 198 ---- docs/pages/openMenu.html | 243 ---- docs/pages/pages-library.html | 410 ------- docs/ramaz_services/Auth-class.html | 444 -------- docs/ramaz_services/Auth/Auth.html | 146 --- docs/ramaz_services/Auth/adminScopes.html | 168 --- docs/ramaz_services/Auth/auth.html | 156 --- .../Auth/calendarScope-constant.html | 157 --- docs/ramaz_services/Auth/claims.html | 163 --- docs/ramaz_services/Auth/email.html | 162 --- docs/ramaz_services/Auth/google.html | 156 --- docs/ramaz_services/Auth/hashCode.html | 185 --- docs/ramaz_services/Auth/isAdmin.html | 165 --- docs/ramaz_services/Auth/isCalendarAdmin.html | 162 --- docs/ramaz_services/Auth/isSignedIn.html | 161 --- docs/ramaz_services/Auth/isSportsAdmin.html | 162 --- docs/ramaz_services/Auth/name.html | 161 --- docs/ramaz_services/Auth/noSuchMethod.html | 193 ---- docs/ramaz_services/Auth/operator_equals.html | 184 --- docs/ramaz_services/Auth/runtimeType.html | 160 --- docs/ramaz_services/Auth/signIn.html | 172 --- docs/ramaz_services/Auth/signOut.html | 162 --- .../Auth/sportsScope-constant.html | 157 --- docs/ramaz_services/Auth/toString.html | 166 --- docs/ramaz_services/Crashlytics-class.html | 374 ------ .../Crashlytics/Crashlytics.html | 139 --- .../Crashlytics/didCrashLastTime.html | 152 --- docs/ramaz_services/Crashlytics/hashCode.html | 178 --- docs/ramaz_services/Crashlytics/init.html | 153 --- docs/ramaz_services/Crashlytics/instance.html | 149 --- docs/ramaz_services/Crashlytics/log.html | 154 --- .../Crashlytics/noSuchMethod.html | 186 --- .../Crashlytics/operator_equals.html | 177 --- .../Crashlytics/recordError.html | 160 --- .../Crashlytics/recordFlutterError.html | 152 --- .../Crashlytics/runtimeType.html | 153 --- docs/ramaz_services/Crashlytics/setEmail.html | 154 --- docs/ramaz_services/Crashlytics/signIn.html | 152 --- docs/ramaz_services/Crashlytics/toString.html | 159 --- docs/ramaz_services/Crashlytics/toggle.html | 155 --- .../NoAccountException-class.html | 241 ---- .../NoAccountException.html | 129 --- .../NoAccountException/hashCode.html | 168 --- .../NoAccountException/noSuchMethod.html | 176 --- .../NoAccountException/operator_equals.html | 167 --- .../NoAccountException/runtimeType.html | 143 --- .../NoAccountException/toString.html | 149 --- docs/ramaz_services/Notification-class.html | 311 ----- .../Notification/Notification.html | 146 --- .../Notification/Notification.reminder.html | 146 --- .../ramaz_services/Notification/hashCode.html | 173 --- .../Notification/id-constant.html | 145 --- docs/ramaz_services/Notification/message.html | 144 --- .../Notification/noSuchMethod.html | 181 --- .../Notification/operator_equals.html | 172 --- .../Notification/runtimeType.html | 148 --- docs/ramaz_services/Notification/title.html | 144 --- .../ramaz_services/Notification/toString.html | 154 --- docs/ramaz_services/Notifications-class.html | 349 ------ .../Notifications/Notifications.html | 137 --- .../Notifications/cancelAll.html | 149 --- .../Notifications/hashCode.html | 176 --- docs/ramaz_services/Notifications/init.html | 151 --- .../Notifications/instance.html | 147 --- .../Notifications/noSuchMethod.html | 184 --- .../Notifications/operator_equals.html | 175 --- .../Notifications/pendingNotifications.html | 152 --- .../Notifications/runtimeType.html | 151 --- .../Notifications/scheduleNotification.html | 155 --- .../Notifications/sendNotification.html | 150 --- docs/ramaz_services/Notifications/signIn.html | 150 --- .../Notifications/toString.html | 157 --- docs/ramaz_services/Preferences-class.html | 334 ------ .../Preferences/Preferences.html | 136 --- .../Preferences/brightness.html | 175 --- .../ramaz_services/Preferences/firstTime.html | 155 --- .../Preferences/firstTimeKey-constant.html | 146 --- docs/ramaz_services/Preferences/hashCode.html | 175 --- docs/ramaz_services/Preferences/init.html | 158 --- .../Preferences/lightMode-constant.html | 146 --- .../Preferences/noSuchMethod.html | 183 --- .../Preferences/operator_equals.html | 174 --- .../Preferences/runtimeType.html | 150 --- docs/ramaz_services/Preferences/signIn.html | 155 --- docs/ramaz_services/Preferences/toString.html | 156 --- docs/ramaz_services/Services-class.html | 375 ------ docs/ramaz_services/Services/Services.html | 150 --- docs/ramaz_services/Services/crashlytics.html | 150 --- docs/ramaz_services/Services/database.html | 150 --- docs/ramaz_services/Services/hashCode.html | 179 --- docs/ramaz_services/Services/init.html | 165 --- docs/ramaz_services/Services/instance.html | 150 --- docs/ramaz_services/Services/isReady.html | 150 --- .../ramaz_services/Services/noSuchMethod.html | 187 --- .../Services/notifications.html | 151 --- .../Services/operator_equals.html | 178 --- docs/ramaz_services/Services/prefs.html | 151 --- .../Services/pushNotifications.html | 151 --- docs/ramaz_services/Services/runtimeType.html | 154 --- docs/ramaz_services/Services/services.html | 151 --- docs/ramaz_services/Services/signIn.html | 163 --- docs/ramaz_services/Services/toString.html | 160 --- .../ramaz_services-library.html | 223 ---- docs/static-assets/favicon.png | Bin 5037 -> 0 bytes docs/static-assets/github.css | 99 -- docs/static-assets/highlight.pack.js | 752 ------------ docs/static-assets/play_button.svg | 1 - docs/static-assets/readme.md | 21 - docs/static-assets/script.js | 496 -------- docs/static-assets/styles.css | 1014 ----------------- docs/widgets/ActivityTile-class.html | 453 -------- docs/widgets/ActivityTile/ActivityTile.html | 149 --- docs/widgets/ActivityTile/activity.html | 151 --- docs/widgets/ActivityTile/build.html | 217 ---- .../detailedActivities-constant.html | 154 --- docs/widgets/BrightnessChanger-class.html | 443 ------- .../BrightnessChanger.dropdown.html | 149 --- .../BrightnessChanger/BrightnessChanger.html | 149 --- .../BrightnessChanger.iconButton.html | 149 --- .../BrightnessChanger/createState.html | 171 --- docs/widgets/BrightnessChanger/form.html | 151 --- docs/widgets/BrightnessChangerForm-class.html | 321 ------ .../BrightnessChangerForm/hashCode.html | 169 --- .../BrightnessChangerForm/noSuchMethod.html | 177 --- .../operator_equals.html | 168 --- .../BrightnessChangerForm/runtimeType.html | 144 --- .../BrightnessChangerForm/toString.html | 147 --- .../widgets/BrightnessChangerState-class.html | 516 --------- .../BrightnessChangerState.html | 146 --- .../widgets/BrightnessChangerState/build.html | 283 ----- .../BrightnessChangerState/buttonToggle.html | 170 --- docs/widgets/BrightnessChangerState/icon.html | 168 --- .../BrightnessChangerState/setBrightness.html | 170 --- docs/widgets/CalendarTile-class.html | 464 -------- docs/widgets/CalendarTile/CalendarTile.html | 151 --- docs/widgets/CalendarTile/blank-constant.html | 153 --- docs/widgets/CalendarTile/build.html | 216 ---- docs/widgets/CalendarTile/date.html | 149 --- docs/widgets/CalendarTile/day.html | 152 --- docs/widgets/ClassList-class.html | 466 -------- docs/widgets/ClassList/ClassList.html | 156 --- docs/widgets/ClassList/build.html | 216 ---- docs/widgets/ClassList/day.html | 152 --- docs/widgets/ClassList/getPanel.html | 175 --- docs/widgets/ClassList/headerText.html | 152 --- docs/widgets/ClassList/periods.html | 153 --- docs/widgets/ClassPanel-class.html | 463 -------- docs/widgets/ClassPanel/ClassPanel.html | 158 --- docs/widgets/ClassPanel/activity.html | 152 --- docs/widgets/ClassPanel/build.html | 234 ---- docs/widgets/ClassPanel/children.html | 154 --- docs/widgets/ClassPanel/reminders.html | 154 --- docs/widgets/ClassPanel/title.html | 153 --- docs/widgets/Footer-class.html | 441 ------- docs/widgets/Footer/Footer.html | 140 --- docs/widgets/Footer/build.html | 243 ---- docs/widgets/Footer/textScale-constant.html | 150 --- docs/widgets/LayoutInfo-class.html | 395 ------- docs/widgets/LayoutInfo/LayoutInfo.html | 147 --- docs/widgets/LayoutInfo/hasBottomNavBar.html | 153 --- docs/widgets/LayoutInfo/hasNavRail.html | 153 --- .../widgets/LayoutInfo/hasStandardDrawer.html | 153 --- .../LayoutInfo/hasStandardSideSheet.html | 153 --- docs/widgets/LayoutInfo/hashCode.html | 177 --- docs/widgets/LayoutInfo/isDesktop.html | 154 --- docs/widgets/LayoutInfo/isMobile.html | 153 --- .../widgets/LayoutInfo/isTabletLandscape.html | 153 --- docs/widgets/LayoutInfo/isTabletPortrait.html | 153 --- docs/widgets/LayoutInfo/noSuchMethod.html | 185 --- docs/widgets/LayoutInfo/operator_equals.html | 176 --- docs/widgets/LayoutInfo/runtimeType.html | 152 --- docs/widgets/LayoutInfo/toString.html | 158 --- docs/widgets/LayoutInfo/windowType.html | 148 --- docs/widgets/LinkIcon-class.html | 439 ------- docs/widgets/LinkIcon/LinkIcon.html | 149 --- docs/widgets/LinkIcon/build.html | 194 ---- docs/widgets/LinkIcon/path.html | 150 --- docs/widgets/LinkIcon/url.html | 150 --- docs/widgets/LoadingImage-class.html | 461 -------- docs/widgets/LoadingImage/LoadingImage.html | 152 --- docs/widgets/LoadingImage/aspectRatio.html | 152 --- docs/widgets/LoadingImage/createState.html | 170 --- docs/widgets/LoadingImage/image.html | 150 --- docs/widgets/LoadingImageState-class.html | 543 --------- .../LoadingImageState/LoadingImageState.html | 148 --- .../LoadingImageState/aspectRatio.html | 158 --- docs/widgets/LoadingImageState/build.html | 259 ----- docs/widgets/LoadingImageState/dispose.html | 193 ---- docs/widgets/LoadingImageState/initState.html | 193 ---- docs/widgets/LoadingImageState/listener.html | 158 --- docs/widgets/LoadingImageState/loading.html | 158 --- docs/widgets/LoadingImageState/onLoad.html | 175 --- docs/widgets/LoadingImageState/stream.html | 158 --- docs/widgets/Logos-class.html | 376 ------ docs/widgets/Logos/Logos.html | 136 --- docs/widgets/Logos/drive-constant.html | 149 --- docs/widgets/Logos/google-constant.html | 151 --- docs/widgets/Logos/hashCode.html | 175 --- docs/widgets/Logos/noSuchMethod.html | 183 --- docs/widgets/Logos/operator_equals.html | 174 --- docs/widgets/Logos/outlook-constant.html | 149 --- docs/widgets/Logos/ramazIcon-constant.html | 149 --- docs/widgets/Logos/runtimeType.html | 150 --- docs/widgets/Logos/schoology-constant.html | 149 --- .../widgets/Logos/seniorSystems-constant.html | 149 --- docs/widgets/Logos/toString.html | 156 --- docs/widgets/ModelBuilder.html | 170 --- docs/widgets/ModelListener-class.html | 464 -------- docs/widgets/ModelListener/ModelListener.html | 159 --- docs/widgets/ModelListener/builder.html | 152 --- docs/widgets/ModelListener/child.html | 155 --- docs/widgets/ModelListener/createState.html | 172 --- docs/widgets/ModelListener/dispose.html | 154 --- docs/widgets/ModelListener/model.html | 156 --- docs/widgets/ModelListenerState-class.html | 505 -------- .../ModelListenerState.html | 145 --- docs/widgets/ModelListenerState/build.html | 251 ---- docs/widgets/ModelListenerState/dispose.html | 198 ---- .../widgets/ModelListenerState/initState.html | 189 --- docs/widgets/ModelListenerState/listener.html | 157 --- docs/widgets/ModelListenerState/model.html | 158 --- docs/widgets/NavigationItem-class.html | 522 --------- .../NavigationItem/NavigationItem.html | 155 --- docs/widgets/NavigationItem/appBar.html | 158 --- docs/widgets/NavigationItem/bottomNavBar.html | 162 --- .../NavigationItem/floatingActionButton.html | 158 --- .../floatingActionButtonLocation.html | 158 --- docs/widgets/NavigationItem/icon.html | 156 --- docs/widgets/NavigationItem/label.html | 157 --- docs/widgets/NavigationItem/navRail.html | 162 --- docs/widgets/NavigationItem/sideSheet.html | 158 --- docs/widgets/NextClass-class.html | 463 -------- docs/widgets/NextClass/NextClass.html | 158 --- docs/widgets/NextClass/build.html | 208 ---- docs/widgets/NextClass/next.html | 153 --- docs/widgets/NextClass/period.html | 152 --- docs/widgets/NextClass/reminders.html | 153 --- docs/widgets/NextClass/subject.html | 152 --- docs/widgets/PeriodTile-class.html | 500 -------- docs/widgets/PeriodTile/PeriodTile.html | 162 --- docs/widgets/PeriodTile/activity.html | 155 --- docs/widgets/PeriodTile/build.html | 248 ---- docs/widgets/PeriodTile/end.html | 155 --- docs/widgets/PeriodTile/getRange.html | 163 --- docs/widgets/PeriodTile/index.html | 155 --- docs/widgets/PeriodTile/model.html | 155 --- docs/widgets/PeriodTile/range.html | 155 --- docs/widgets/PeriodTile/start.html | 155 --- docs/widgets/RamazLogos-class.html | 342 ------ docs/widgets/RamazLogos/RamazLogos.html | 134 --- docs/widgets/RamazLogos/hashCode.html | 173 --- docs/widgets/RamazLogos/noSuchMethod.html | 181 --- docs/widgets/RamazLogos/operator_equals.html | 172 --- .../RamazLogos/ramRectangle-constant.html | 150 --- .../RamazLogos/ramSquare-constant.html | 148 --- .../RamazLogos/ramSquareWords-constant.html | 149 --- docs/widgets/RamazLogos/runtimeType.html | 148 --- docs/widgets/RamazLogos/teal-constant.html | 148 --- docs/widgets/RamazLogos/toString.html | 154 --- docs/widgets/ReminderTile-class.html | 440 ------- docs/widgets/ReminderTile/ReminderTile.html | 152 --- docs/widgets/ReminderTile/build.html | 227 ---- docs/widgets/ReminderTile/height.html | 150 --- docs/widgets/ReminderTile/index.html | 150 --- docs/widgets/ResponsiveBuilder-class.html | 439 ------- .../ResponsiveBuilder/ResponsiveBuilder.html | 152 --- docs/widgets/ResponsiveBuilder/build.html | 192 ---- docs/widgets/ResponsiveBuilder/builder.html | 150 --- docs/widgets/ResponsiveBuilder/child.html | 152 --- docs/widgets/ResponsiveScaffold-class.html | 560 --------- .../ResponsiveScaffold.html | 174 --- .../ResponsiveScaffold.navBar.html | 174 --- docs/widgets/ResponsiveScaffold/appBar.html | 161 --- .../ResponsiveScaffold/bodyBuilder.html | 160 --- docs/widgets/ResponsiveScaffold/build.html | 245 ---- docs/widgets/ResponsiveScaffold/drawer.html | 165 --- .../floatingActionButton.html | 161 --- .../floatingActionButtonLocation.html | 160 --- .../widgets/ResponsiveScaffold/hasNavBar.html | 165 --- docs/widgets/ResponsiveScaffold/navIndex.html | 160 --- docs/widgets/ResponsiveScaffold/navItems.html | 165 --- .../ResponsiveScaffold/onNavIndexChanged.html | 160 --- .../ResponsiveScaffold/secondaryDrawer.html | 165 --- .../widgets/ResponsiveScaffold/sideSheet.html | 163 --- docs/widgets/ResponsiveWidgetBuilder.html | 171 --- docs/widgets/ScoreUpdaterState-class.html | 552 --------- .../ScoreUpdaterState/ScoreUpdaterState.html | 149 --- docs/widgets/ScoreUpdaterState/build.html | 305 ----- docs/widgets/ScoreUpdaterState/initState.html | 196 ---- .../ScoreUpdaterState/otherController.html | 159 --- .../widgets/ScoreUpdaterState/otherScore.html | 159 --- .../ScoreUpdaterState/ramazController.html | 159 --- .../widgets/ScoreUpdaterState/ramazScore.html | 159 --- docs/widgets/ScoreUpdaterState/ready.html | 167 --- docs/widgets/ScoreUpdaterState/scores.html | 168 --- docs/widgets/SpecialTile-class.html | 427 ------- docs/widgets/SpecialTile/SpecialTile.html | 147 --- docs/widgets/SpecialTile/build.html | 201 ---- docs/widgets/SpecialTile/child.html | 149 --- docs/widgets/SportsIcons-class.html | 376 ------ docs/widgets/SportsIcons/SportsIcons.html | 136 --- .../SportsIcons/baseball-constant.html | 146 --- .../SportsIcons/basketball-constant.html | 146 --- docs/widgets/SportsIcons/hashCode.html | 175 --- docs/widgets/SportsIcons/hockey-constant.html | 146 --- docs/widgets/SportsIcons/noSuchMethod.html | 183 --- docs/widgets/SportsIcons/operator_equals.html | 174 --- docs/widgets/SportsIcons/runtimeType.html | 150 --- docs/widgets/SportsIcons/soccer-constant.html | 146 --- docs/widgets/SportsIcons/tennis-constant.html | 146 --- docs/widgets/SportsIcons/toString.html | 156 --- .../SportsIcons/volleyball-constant.html | 146 --- docs/widgets/SportsScoreUpdater-class.html | 448 -------- .../SportsScoreUpdater.html | 149 --- .../SportsScoreUpdater/createState.html | 171 --- docs/widgets/SportsScoreUpdater/game.html | 152 --- .../SportsScoreUpdater/updateScores.html | 162 --- docs/widgets/SportsStats-class.html | 452 -------- docs/widgets/SportsStats/SportsStats.html | 155 --- docs/widgets/SportsStats/build.html | 202 ---- docs/widgets/SportsStats/dateTime.html | 154 --- docs/widgets/SportsStats/score.html | 151 --- docs/widgets/SportsStats/team.html | 151 --- docs/widgets/SportsTile-class.html | 500 -------- docs/widgets/SportsTile/SportsTile.html | 154 --- docs/widgets/SportsTile/build.html | 235 ---- docs/widgets/SportsTile/cardColor.html | 167 --- docs/widgets/SportsTile/formatDate.html | 159 --- docs/widgets/SportsTile/game.html | 155 --- docs/widgets/SportsTile/icon.html | 174 --- docs/widgets/SportsTile/onTap.html | 159 --- docs/widgets/SportsTile/padLength.html | 161 --- docs/widgets/ThemeBuilder.html | 168 --- docs/widgets/ThemeChanger-class.html | 513 --------- docs/widgets/ThemeChanger/ThemeChanger.html | 163 --- docs/widgets/ThemeChanger/builder.html | 155 --- docs/widgets/ThemeChanger/createState.html | 175 --- docs/widgets/ThemeChanger/dark.html | 157 --- .../ThemeChanger/defaultBrightness.html | 155 --- docs/widgets/ThemeChanger/light.html | 157 --- docs/widgets/ThemeChanger/of.html | 166 --- docs/widgets/ThemeChanger/themes.html | 157 --- docs/widgets/ThemeChangerState-class.html | 516 --------- .../ThemeChangerState/ThemeChangerState.html | 146 --- .../widgets/ThemeChangerState/brightness.html | 189 --- docs/widgets/ThemeChangerState/build.html | 250 ---- docs/widgets/ThemeChangerState/initState.html | 190 --- docs/widgets/ThemeChangerState/theme.html | 186 --- docs/widgets/ThemeChangerState/themeName.html | 190 --- docs/widgets/caseConverter.html | 174 --- docs/widgets/pickDate.html | 184 --- docs/widgets/widgets-library.html | 523 --------- 1087 files changed, 208713 deletions(-) delete mode 100644 docs/__404error.html delete mode 100644 docs/app/RamLife-class.html delete mode 100644 docs/app/RamLife/RamLife.html delete mode 100644 docs/app/RamLife/build.html delete mode 100644 docs/app/RamLife/hasAdminScope.html delete mode 100644 docs/app/RamLife/routes.html delete mode 100644 docs/app/app-library.html delete mode 100644 docs/categories.json delete mode 100644 docs/constants/DayComparison.html delete mode 100644 docs/constants/DayComparison/isSameDay.html delete mode 100644 docs/constants/RamazColors-class.html delete mode 100644 docs/constants/RamazColors/RamazColors.html delete mode 100644 docs/constants/RamazColors/blue-constant.html delete mode 100644 docs/constants/RamazColors/blueDark-constant.html delete mode 100644 docs/constants/RamazColors/blueLight-constant.html delete mode 100644 docs/constants/RamazColors/gold-constant.html delete mode 100644 docs/constants/RamazColors/goldDark-constant.html delete mode 100644 docs/constants/RamazColors/goldLight-constant.html delete mode 100644 docs/constants/RamazColors/hashCode.html delete mode 100644 docs/constants/RamazColors/noSuchMethod.html delete mode 100644 docs/constants/RamazColors/operator_equals.html delete mode 100644 docs/constants/RamazColors/runtimeType.html delete mode 100644 docs/constants/RamazColors/toString.html delete mode 100644 docs/constants/TimeConverter.html delete mode 100644 docs/constants/TimeConverter/asTime.html delete mode 100644 docs/constants/TimeOfDayConverter.html delete mode 100644 docs/constants/TimeOfDayConverter/asTimeOfDay.html delete mode 100644 docs/constants/Times-class.html delete mode 100644 docs/constants/Times/Times.html delete mode 100644 docs/constants/Times/hashCode.html delete mode 100644 docs/constants/Times/noSuchMethod.html delete mode 100644 docs/constants/Times/operator_equals.html delete mode 100644 docs/constants/Times/runtimeType.html delete mode 100644 docs/constants/Times/schoolEnd-constant.html delete mode 100644 docs/constants/Times/schoolStart-constant.html delete mode 100644 docs/constants/Times/toString.html delete mode 100644 docs/constants/Times/winterFridayDayEnd-constant.html delete mode 100644 docs/constants/Times/winterFridayDayStart-constant.html delete mode 100644 docs/constants/Times/winterFridayMonthEnd-constant.html delete mode 100644 docs/constants/Times/winterFridayMonthStart-constant.html delete mode 100644 docs/constants/Urls-class.html delete mode 100644 docs/constants/Urls/Urls.html delete mode 100644 docs/constants/Urls/email-constant.html delete mode 100644 docs/constants/Urls/googleDrive-constant.html delete mode 100644 docs/constants/Urls/hashCode.html delete mode 100644 docs/constants/Urls/noSuchMethod.html delete mode 100644 docs/constants/Urls/operator_equals.html delete mode 100644 docs/constants/Urls/ramaz-constant.html delete mode 100644 docs/constants/Urls/runtimeType.html delete mode 100644 docs/constants/Urls/schoology-constant.html delete mode 100644 docs/constants/Urls/seniorSystems-constant.html delete mode 100644 docs/constants/Urls/sportsLivestream-constant.html delete mode 100644 docs/constants/Urls/toString.html delete mode 100644 docs/constants/constants-library.html delete mode 100644 docs/data/Activity-class.html delete mode 100644 docs/data/Activity/Activity.fromJson.html delete mode 100644 docs/data/Activity/Activity.grade.html delete mode 100644 docs/data/Activity/Activity.html delete mode 100644 docs/data/Activity/getActivities.html delete mode 100644 docs/data/Activity/hashCode.html delete mode 100644 docs/data/Activity/message.html delete mode 100644 docs/data/Activity/noSuchMethod.html delete mode 100644 docs/data/Activity/operator_equals.html delete mode 100644 docs/data/Activity/runtimeType.html delete mode 100644 docs/data/Activity/toJson.html delete mode 100644 docs/data/Activity/toString.html delete mode 100644 docs/data/Activity/type.html delete mode 100644 docs/data/ActivityType-class.html delete mode 100644 docs/data/ActivityType/hashCode.html delete mode 100644 docs/data/ActivityType/noSuchMethod.html delete mode 100644 docs/data/ActivityType/operator_equals.html delete mode 100644 docs/data/ActivityType/runtimeType.html delete mode 100644 docs/data/ActivityType/toString.html delete mode 100644 docs/data/AdminScope-class.html delete mode 100644 docs/data/AdminScope/hashCode.html delete mode 100644 docs/data/AdminScope/noSuchMethod.html delete mode 100644 docs/data/AdminScope/operator_equals.html delete mode 100644 docs/data/AdminScope/runtimeType.html delete mode 100644 docs/data/AdminScope/toString.html delete mode 100644 docs/data/Advisory-class.html delete mode 100644 docs/data/Advisory/Advisory.fromJson.html delete mode 100644 docs/data/Advisory/Advisory.html delete mode 100644 docs/data/Advisory/hashCode.html delete mode 100644 docs/data/Advisory/id.html delete mode 100644 docs/data/Advisory/noSuchMethod.html delete mode 100644 docs/data/Advisory/operator_equals.html delete mode 100644 docs/data/Advisory/room.html delete mode 100644 docs/data/Advisory/runtimeType.html delete mode 100644 docs/data/Advisory/toString.html delete mode 100644 docs/data/Club-class.html delete mode 100644 docs/data/Club/Club.html delete mode 100644 docs/data/Club/attendance.html delete mode 100644 docs/data/Club/captains.html delete mode 100644 docs/data/Club/description.html delete mode 100644 docs/data/Club/facultyAdvisor.html delete mode 100644 docs/data/Club/formUrl.html delete mode 100644 docs/data/Club/hashCode.html delete mode 100644 docs/data/Club/image.html delete mode 100644 docs/data/Club/members.html delete mode 100644 docs/data/Club/messages.html delete mode 100644 docs/data/Club/name.html delete mode 100644 docs/data/Club/noSuchMethod.html delete mode 100644 docs/data/Club/operator_equals.html delete mode 100644 docs/data/Club/phoneNumberRequested.html delete mode 100644 docs/data/Club/runtimeType.html delete mode 100644 docs/data/Club/shortDescription.html delete mode 100644 docs/data/Club/toString.html delete mode 100644 docs/data/Day-class.html delete mode 100644 docs/data/Day/Day.fromJson.html delete mode 100644 docs/data/Day/Day.html delete mode 100644 docs/data/Day/displayName.html delete mode 100644 docs/data/Day/getCalendar.html delete mode 100644 docs/data/Day/getCurrentPeriod.html delete mode 100644 docs/data/Day/getDate.html delete mode 100644 docs/data/Day/hashCode.html delete mode 100644 docs/data/Day/n.html delete mode 100644 docs/data/Day/name.html delete mode 100644 docs/data/Day/noSuchMethod.html delete mode 100644 docs/data/Day/operator_equals.html delete mode 100644 docs/data/Day/runtimeType.html delete mode 100644 docs/data/Day/schedule.html delete mode 100644 docs/data/Day/toJson.html delete mode 100644 docs/data/Day/toString.html delete mode 100644 docs/data/Feedback-class.html delete mode 100644 docs/data/Feedback/Feedback.html delete mode 100644 docs/data/Feedback/anonymous.html delete mode 100644 docs/data/Feedback/email.html delete mode 100644 docs/data/Feedback/hashCode.html delete mode 100644 docs/data/Feedback/message.html delete mode 100644 docs/data/Feedback/name.html delete mode 100644 docs/data/Feedback/noSuchMethod.html delete mode 100644 docs/data/Feedback/operator_equals.html delete mode 100644 docs/data/Feedback/runtimeType.html delete mode 100644 docs/data/Feedback/timestamp.html delete mode 100644 docs/data/Feedback/toJson.html delete mode 100644 docs/data/Feedback/toString.html delete mode 100644 docs/data/Grade-class.html delete mode 100644 docs/data/Grade/hashCode.html delete mode 100644 docs/data/Grade/noSuchMethod.html delete mode 100644 docs/data/Grade/operator_equals.html delete mode 100644 docs/data/Grade/runtimeType.html delete mode 100644 docs/data/Grade/toString.html delete mode 100644 docs/data/GradeActivity-class.html delete mode 100644 docs/data/GradeActivity/GradeActivity.fromJson.html delete mode 100644 docs/data/GradeActivity/GradeActivity.html delete mode 100644 docs/data/GradeActivity/freshmen.html delete mode 100644 docs/data/GradeActivity/hashCode.html delete mode 100644 docs/data/GradeActivity/juniors.html delete mode 100644 docs/data/GradeActivity/noSuchMethod.html delete mode 100644 docs/data/GradeActivity/operator_equals.html delete mode 100644 docs/data/GradeActivity/runtimeType.html delete mode 100644 docs/data/GradeActivity/seniors.html delete mode 100644 docs/data/GradeActivity/sophomores.html delete mode 100644 docs/data/GradeActivity/toString.html delete mode 100644 docs/data/Message-class.html delete mode 100644 docs/data/Message/Message.html delete mode 100644 docs/data/Message/body.html delete mode 100644 docs/data/Message/hashCode.html delete mode 100644 docs/data/Message/noSuchMethod.html delete mode 100644 docs/data/Message/operator_equals.html delete mode 100644 docs/data/Message/runtimeType.html delete mode 100644 docs/data/Message/sender.html delete mode 100644 docs/data/Message/timestamp.html delete mode 100644 docs/data/Message/toString.html delete mode 100644 docs/data/Period-class.html delete mode 100644 docs/data/Period/Period.fromJson.html delete mode 100644 docs/data/Period/Period.html delete mode 100644 docs/data/Period/Period.raw.html delete mode 100644 docs/data/Period/activity.html delete mode 100644 docs/data/Period/copyWith.html delete mode 100644 docs/data/Period/data.html delete mode 100644 docs/data/Period/getInfo.html delete mode 100644 docs/data/Period/getName.html delete mode 100644 docs/data/Period/hashCode.html delete mode 100644 docs/data/Period/id.html delete mode 100644 docs/data/Period/isFree.html delete mode 100644 docs/data/Period/name.html delete mode 100644 docs/data/Period/noSuchMethod.html delete mode 100644 docs/data/Period/operator_equals.html delete mode 100644 docs/data/Period/runtimeType.html delete mode 100644 docs/data/Period/time.html delete mode 100644 docs/data/Period/toJson.html delete mode 100644 docs/data/Period/toString.html delete mode 100644 docs/data/PeriodData-class.html delete mode 100644 docs/data/PeriodData/PeriodData.fromJson.html delete mode 100644 docs/data/PeriodData/PeriodData.html delete mode 100644 docs/data/PeriodData/getList.html delete mode 100644 docs/data/PeriodData/hashCode.html delete mode 100644 docs/data/PeriodData/id.html delete mode 100644 docs/data/PeriodData/noSuchMethod.html delete mode 100644 docs/data/PeriodData/operator_equals.html delete mode 100644 docs/data/PeriodData/room.html delete mode 100644 docs/data/PeriodData/runtimeType.html delete mode 100644 docs/data/PeriodData/toString.html delete mode 100644 docs/data/PeriodReminderTime-class.html delete mode 100644 docs/data/PeriodReminderTime/PeriodReminderTime.fromJson.html delete mode 100644 docs/data/PeriodReminderTime/PeriodReminderTime.html delete mode 100644 docs/data/PeriodReminderTime/dayName.html delete mode 100644 docs/data/PeriodReminderTime/doesApply.html delete mode 100644 docs/data/PeriodReminderTime/hash.html delete mode 100644 docs/data/PeriodReminderTime/period.html delete mode 100644 docs/data/PeriodReminderTime/toJson.html delete mode 100644 docs/data/PeriodReminderTime/toString.html delete mode 100644 docs/data/Range-class.html delete mode 100644 docs/data/Range/Range.fromJson.html delete mode 100644 docs/data/Range/Range.html delete mode 100644 docs/data/Range/Range.nums.html delete mode 100644 docs/data/Range/contains.html delete mode 100644 docs/data/Range/end.html delete mode 100644 docs/data/Range/hashCode.html delete mode 100644 docs/data/Range/noSuchMethod.html delete mode 100644 docs/data/Range/operator_equals.html delete mode 100644 docs/data/Range/operator_greater.html delete mode 100644 docs/data/Range/operator_less.html delete mode 100644 docs/data/Range/runtimeType.html delete mode 100644 docs/data/Range/start.html delete mode 100644 docs/data/Range/toJson.html delete mode 100644 docs/data/Range/toString.html delete mode 100644 docs/data/Reminder-class.html delete mode 100644 docs/data/Reminder/Reminder.fromJson.html delete mode 100644 docs/data/Reminder/Reminder.html delete mode 100644 docs/data/Reminder/fromList.html delete mode 100644 docs/data/Reminder/getReminders.html delete mode 100644 docs/data/Reminder/hash.html delete mode 100644 docs/data/Reminder/hashCode.html delete mode 100644 docs/data/Reminder/message.html delete mode 100644 docs/data/Reminder/noSuchMethod.html delete mode 100644 docs/data/Reminder/operator_equals.html delete mode 100644 docs/data/Reminder/runtimeType.html delete mode 100644 docs/data/Reminder/time.html delete mode 100644 docs/data/Reminder/toJson.html delete mode 100644 docs/data/Reminder/toString.html delete mode 100644 docs/data/ReminderTime-class.html delete mode 100644 docs/data/ReminderTime/ReminderTime.fromJson.html delete mode 100644 docs/data/ReminderTime/ReminderTime.fromType.html delete mode 100644 docs/data/ReminderTime/ReminderTime.html delete mode 100644 docs/data/ReminderTime/doesApply.html delete mode 100644 docs/data/ReminderTime/hash.html delete mode 100644 docs/data/ReminderTime/hashCode.html delete mode 100644 docs/data/ReminderTime/noSuchMethod.html delete mode 100644 docs/data/ReminderTime/operator_equals.html delete mode 100644 docs/data/ReminderTime/repeats.html delete mode 100644 docs/data/ReminderTime/runtimeType.html delete mode 100644 docs/data/ReminderTime/toJson.html delete mode 100644 docs/data/ReminderTime/toString.html delete mode 100644 docs/data/ReminderTime/type.html delete mode 100644 docs/data/ReminderTimeType-class.html delete mode 100644 docs/data/ReminderTimeType/hashCode.html delete mode 100644 docs/data/ReminderTimeType/noSuchMethod.html delete mode 100644 docs/data/ReminderTimeType/operator_equals.html delete mode 100644 docs/data/ReminderTimeType/runtimeType.html delete mode 100644 docs/data/ReminderTimeType/toString.html delete mode 100644 docs/data/Schedule-class.html delete mode 100644 docs/data/Schedule/Schedule.fromJson.html delete mode 100644 docs/data/Schedule/Schedule.html delete mode 100644 docs/data/Schedule/amAssembly-constant.html delete mode 100644 docs/data/Schedule/covid-constant.html delete mode 100644 docs/data/Schedule/early-constant.html delete mode 100644 docs/data/Schedule/fastDay-constant.html delete mode 100644 docs/data/Schedule/friday-constant.html delete mode 100644 docs/data/Schedule/fridayRoshChodesh-constant.html delete mode 100644 docs/data/Schedule/getWinterFriday.html delete mode 100644 docs/data/Schedule/hashCode.html delete mode 100644 docs/data/Schedule/name.html delete mode 100644 docs/data/Schedule/noSuchMethod.html delete mode 100644 docs/data/Schedule/operator_equals.html delete mode 100644 docs/data/Schedule/periods.html delete mode 100644 docs/data/Schedule/pmAssembly-constant.html delete mode 100644 docs/data/Schedule/roshChodesh-constant.html delete mode 100644 docs/data/Schedule/runtimeType.html delete mode 100644 docs/data/Schedule/schedules.html delete mode 100644 docs/data/Schedule/toJson.html delete mode 100644 docs/data/Schedule/toString.html delete mode 100644 docs/data/Schedule/winterFriday-constant.html delete mode 100644 docs/data/Schedule/winterFridayRoshChodesh-constant.html delete mode 100644 docs/data/Scores-class.html delete mode 100644 docs/data/Scores/Scores.fromJson.html delete mode 100644 docs/data/Scores/Scores.html delete mode 100644 docs/data/Scores/didDraw.html delete mode 100644 docs/data/Scores/didWin.html delete mode 100644 docs/data/Scores/getScore.html delete mode 100644 docs/data/Scores/hashCode.html delete mode 100644 docs/data/Scores/isHome.html delete mode 100644 docs/data/Scores/noSuchMethod.html delete mode 100644 docs/data/Scores/operator_equals.html delete mode 100644 docs/data/Scores/otherScore.html delete mode 100644 docs/data/Scores/ramazScore.html delete mode 100644 docs/data/Scores/runtimeType.html delete mode 100644 docs/data/Scores/toJson.html delete mode 100644 docs/data/Scores/toString.html delete mode 100644 docs/data/Sport-class.html delete mode 100644 docs/data/Sport/hashCode.html delete mode 100644 docs/data/Sport/noSuchMethod.html delete mode 100644 docs/data/Sport/operator_equals.html delete mode 100644 docs/data/Sport/runtimeType.html delete mode 100644 docs/data/Sport/toString.html delete mode 100644 docs/data/SportsGame-class.html delete mode 100644 docs/data/SportsGame/SportsGame.fromJson.html delete mode 100644 docs/data/SportsGame/SportsGame.html delete mode 100644 docs/data/SportsGame/awayTeam.html delete mode 100644 docs/data/SportsGame/capitalize.html delete mode 100644 docs/data/SportsGame/date.html delete mode 100644 docs/data/SportsGame/dateTime.html delete mode 100644 docs/data/SportsGame/description.html delete mode 100644 docs/data/SportsGame/fromList.html delete mode 100644 docs/data/SportsGame/getJsonList.html delete mode 100644 docs/data/SportsGame/hashCode.html delete mode 100644 docs/data/SportsGame/homeTeam.html delete mode 100644 docs/data/SportsGame/isHome.html delete mode 100644 docs/data/SportsGame/noSuchMethod.html delete mode 100644 docs/data/SportsGame/operator_equals.html delete mode 100644 docs/data/SportsGame/opponent.html delete mode 100644 docs/data/SportsGame/replaceScores.html delete mode 100644 docs/data/SportsGame/runtimeType.html delete mode 100644 docs/data/SportsGame/scores.html delete mode 100644 docs/data/SportsGame/sport.html delete mode 100644 docs/data/SportsGame/team.html delete mode 100644 docs/data/SportsGame/times.html delete mode 100644 docs/data/SportsGame/toJson.html delete mode 100644 docs/data/SportsGame/toString.html delete mode 100644 docs/data/Subject-class.html delete mode 100644 docs/data/Subject/Subject.fromJson.html delete mode 100644 docs/data/Subject/Subject.html delete mode 100644 docs/data/Subject/getSubjects.html delete mode 100644 docs/data/Subject/hashCode.html delete mode 100644 docs/data/Subject/name.html delete mode 100644 docs/data/Subject/noSuchMethod.html delete mode 100644 docs/data/Subject/operator_equals.html delete mode 100644 docs/data/Subject/runtimeType.html delete mode 100644 docs/data/Subject/teacher.html delete mode 100644 docs/data/Subject/toString.html delete mode 100644 docs/data/Subject/virtualLink.html delete mode 100644 docs/data/SubjectReminderTime-class.html delete mode 100644 docs/data/SubjectReminderTime/SubjectReminderTime.fromJson.html delete mode 100644 docs/data/SubjectReminderTime/SubjectReminderTime.html delete mode 100644 docs/data/SubjectReminderTime/doesApply.html delete mode 100644 docs/data/SubjectReminderTime/hash.html delete mode 100644 docs/data/SubjectReminderTime/name.html delete mode 100644 docs/data/SubjectReminderTime/toJson.html delete mode 100644 docs/data/SubjectReminderTime/toString.html delete mode 100644 docs/data/Time-class.html delete mode 100644 docs/data/Time/Time.fromDateTime.html delete mode 100644 docs/data/Time/Time.fromJson.html delete mode 100644 docs/data/Time/Time.html delete mode 100644 docs/data/Time/hashCode.html delete mode 100644 docs/data/Time/hour.html delete mode 100644 docs/data/Time/minutes.html delete mode 100644 docs/data/Time/noSuchMethod.html delete mode 100644 docs/data/Time/operator_equals.html delete mode 100644 docs/data/Time/operator_greater.html delete mode 100644 docs/data/Time/operator_greater_equal.html delete mode 100644 docs/data/Time/operator_less.html delete mode 100644 docs/data/Time/operator_less_equal.html delete mode 100644 docs/data/Time/runtimeType.html delete mode 100644 docs/data/Time/toJson.html delete mode 100644 docs/data/Time/toString.html delete mode 100644 docs/data/User-class.html delete mode 100644 docs/data/User/User.fromJson.html delete mode 100644 docs/data/User/User.html delete mode 100644 docs/data/User/advisory.html delete mode 100644 docs/data/User/contactInfo.html delete mode 100644 docs/data/User/dayNames.html delete mode 100644 docs/data/User/getPeriods.html delete mode 100644 docs/data/User/grade.html delete mode 100644 docs/data/User/hashCode.html delete mode 100644 docs/data/User/noSuchMethod.html delete mode 100644 docs/data/User/operator_equals.html delete mode 100644 docs/data/User/registeredClubs.html delete mode 100644 docs/data/User/runtimeType.html delete mode 100644 docs/data/User/safeJson.html delete mode 100644 docs/data/User/schedule.html delete mode 100644 docs/data/User/sectionIDs.html delete mode 100644 docs/data/User/toString.html delete mode 100644 docs/data/activityTypeToString.html delete mode 100644 docs/data/adminScopeToString.html delete mode 100644 docs/data/data-library.html delete mode 100644 docs/data/intToGrade.html delete mode 100644 docs/data/parseActivityType.html delete mode 100644 docs/data/parseAdminScope.html delete mode 100644 docs/data/reminderTimeToString-constant.html delete mode 100644 docs/data/sportToString.html delete mode 100644 docs/data/stringToReminderTime-constant.html delete mode 100644 docs/data/stringToSport-constant.html delete mode 100644 docs/generated_plugin_registrant/generated_plugin_registrant-library.html delete mode 100644 docs/generated_plugin_registrant/registerPlugins.html delete mode 100644 docs/index.html delete mode 100644 docs/index.json delete mode 100644 docs/main/main-library.html delete mode 100644 docs/main/main.html delete mode 100644 docs/models/AdminScheduleModel-class.html delete mode 100644 docs/models/AdminScheduleModel/AdminScheduleModel.html delete mode 100644 docs/models/AdminScheduleModel/createSchedule.html delete mode 100644 docs/models/AdminScheduleModel/deleteSchedule.html delete mode 100644 docs/models/AdminScheduleModel/jsonSchedules.html delete mode 100644 docs/models/AdminScheduleModel/saveSchedules.html delete mode 100644 docs/models/AdminScheduleModel/schedules.html delete mode 100644 docs/models/CalendarDay-class.html delete mode 100644 docs/models/CalendarDay/CalendarDay.html delete mode 100644 docs/models/CalendarDay/date.html delete mode 100644 docs/models/CalendarDay/hashCode.html delete mode 100644 docs/models/CalendarDay/noSuchMethod.html delete mode 100644 docs/models/CalendarDay/operator_equals.html delete mode 100644 docs/models/CalendarDay/runtimeType.html delete mode 100644 docs/models/CalendarDay/schoolDay.html delete mode 100644 docs/models/CalendarDay/toString.html delete mode 100644 docs/models/CalendarEditor-class.html delete mode 100644 docs/models/CalendarEditor/CalendarEditor.html delete mode 100644 docs/models/CalendarEditor/calendar.html delete mode 100644 docs/models/CalendarEditor/currentMonth.html delete mode 100644 docs/models/CalendarEditor/currentYear.html delete mode 100644 docs/models/CalendarEditor/daysInMonth.html delete mode 100644 docs/models/CalendarEditor/dispose.html delete mode 100644 docs/models/CalendarEditor/layoutMonth.html delete mode 100644 docs/models/CalendarEditor/loadMonth.html delete mode 100644 docs/models/CalendarEditor/now.html delete mode 100644 docs/models/CalendarEditor/subscriptions.html delete mode 100644 docs/models/CalendarEditor/updateDay.html delete mode 100644 docs/models/CalendarEditor/years.html delete mode 100644 docs/models/DayBuilderModel-class.html delete mode 100644 docs/models/DayBuilderModel/DayBuilderModel.html delete mode 100644 docs/models/DayBuilderModel/date.html delete mode 100644 docs/models/DayBuilderModel/day.html delete mode 100644 docs/models/DayBuilderModel/hasSchool.html delete mode 100644 docs/models/DayBuilderModel/name.html delete mode 100644 docs/models/DayBuilderModel/ready.html delete mode 100644 docs/models/DayBuilderModel/schedule.html delete mode 100644 docs/models/FeedbackModel-class.html delete mode 100644 docs/models/FeedbackModel/FeedbackModel.html delete mode 100644 docs/models/FeedbackModel/anonymous.html delete mode 100644 docs/models/FeedbackModel/message.html delete mode 100644 docs/models/FeedbackModel/ready.html delete mode 100644 docs/models/FeedbackModel/send.html delete mode 100644 docs/models/HomeModel-class.html delete mode 100644 docs/models/HomeModel/HomeModel.html delete mode 100644 docs/models/HomeModel/dispose.html delete mode 100644 docs/models/HomeModel/refresh.html delete mode 100644 docs/models/Models-class.html delete mode 100644 docs/models/Models/Models.html delete mode 100644 docs/models/Models/dispose.html delete mode 100644 docs/models/Models/init.html delete mode 100644 docs/models/Models/instance.html delete mode 100644 docs/models/Models/isReady.html delete mode 100644 docs/models/Models/reminders.html delete mode 100644 docs/models/Models/schedule.html delete mode 100644 docs/models/Models/sports.html delete mode 100644 docs/models/Models/user.html delete mode 100644 docs/models/Reminders-class.html delete mode 100644 docs/models/Reminders/Reminders.html delete mode 100644 docs/models/Reminders/addReminder.html delete mode 100644 docs/models/Reminders/cleanReminders.html delete mode 100644 docs/models/Reminders/currentReminders.html delete mode 100644 docs/models/Reminders/deleteReminder.html delete mode 100644 docs/models/Reminders/getReminders.html delete mode 100644 docs/models/Reminders/hasNextReminder.html delete mode 100644 docs/models/Reminders/hasReminder.html delete mode 100644 docs/models/Reminders/init.html delete mode 100644 docs/models/Reminders/markShown.html delete mode 100644 docs/models/Reminders/nextReminders.html delete mode 100644 docs/models/Reminders/readReminders.html delete mode 100644 docs/models/Reminders/reminders.html delete mode 100644 docs/models/Reminders/replaceReminder.html delete mode 100644 docs/models/Reminders/verifyReminders.html delete mode 100644 docs/models/RemindersBuilderModel-class.html delete mode 100644 docs/models/RemindersBuilderModel/RemindersBuilderModel.html delete mode 100644 docs/models/RemindersBuilderModel/build.html delete mode 100644 docs/models/RemindersBuilderModel/changeCourse.html delete mode 100644 docs/models/RemindersBuilderModel/changeDay.html delete mode 100644 docs/models/RemindersBuilderModel/changePeriod.html delete mode 100644 docs/models/RemindersBuilderModel/course.html delete mode 100644 docs/models/RemindersBuilderModel/courses.html delete mode 100644 docs/models/RemindersBuilderModel/dayName.html delete mode 100644 docs/models/RemindersBuilderModel/message.html delete mode 100644 docs/models/RemindersBuilderModel/onMessageChanged.html delete mode 100644 docs/models/RemindersBuilderModel/period.html delete mode 100644 docs/models/RemindersBuilderModel/periods.html delete mode 100644 docs/models/RemindersBuilderModel/ready.html delete mode 100644 docs/models/RemindersBuilderModel/shouldRepeat.html delete mode 100644 docs/models/RemindersBuilderModel/time.html delete mode 100644 docs/models/RemindersBuilderModel/toggleRepeat.html delete mode 100644 docs/models/RemindersBuilderModel/toggleRepeatType.html delete mode 100644 docs/models/RemindersBuilderModel/type.html delete mode 100644 docs/models/ScheduleBuilderModel-class.html delete mode 100644 docs/models/ScheduleBuilderModel/ScheduleBuilderModel.html delete mode 100644 docs/models/ScheduleBuilderModel/name.html delete mode 100644 docs/models/ScheduleBuilderModel/numPeriods.html delete mode 100644 docs/models/ScheduleBuilderModel/periods.html delete mode 100644 docs/models/ScheduleBuilderModel/preset.html delete mode 100644 docs/models/ScheduleBuilderModel/ready.html delete mode 100644 docs/models/ScheduleBuilderModel/replaceTime.html delete mode 100644 docs/models/ScheduleBuilderModel/schedule.html delete mode 100644 docs/models/ScheduleBuilderModel/usePreset.html delete mode 100644 docs/models/ScheduleModel-class.html delete mode 100644 docs/models/ScheduleModel/ScheduleModel.html delete mode 100644 docs/models/ScheduleModel/calendar.html delete mode 100644 docs/models/ScheduleModel/dispose.html delete mode 100644 docs/models/ScheduleModel/hasSchool.html delete mode 100644 docs/models/ScheduleModel/init.html delete mode 100644 docs/models/ScheduleModel/initCalendar.html delete mode 100644 docs/models/ScheduleModel/isValidReminder.html delete mode 100644 docs/models/ScheduleModel/nextPeriod.html delete mode 100644 docs/models/ScheduleModel/nextSubject.html delete mode 100644 docs/models/ScheduleModel/now.html delete mode 100644 docs/models/ScheduleModel/onNewPeriod.html delete mode 100644 docs/models/ScheduleModel/period.html delete mode 100644 docs/models/ScheduleModel/periodIndex.html delete mode 100644 docs/models/ScheduleModel/periods.html delete mode 100644 docs/models/ScheduleModel/reminders.html delete mode 100644 docs/models/ScheduleModel/remindersListener.html delete mode 100644 docs/models/ScheduleModel/scheduleReminders.html delete mode 100644 docs/models/ScheduleModel/setToday.html delete mode 100644 docs/models/ScheduleModel/subject.html delete mode 100644 docs/models/ScheduleModel/subjects.html delete mode 100644 docs/models/ScheduleModel/timer.html delete mode 100644 docs/models/ScheduleModel/timerInterval-constant.html delete mode 100644 docs/models/ScheduleModel/today.html delete mode 100644 docs/models/ScheduleModel/updateReminders.html delete mode 100644 docs/models/ScheduleModel/user.html delete mode 100644 docs/models/ScheduleViewModel-class.html delete mode 100644 docs/models/ScheduleViewModel/ScheduleViewModel.html delete mode 100644 docs/models/ScheduleViewModel/dataModel.html delete mode 100644 docs/models/ScheduleViewModel/date.html delete mode 100644 docs/models/ScheduleViewModel/day.html delete mode 100644 docs/models/ScheduleViewModel/defatulSchedule.html delete mode 100644 docs/models/ScheduleViewModel/defaultDay.html delete mode 100644 docs/models/ScheduleViewModel/update.html delete mode 100644 docs/models/SortOption-class.html delete mode 100644 docs/models/SortOption/hashCode.html delete mode 100644 docs/models/SortOption/noSuchMethod.html delete mode 100644 docs/models/SortOption/operator_equals.html delete mode 100644 docs/models/SortOption/runtimeType.html delete mode 100644 docs/models/SortOption/toString.html delete mode 100644 docs/models/Sports-class.html delete mode 100644 docs/models/Sports/Sports.html delete mode 100644 docs/models/Sports/addGame.html delete mode 100644 docs/models/Sports/delete.html delete mode 100644 docs/models/Sports/games.html delete mode 100644 docs/models/Sports/getTodayGames.html delete mode 100644 docs/models/Sports/init.html delete mode 100644 docs/models/Sports/now.html delete mode 100644 docs/models/Sports/replace.html delete mode 100644 docs/models/Sports/saveGames.html delete mode 100644 docs/models/Sports/timer.html delete mode 100644 docs/models/Sports/todayGames.html delete mode 100644 docs/models/SportsBuilderModel-class.html delete mode 100644 docs/models/SportsBuilderModel/SportsBuilderModel.html delete mode 100644 docs/models/SportsBuilderModel/away.html delete mode 100644 docs/models/SportsBuilderModel/date.html delete mode 100644 docs/models/SportsBuilderModel/end.html delete mode 100644 docs/models/SportsBuilderModel/game.html delete mode 100644 docs/models/SportsBuilderModel/loading.html delete mode 100644 docs/models/SportsBuilderModel/opponent.html delete mode 100644 docs/models/SportsBuilderModel/ready.html delete mode 100644 docs/models/SportsBuilderModel/scores.html delete mode 100644 docs/models/SportsBuilderModel/sport.html delete mode 100644 docs/models/SportsBuilderModel/start.html delete mode 100644 docs/models/SportsBuilderModel/team.html delete mode 100644 docs/models/SportsModel-class.html delete mode 100644 docs/models/SportsModel/SportsModel.html delete mode 100644 docs/models/SportsModel/adminFunc.html delete mode 100644 docs/models/SportsModel/data.html delete mode 100644 docs/models/SportsModel/dispose.html delete mode 100644 docs/models/SportsModel/divideGames.html delete mode 100644 docs/models/SportsModel/isAdmin.html delete mode 100644 docs/models/SportsModel/loading.html delete mode 100644 docs/models/SportsModel/recentBySport.html delete mode 100644 docs/models/SportsModel/recents.html delete mode 100644 docs/models/SportsModel/setup.html delete mode 100644 docs/models/SportsModel/sortByDate.html delete mode 100644 docs/models/SportsModel/sortBySport.html delete mode 100644 docs/models/SportsModel/sortGames.html delete mode 100644 docs/models/SportsModel/sortOption.html delete mode 100644 docs/models/SportsModel/upcoming.html delete mode 100644 docs/models/SportsModel/upcomingBySport.html delete mode 100644 docs/models/UserModel-class.html delete mode 100644 docs/models/UserModel/UserModel.html delete mode 100644 docs/models/UserModel/adminScopes.html delete mode 100644 docs/models/UserModel/data.html delete mode 100644 docs/models/UserModel/init.html delete mode 100644 docs/models/UserModel/isAdmin.html delete mode 100644 docs/models/UserModel/subjects.html delete mode 100644 docs/models/models-library.html delete mode 100644 docs/pages/AdminCalendarPage-class.html delete mode 100644 docs/pages/AdminCalendarPage/AdminCalendarPage.html delete mode 100644 docs/pages/AdminCalendarPage/createState.html delete mode 100644 docs/pages/AdminCalendarState-class.html delete mode 100644 docs/pages/AdminCalendarState/AdminCalendarState.html delete mode 100644 docs/pages/AdminCalendarState/build.html delete mode 100644 docs/pages/AdminCalendarState/currentMonth.html delete mode 100644 docs/pages/AdminCalendarState/dispose.html delete mode 100644 docs/pages/AdminCalendarState/initState.html delete mode 100644 docs/pages/AdminCalendarState/listener.html delete mode 100644 docs/pages/AdminCalendarState/loopMonth.html delete mode 100644 docs/pages/AdminCalendarState/model.html delete mode 100644 docs/pages/AdminCalendarState/months-constant.html delete mode 100644 docs/pages/AdminCalendarState/weekdays-constant.html delete mode 100644 docs/pages/AdminSchedulesPage-class.html delete mode 100644 docs/pages/AdminSchedulesPage/AdminSchedulesPage.html delete mode 100644 docs/pages/AdminSchedulesPage/build.html delete mode 100644 docs/pages/DayBuilder-class.html delete mode 100644 docs/pages/DayBuilder/DayBuilder.html delete mode 100644 docs/pages/DayBuilder/build.html delete mode 100644 docs/pages/DayBuilder/date.html delete mode 100644 docs/pages/DayBuilder/day.html delete mode 100644 docs/pages/DayBuilder/upload.html delete mode 100644 docs/pages/FeedbackPage-class.html delete mode 100644 docs/pages/FeedbackPage/FeedbackPage.html delete mode 100644 docs/pages/FeedbackPage/build.html delete mode 100644 docs/pages/FormRow-class.html delete mode 100644 docs/pages/FormRow/FormRow.editable.html delete mode 100644 docs/pages/FormRow/FormRow.html delete mode 100644 docs/pages/FormRow/build.html delete mode 100644 docs/pages/FormRow/moreSpace.html delete mode 100644 docs/pages/FormRow/picker.html delete mode 100644 docs/pages/FormRow/sized.html delete mode 100644 docs/pages/FormRow/title.html delete mode 100644 docs/pages/GenericSportsView-class.html delete mode 100644 docs/pages/GenericSportsView/GenericSportsView.html delete mode 100644 docs/pages/GenericSportsView/build.html delete mode 100644 docs/pages/GenericSportsView/builder.html delete mode 100644 docs/pages/GenericSportsView/loading.html delete mode 100644 docs/pages/GenericSportsView/onRefresh.html delete mode 100644 docs/pages/GenericSportsView/recents.html delete mode 100644 docs/pages/GenericSportsView/upcoming.html delete mode 100644 docs/pages/HomePage-class.html delete mode 100644 docs/pages/HomePage/HomePage.html delete mode 100644 docs/pages/HomePage/createState.html delete mode 100644 docs/pages/HomePage/pageIndex.html delete mode 100644 docs/pages/HomePageState-class.html delete mode 100644 docs/pages/HomePageState/HomePageState.html delete mode 100644 docs/pages/HomePageState/build.html delete mode 100644 docs/pages/HomePageState/index.html delete mode 100644 docs/pages/HomePageState/initState.html delete mode 100644 docs/pages/HomePageState/navItems.html delete mode 100644 docs/pages/Login-class.html delete mode 100644 docs/pages/Login/Login.html delete mode 100644 docs/pages/Login/createState.html delete mode 100644 docs/pages/Login/destination.html delete mode 100644 docs/pages/LoginState-class.html delete mode 100644 docs/pages/LoginState/LoginState.html delete mode 100644 docs/pages/LoginState/build.html delete mode 100644 docs/pages/LoginState/initState.html delete mode 100644 docs/pages/LoginState/isLoading.html delete mode 100644 docs/pages/LoginState/onError.html delete mode 100644 docs/pages/LoginState/safely.html delete mode 100644 docs/pages/LoginState/signIn.html delete mode 100644 docs/pages/NavigationDrawer-class.html delete mode 100644 docs/pages/NavigationDrawer/NavigationDrawer.html delete mode 100644 docs/pages/NavigationDrawer/build.html delete mode 100644 docs/pages/NavigationDrawer/getRouteName.html delete mode 100644 docs/pages/NavigationDrawer/isScheduleAdmin.html delete mode 100644 docs/pages/NavigationDrawer/isSportsAdmin.html delete mode 100644 docs/pages/NavigationDrawer/pushRoute.html delete mode 100644 docs/pages/OldCalendarWidget-class.html delete mode 100644 docs/pages/OldCalendarWidget/OldCalendarWidget.html delete mode 100644 docs/pages/OldCalendarWidget/build.html delete mode 100644 docs/pages/ReminderBuilder-class.html delete mode 100644 docs/pages/ReminderBuilder/ReminderBuilder.html delete mode 100644 docs/pages/ReminderBuilder/buildReminder.html delete mode 100644 docs/pages/ReminderBuilder/createState.html delete mode 100644 docs/pages/ReminderBuilder/reminder.html delete mode 100644 docs/pages/ReminderBuilder/trimString.html delete mode 100644 docs/pages/ReminderBuilderState-class.html delete mode 100644 docs/pages/ReminderBuilderState/ReminderBuilderState.html delete mode 100644 docs/pages/ReminderBuilderState/build.html delete mode 100644 docs/pages/ReminderBuilderState/controller.html delete mode 100644 docs/pages/ReminderBuilderState/initState.html delete mode 100644 docs/pages/ResponsiveReminders-class.html delete mode 100644 docs/pages/ResponsiveReminders/ResponsiveReminders.html delete mode 100644 docs/pages/ResponsiveReminders/appBar.html delete mode 100644 docs/pages/ResponsiveReminders/build.html delete mode 100644 docs/pages/ResponsiveReminders/floatingActionButton.html delete mode 100644 docs/pages/ResponsiveReminders/model.html delete mode 100644 docs/pages/ResponsiveSchedule-class.html delete mode 100644 docs/pages/ResponsiveSchedule/ResponsiveSchedule.html delete mode 100644 docs/pages/ResponsiveSchedule/appBar.html delete mode 100644 docs/pages/ResponsiveSchedule/build.html delete mode 100644 docs/pages/ResponsiveSchedule/floatingActionButton.html delete mode 100644 docs/pages/ResponsiveSchedule/handleInvalidSchedule.html delete mode 100644 docs/pages/ResponsiveSchedule/model.html delete mode 100644 docs/pages/ResponsiveSchedule/viewDay.html delete mode 100644 docs/pages/RouteInitializer-class.html delete mode 100644 docs/pages/RouteInitializer/RouteInitializer.html delete mode 100644 docs/pages/RouteInitializer/child.html delete mode 100644 docs/pages/RouteInitializer/createState.html delete mode 100644 docs/pages/RouteInitializer/isAllowed.html delete mode 100644 docs/pages/RouteInitializer/isSignedIn.html delete mode 100644 docs/pages/RouteInitializer/onError.html delete mode 100644 docs/pages/RouteInitializer/onFailure.html delete mode 100644 docs/pages/RouteInitializerState-class.html delete mode 100644 docs/pages/RouteInitializerState/RouteInitializerState.html delete mode 100644 docs/pages/RouteInitializerState/build.html delete mode 100644 docs/pages/RouteInitializerState/init.html delete mode 100644 docs/pages/RouteInitializerState/initFuture.html delete mode 100644 docs/pages/RouteInitializerState/initState.html delete mode 100644 docs/pages/Routes-class.html delete mode 100644 docs/pages/Routes/Routes.html delete mode 100644 docs/pages/Routes/calendar-constant.html delete mode 100644 docs/pages/Routes/feedback-constant.html delete mode 100644 docs/pages/Routes/hashCode.html delete mode 100644 docs/pages/Routes/home-constant.html delete mode 100644 docs/pages/Routes/login-constant.html delete mode 100644 docs/pages/Routes/noSuchMethod.html delete mode 100644 docs/pages/Routes/operator_equals.html delete mode 100644 docs/pages/Routes/reminders-constant.html delete mode 100644 docs/pages/Routes/runtimeType.html delete mode 100644 docs/pages/Routes/schedule-constant.html delete mode 100644 docs/pages/Routes/schedules-constant.html delete mode 100644 docs/pages/Routes/sports-constant.html delete mode 100644 docs/pages/Routes/toString.html delete mode 100644 docs/pages/ScheduleBuilder-class.html delete mode 100644 docs/pages/ScheduleBuilder/ScheduleBuilder.html delete mode 100644 docs/pages/ScheduleBuilder/buildSchedule.html delete mode 100644 docs/pages/ScheduleBuilder/createState.html delete mode 100644 docs/pages/ScheduleBuilder/preset.html delete mode 100644 docs/pages/ScheduleBuilderState-class.html delete mode 100644 docs/pages/ScheduleBuilderState/ScheduleBuilderState.html delete mode 100644 docs/pages/ScheduleBuilderState/build.html delete mode 100644 docs/pages/ScheduleBuilderState/conflicting.html delete mode 100644 docs/pages/ScheduleBuilderState/controller.html delete mode 100644 docs/pages/ScheduleBuilderState/initState.html delete mode 100644 docs/pages/SportBuilderState-class.html delete mode 100644 docs/pages/SportBuilderState/SportBuilderState.html delete mode 100644 docs/pages/SportBuilderState/build.html delete mode 100644 docs/pages/SportBuilderState/initState.html delete mode 100644 docs/pages/SportBuilderState/opponentController.html delete mode 100644 docs/pages/SportBuilderState/teamController.html delete mode 100644 docs/pages/SportsBuilder-class.html delete mode 100644 docs/pages/SportsBuilder/SportsBuilder.html delete mode 100644 docs/pages/SportsBuilder/createGame.html delete mode 100644 docs/pages/SportsBuilder/createState.html delete mode 100644 docs/pages/SportsBuilder/parent.html delete mode 100644 docs/pages/SportsPage-class.html delete mode 100644 docs/pages/SportsPage/SportsPage.html delete mode 100644 docs/pages/SportsPage/build.html delete mode 100644 docs/pages/buildAppBar.html delete mode 100644 docs/pages/getLayout.html delete mode 100644 docs/pages/openMenu.html delete mode 100644 docs/pages/pages-library.html delete mode 100644 docs/ramaz_services/Auth-class.html delete mode 100644 docs/ramaz_services/Auth/Auth.html delete mode 100644 docs/ramaz_services/Auth/adminScopes.html delete mode 100644 docs/ramaz_services/Auth/auth.html delete mode 100644 docs/ramaz_services/Auth/calendarScope-constant.html delete mode 100644 docs/ramaz_services/Auth/claims.html delete mode 100644 docs/ramaz_services/Auth/email.html delete mode 100644 docs/ramaz_services/Auth/google.html delete mode 100644 docs/ramaz_services/Auth/hashCode.html delete mode 100644 docs/ramaz_services/Auth/isAdmin.html delete mode 100644 docs/ramaz_services/Auth/isCalendarAdmin.html delete mode 100644 docs/ramaz_services/Auth/isSignedIn.html delete mode 100644 docs/ramaz_services/Auth/isSportsAdmin.html delete mode 100644 docs/ramaz_services/Auth/name.html delete mode 100644 docs/ramaz_services/Auth/noSuchMethod.html delete mode 100644 docs/ramaz_services/Auth/operator_equals.html delete mode 100644 docs/ramaz_services/Auth/runtimeType.html delete mode 100644 docs/ramaz_services/Auth/signIn.html delete mode 100644 docs/ramaz_services/Auth/signOut.html delete mode 100644 docs/ramaz_services/Auth/sportsScope-constant.html delete mode 100644 docs/ramaz_services/Auth/toString.html delete mode 100644 docs/ramaz_services/Crashlytics-class.html delete mode 100644 docs/ramaz_services/Crashlytics/Crashlytics.html delete mode 100644 docs/ramaz_services/Crashlytics/didCrashLastTime.html delete mode 100644 docs/ramaz_services/Crashlytics/hashCode.html delete mode 100644 docs/ramaz_services/Crashlytics/init.html delete mode 100644 docs/ramaz_services/Crashlytics/instance.html delete mode 100644 docs/ramaz_services/Crashlytics/log.html delete mode 100644 docs/ramaz_services/Crashlytics/noSuchMethod.html delete mode 100644 docs/ramaz_services/Crashlytics/operator_equals.html delete mode 100644 docs/ramaz_services/Crashlytics/recordError.html delete mode 100644 docs/ramaz_services/Crashlytics/recordFlutterError.html delete mode 100644 docs/ramaz_services/Crashlytics/runtimeType.html delete mode 100644 docs/ramaz_services/Crashlytics/setEmail.html delete mode 100644 docs/ramaz_services/Crashlytics/signIn.html delete mode 100644 docs/ramaz_services/Crashlytics/toString.html delete mode 100644 docs/ramaz_services/Crashlytics/toggle.html delete mode 100644 docs/ramaz_services/NoAccountException-class.html delete mode 100644 docs/ramaz_services/NoAccountException/NoAccountException.html delete mode 100644 docs/ramaz_services/NoAccountException/hashCode.html delete mode 100644 docs/ramaz_services/NoAccountException/noSuchMethod.html delete mode 100644 docs/ramaz_services/NoAccountException/operator_equals.html delete mode 100644 docs/ramaz_services/NoAccountException/runtimeType.html delete mode 100644 docs/ramaz_services/NoAccountException/toString.html delete mode 100644 docs/ramaz_services/Notification-class.html delete mode 100644 docs/ramaz_services/Notification/Notification.html delete mode 100644 docs/ramaz_services/Notification/Notification.reminder.html delete mode 100644 docs/ramaz_services/Notification/hashCode.html delete mode 100644 docs/ramaz_services/Notification/id-constant.html delete mode 100644 docs/ramaz_services/Notification/message.html delete mode 100644 docs/ramaz_services/Notification/noSuchMethod.html delete mode 100644 docs/ramaz_services/Notification/operator_equals.html delete mode 100644 docs/ramaz_services/Notification/runtimeType.html delete mode 100644 docs/ramaz_services/Notification/title.html delete mode 100644 docs/ramaz_services/Notification/toString.html delete mode 100644 docs/ramaz_services/Notifications-class.html delete mode 100644 docs/ramaz_services/Notifications/Notifications.html delete mode 100644 docs/ramaz_services/Notifications/cancelAll.html delete mode 100644 docs/ramaz_services/Notifications/hashCode.html delete mode 100644 docs/ramaz_services/Notifications/init.html delete mode 100644 docs/ramaz_services/Notifications/instance.html delete mode 100644 docs/ramaz_services/Notifications/noSuchMethod.html delete mode 100644 docs/ramaz_services/Notifications/operator_equals.html delete mode 100644 docs/ramaz_services/Notifications/pendingNotifications.html delete mode 100644 docs/ramaz_services/Notifications/runtimeType.html delete mode 100644 docs/ramaz_services/Notifications/scheduleNotification.html delete mode 100644 docs/ramaz_services/Notifications/sendNotification.html delete mode 100644 docs/ramaz_services/Notifications/signIn.html delete mode 100644 docs/ramaz_services/Notifications/toString.html delete mode 100644 docs/ramaz_services/Preferences-class.html delete mode 100644 docs/ramaz_services/Preferences/Preferences.html delete mode 100644 docs/ramaz_services/Preferences/brightness.html delete mode 100644 docs/ramaz_services/Preferences/firstTime.html delete mode 100644 docs/ramaz_services/Preferences/firstTimeKey-constant.html delete mode 100644 docs/ramaz_services/Preferences/hashCode.html delete mode 100644 docs/ramaz_services/Preferences/init.html delete mode 100644 docs/ramaz_services/Preferences/lightMode-constant.html delete mode 100644 docs/ramaz_services/Preferences/noSuchMethod.html delete mode 100644 docs/ramaz_services/Preferences/operator_equals.html delete mode 100644 docs/ramaz_services/Preferences/runtimeType.html delete mode 100644 docs/ramaz_services/Preferences/signIn.html delete mode 100644 docs/ramaz_services/Preferences/toString.html delete mode 100644 docs/ramaz_services/Services-class.html delete mode 100644 docs/ramaz_services/Services/Services.html delete mode 100644 docs/ramaz_services/Services/crashlytics.html delete mode 100644 docs/ramaz_services/Services/database.html delete mode 100644 docs/ramaz_services/Services/hashCode.html delete mode 100644 docs/ramaz_services/Services/init.html delete mode 100644 docs/ramaz_services/Services/instance.html delete mode 100644 docs/ramaz_services/Services/isReady.html delete mode 100644 docs/ramaz_services/Services/noSuchMethod.html delete mode 100644 docs/ramaz_services/Services/notifications.html delete mode 100644 docs/ramaz_services/Services/operator_equals.html delete mode 100644 docs/ramaz_services/Services/prefs.html delete mode 100644 docs/ramaz_services/Services/pushNotifications.html delete mode 100644 docs/ramaz_services/Services/runtimeType.html delete mode 100644 docs/ramaz_services/Services/services.html delete mode 100644 docs/ramaz_services/Services/signIn.html delete mode 100644 docs/ramaz_services/Services/toString.html delete mode 100644 docs/ramaz_services/ramaz_services-library.html delete mode 100644 docs/static-assets/favicon.png delete mode 100644 docs/static-assets/github.css delete mode 100644 docs/static-assets/highlight.pack.js delete mode 100644 docs/static-assets/play_button.svg delete mode 100644 docs/static-assets/readme.md delete mode 100644 docs/static-assets/script.js delete mode 100644 docs/static-assets/styles.css delete mode 100644 docs/widgets/ActivityTile-class.html delete mode 100644 docs/widgets/ActivityTile/ActivityTile.html delete mode 100644 docs/widgets/ActivityTile/activity.html delete mode 100644 docs/widgets/ActivityTile/build.html delete mode 100644 docs/widgets/ActivityTile/detailedActivities-constant.html delete mode 100644 docs/widgets/BrightnessChanger-class.html delete mode 100644 docs/widgets/BrightnessChanger/BrightnessChanger.dropdown.html delete mode 100644 docs/widgets/BrightnessChanger/BrightnessChanger.html delete mode 100644 docs/widgets/BrightnessChanger/BrightnessChanger.iconButton.html delete mode 100644 docs/widgets/BrightnessChanger/createState.html delete mode 100644 docs/widgets/BrightnessChanger/form.html delete mode 100644 docs/widgets/BrightnessChangerForm-class.html delete mode 100644 docs/widgets/BrightnessChangerForm/hashCode.html delete mode 100644 docs/widgets/BrightnessChangerForm/noSuchMethod.html delete mode 100644 docs/widgets/BrightnessChangerForm/operator_equals.html delete mode 100644 docs/widgets/BrightnessChangerForm/runtimeType.html delete mode 100644 docs/widgets/BrightnessChangerForm/toString.html delete mode 100644 docs/widgets/BrightnessChangerState-class.html delete mode 100644 docs/widgets/BrightnessChangerState/BrightnessChangerState.html delete mode 100644 docs/widgets/BrightnessChangerState/build.html delete mode 100644 docs/widgets/BrightnessChangerState/buttonToggle.html delete mode 100644 docs/widgets/BrightnessChangerState/icon.html delete mode 100644 docs/widgets/BrightnessChangerState/setBrightness.html delete mode 100644 docs/widgets/CalendarTile-class.html delete mode 100644 docs/widgets/CalendarTile/CalendarTile.html delete mode 100644 docs/widgets/CalendarTile/blank-constant.html delete mode 100644 docs/widgets/CalendarTile/build.html delete mode 100644 docs/widgets/CalendarTile/date.html delete mode 100644 docs/widgets/CalendarTile/day.html delete mode 100644 docs/widgets/ClassList-class.html delete mode 100644 docs/widgets/ClassList/ClassList.html delete mode 100644 docs/widgets/ClassList/build.html delete mode 100644 docs/widgets/ClassList/day.html delete mode 100644 docs/widgets/ClassList/getPanel.html delete mode 100644 docs/widgets/ClassList/headerText.html delete mode 100644 docs/widgets/ClassList/periods.html delete mode 100644 docs/widgets/ClassPanel-class.html delete mode 100644 docs/widgets/ClassPanel/ClassPanel.html delete mode 100644 docs/widgets/ClassPanel/activity.html delete mode 100644 docs/widgets/ClassPanel/build.html delete mode 100644 docs/widgets/ClassPanel/children.html delete mode 100644 docs/widgets/ClassPanel/reminders.html delete mode 100644 docs/widgets/ClassPanel/title.html delete mode 100644 docs/widgets/Footer-class.html delete mode 100644 docs/widgets/Footer/Footer.html delete mode 100644 docs/widgets/Footer/build.html delete mode 100644 docs/widgets/Footer/textScale-constant.html delete mode 100644 docs/widgets/LayoutInfo-class.html delete mode 100644 docs/widgets/LayoutInfo/LayoutInfo.html delete mode 100644 docs/widgets/LayoutInfo/hasBottomNavBar.html delete mode 100644 docs/widgets/LayoutInfo/hasNavRail.html delete mode 100644 docs/widgets/LayoutInfo/hasStandardDrawer.html delete mode 100644 docs/widgets/LayoutInfo/hasStandardSideSheet.html delete mode 100644 docs/widgets/LayoutInfo/hashCode.html delete mode 100644 docs/widgets/LayoutInfo/isDesktop.html delete mode 100644 docs/widgets/LayoutInfo/isMobile.html delete mode 100644 docs/widgets/LayoutInfo/isTabletLandscape.html delete mode 100644 docs/widgets/LayoutInfo/isTabletPortrait.html delete mode 100644 docs/widgets/LayoutInfo/noSuchMethod.html delete mode 100644 docs/widgets/LayoutInfo/operator_equals.html delete mode 100644 docs/widgets/LayoutInfo/runtimeType.html delete mode 100644 docs/widgets/LayoutInfo/toString.html delete mode 100644 docs/widgets/LayoutInfo/windowType.html delete mode 100644 docs/widgets/LinkIcon-class.html delete mode 100644 docs/widgets/LinkIcon/LinkIcon.html delete mode 100644 docs/widgets/LinkIcon/build.html delete mode 100644 docs/widgets/LinkIcon/path.html delete mode 100644 docs/widgets/LinkIcon/url.html delete mode 100644 docs/widgets/LoadingImage-class.html delete mode 100644 docs/widgets/LoadingImage/LoadingImage.html delete mode 100644 docs/widgets/LoadingImage/aspectRatio.html delete mode 100644 docs/widgets/LoadingImage/createState.html delete mode 100644 docs/widgets/LoadingImage/image.html delete mode 100644 docs/widgets/LoadingImageState-class.html delete mode 100644 docs/widgets/LoadingImageState/LoadingImageState.html delete mode 100644 docs/widgets/LoadingImageState/aspectRatio.html delete mode 100644 docs/widgets/LoadingImageState/build.html delete mode 100644 docs/widgets/LoadingImageState/dispose.html delete mode 100644 docs/widgets/LoadingImageState/initState.html delete mode 100644 docs/widgets/LoadingImageState/listener.html delete mode 100644 docs/widgets/LoadingImageState/loading.html delete mode 100644 docs/widgets/LoadingImageState/onLoad.html delete mode 100644 docs/widgets/LoadingImageState/stream.html delete mode 100644 docs/widgets/Logos-class.html delete mode 100644 docs/widgets/Logos/Logos.html delete mode 100644 docs/widgets/Logos/drive-constant.html delete mode 100644 docs/widgets/Logos/google-constant.html delete mode 100644 docs/widgets/Logos/hashCode.html delete mode 100644 docs/widgets/Logos/noSuchMethod.html delete mode 100644 docs/widgets/Logos/operator_equals.html delete mode 100644 docs/widgets/Logos/outlook-constant.html delete mode 100644 docs/widgets/Logos/ramazIcon-constant.html delete mode 100644 docs/widgets/Logos/runtimeType.html delete mode 100644 docs/widgets/Logos/schoology-constant.html delete mode 100644 docs/widgets/Logos/seniorSystems-constant.html delete mode 100644 docs/widgets/Logos/toString.html delete mode 100644 docs/widgets/ModelBuilder.html delete mode 100644 docs/widgets/ModelListener-class.html delete mode 100644 docs/widgets/ModelListener/ModelListener.html delete mode 100644 docs/widgets/ModelListener/builder.html delete mode 100644 docs/widgets/ModelListener/child.html delete mode 100644 docs/widgets/ModelListener/createState.html delete mode 100644 docs/widgets/ModelListener/dispose.html delete mode 100644 docs/widgets/ModelListener/model.html delete mode 100644 docs/widgets/ModelListenerState-class.html delete mode 100644 docs/widgets/ModelListenerState/ModelListenerState.html delete mode 100644 docs/widgets/ModelListenerState/build.html delete mode 100644 docs/widgets/ModelListenerState/dispose.html delete mode 100644 docs/widgets/ModelListenerState/initState.html delete mode 100644 docs/widgets/ModelListenerState/listener.html delete mode 100644 docs/widgets/ModelListenerState/model.html delete mode 100644 docs/widgets/NavigationItem-class.html delete mode 100644 docs/widgets/NavigationItem/NavigationItem.html delete mode 100644 docs/widgets/NavigationItem/appBar.html delete mode 100644 docs/widgets/NavigationItem/bottomNavBar.html delete mode 100644 docs/widgets/NavigationItem/floatingActionButton.html delete mode 100644 docs/widgets/NavigationItem/floatingActionButtonLocation.html delete mode 100644 docs/widgets/NavigationItem/icon.html delete mode 100644 docs/widgets/NavigationItem/label.html delete mode 100644 docs/widgets/NavigationItem/navRail.html delete mode 100644 docs/widgets/NavigationItem/sideSheet.html delete mode 100644 docs/widgets/NextClass-class.html delete mode 100644 docs/widgets/NextClass/NextClass.html delete mode 100644 docs/widgets/NextClass/build.html delete mode 100644 docs/widgets/NextClass/next.html delete mode 100644 docs/widgets/NextClass/period.html delete mode 100644 docs/widgets/NextClass/reminders.html delete mode 100644 docs/widgets/NextClass/subject.html delete mode 100644 docs/widgets/PeriodTile-class.html delete mode 100644 docs/widgets/PeriodTile/PeriodTile.html delete mode 100644 docs/widgets/PeriodTile/activity.html delete mode 100644 docs/widgets/PeriodTile/build.html delete mode 100644 docs/widgets/PeriodTile/end.html delete mode 100644 docs/widgets/PeriodTile/getRange.html delete mode 100644 docs/widgets/PeriodTile/index.html delete mode 100644 docs/widgets/PeriodTile/model.html delete mode 100644 docs/widgets/PeriodTile/range.html delete mode 100644 docs/widgets/PeriodTile/start.html delete mode 100644 docs/widgets/RamazLogos-class.html delete mode 100644 docs/widgets/RamazLogos/RamazLogos.html delete mode 100644 docs/widgets/RamazLogos/hashCode.html delete mode 100644 docs/widgets/RamazLogos/noSuchMethod.html delete mode 100644 docs/widgets/RamazLogos/operator_equals.html delete mode 100644 docs/widgets/RamazLogos/ramRectangle-constant.html delete mode 100644 docs/widgets/RamazLogos/ramSquare-constant.html delete mode 100644 docs/widgets/RamazLogos/ramSquareWords-constant.html delete mode 100644 docs/widgets/RamazLogos/runtimeType.html delete mode 100644 docs/widgets/RamazLogos/teal-constant.html delete mode 100644 docs/widgets/RamazLogos/toString.html delete mode 100644 docs/widgets/ReminderTile-class.html delete mode 100644 docs/widgets/ReminderTile/ReminderTile.html delete mode 100644 docs/widgets/ReminderTile/build.html delete mode 100644 docs/widgets/ReminderTile/height.html delete mode 100644 docs/widgets/ReminderTile/index.html delete mode 100644 docs/widgets/ResponsiveBuilder-class.html delete mode 100644 docs/widgets/ResponsiveBuilder/ResponsiveBuilder.html delete mode 100644 docs/widgets/ResponsiveBuilder/build.html delete mode 100644 docs/widgets/ResponsiveBuilder/builder.html delete mode 100644 docs/widgets/ResponsiveBuilder/child.html delete mode 100644 docs/widgets/ResponsiveScaffold-class.html delete mode 100644 docs/widgets/ResponsiveScaffold/ResponsiveScaffold.html delete mode 100644 docs/widgets/ResponsiveScaffold/ResponsiveScaffold.navBar.html delete mode 100644 docs/widgets/ResponsiveScaffold/appBar.html delete mode 100644 docs/widgets/ResponsiveScaffold/bodyBuilder.html delete mode 100644 docs/widgets/ResponsiveScaffold/build.html delete mode 100644 docs/widgets/ResponsiveScaffold/drawer.html delete mode 100644 docs/widgets/ResponsiveScaffold/floatingActionButton.html delete mode 100644 docs/widgets/ResponsiveScaffold/floatingActionButtonLocation.html delete mode 100644 docs/widgets/ResponsiveScaffold/hasNavBar.html delete mode 100644 docs/widgets/ResponsiveScaffold/navIndex.html delete mode 100644 docs/widgets/ResponsiveScaffold/navItems.html delete mode 100644 docs/widgets/ResponsiveScaffold/onNavIndexChanged.html delete mode 100644 docs/widgets/ResponsiveScaffold/secondaryDrawer.html delete mode 100644 docs/widgets/ResponsiveScaffold/sideSheet.html delete mode 100644 docs/widgets/ResponsiveWidgetBuilder.html delete mode 100644 docs/widgets/ScoreUpdaterState-class.html delete mode 100644 docs/widgets/ScoreUpdaterState/ScoreUpdaterState.html delete mode 100644 docs/widgets/ScoreUpdaterState/build.html delete mode 100644 docs/widgets/ScoreUpdaterState/initState.html delete mode 100644 docs/widgets/ScoreUpdaterState/otherController.html delete mode 100644 docs/widgets/ScoreUpdaterState/otherScore.html delete mode 100644 docs/widgets/ScoreUpdaterState/ramazController.html delete mode 100644 docs/widgets/ScoreUpdaterState/ramazScore.html delete mode 100644 docs/widgets/ScoreUpdaterState/ready.html delete mode 100644 docs/widgets/ScoreUpdaterState/scores.html delete mode 100644 docs/widgets/SpecialTile-class.html delete mode 100644 docs/widgets/SpecialTile/SpecialTile.html delete mode 100644 docs/widgets/SpecialTile/build.html delete mode 100644 docs/widgets/SpecialTile/child.html delete mode 100644 docs/widgets/SportsIcons-class.html delete mode 100644 docs/widgets/SportsIcons/SportsIcons.html delete mode 100644 docs/widgets/SportsIcons/baseball-constant.html delete mode 100644 docs/widgets/SportsIcons/basketball-constant.html delete mode 100644 docs/widgets/SportsIcons/hashCode.html delete mode 100644 docs/widgets/SportsIcons/hockey-constant.html delete mode 100644 docs/widgets/SportsIcons/noSuchMethod.html delete mode 100644 docs/widgets/SportsIcons/operator_equals.html delete mode 100644 docs/widgets/SportsIcons/runtimeType.html delete mode 100644 docs/widgets/SportsIcons/soccer-constant.html delete mode 100644 docs/widgets/SportsIcons/tennis-constant.html delete mode 100644 docs/widgets/SportsIcons/toString.html delete mode 100644 docs/widgets/SportsIcons/volleyball-constant.html delete mode 100644 docs/widgets/SportsScoreUpdater-class.html delete mode 100644 docs/widgets/SportsScoreUpdater/SportsScoreUpdater.html delete mode 100644 docs/widgets/SportsScoreUpdater/createState.html delete mode 100644 docs/widgets/SportsScoreUpdater/game.html delete mode 100644 docs/widgets/SportsScoreUpdater/updateScores.html delete mode 100644 docs/widgets/SportsStats-class.html delete mode 100644 docs/widgets/SportsStats/SportsStats.html delete mode 100644 docs/widgets/SportsStats/build.html delete mode 100644 docs/widgets/SportsStats/dateTime.html delete mode 100644 docs/widgets/SportsStats/score.html delete mode 100644 docs/widgets/SportsStats/team.html delete mode 100644 docs/widgets/SportsTile-class.html delete mode 100644 docs/widgets/SportsTile/SportsTile.html delete mode 100644 docs/widgets/SportsTile/build.html delete mode 100644 docs/widgets/SportsTile/cardColor.html delete mode 100644 docs/widgets/SportsTile/formatDate.html delete mode 100644 docs/widgets/SportsTile/game.html delete mode 100644 docs/widgets/SportsTile/icon.html delete mode 100644 docs/widgets/SportsTile/onTap.html delete mode 100644 docs/widgets/SportsTile/padLength.html delete mode 100644 docs/widgets/ThemeBuilder.html delete mode 100644 docs/widgets/ThemeChanger-class.html delete mode 100644 docs/widgets/ThemeChanger/ThemeChanger.html delete mode 100644 docs/widgets/ThemeChanger/builder.html delete mode 100644 docs/widgets/ThemeChanger/createState.html delete mode 100644 docs/widgets/ThemeChanger/dark.html delete mode 100644 docs/widgets/ThemeChanger/defaultBrightness.html delete mode 100644 docs/widgets/ThemeChanger/light.html delete mode 100644 docs/widgets/ThemeChanger/of.html delete mode 100644 docs/widgets/ThemeChanger/themes.html delete mode 100644 docs/widgets/ThemeChangerState-class.html delete mode 100644 docs/widgets/ThemeChangerState/ThemeChangerState.html delete mode 100644 docs/widgets/ThemeChangerState/brightness.html delete mode 100644 docs/widgets/ThemeChangerState/build.html delete mode 100644 docs/widgets/ThemeChangerState/initState.html delete mode 100644 docs/widgets/ThemeChangerState/theme.html delete mode 100644 docs/widgets/ThemeChangerState/themeName.html delete mode 100644 docs/widgets/caseConverter.html delete mode 100644 docs/widgets/pickDate.html delete mode 100644 docs/widgets/widgets-library.html diff --git a/docs/__404error.html b/docs/__404error.html deleted file mode 100644 index c96d986bb..000000000 --- a/docs/__404error.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - ramaz - Dart API docs - - - - - - - - - - - - - - - - -
              - -
              - - -
              ramaz
              - -
              - -
              - - - - -
              -

              404: Something's gone wrong :-(

              - -
              -

              You've tried to visit a page that doesn't exist. Luckily this site - has other pages.

              -

              If you were looking for something specific, try searching: -

              -

              - -
              -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/app/RamLife-class.html b/docs/app/RamLife-class.html deleted file mode 100644 index c5f6ed601..000000000 --- a/docs/app/RamLife-class.html +++ /dev/null @@ -1,417 +0,0 @@ - - - - - - - - RamLife class - app library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              RamLife
              - -
              - -
              - - - - -
              -
              - -

              RamLife class - Null safety - -

              - - -
              -

              The main app widget.

              -
              - - -
              -
              -
              Inheritance
              -
              - - - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - RamLife() -
              -
              - Provides a const constructor. -
              const
              -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              @nonVirtual, read-only, inherited
              - -
              - -
              - key - Key? - -
              -
              - Controls how one widget replaces another widget in the tree. [...] -
              final, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - build(BuildContext context) - Widget - - - -
              -
              - Describes the part of the user interface represented by this widget. [...] -
              override
              - -
              - -
              - createElement() - StatelessElement - - - -
              -
              - Creates a StatelessElement to manage this widget's location in the tree. [...] -
              inherited
              - -
              - -
              - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
              -
              - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
              @protected, inherited
              - -
              - -
              - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
              -
              - Add additional properties associated with the node. [...] -
              inherited
              - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
              -
              - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
              inherited
              - -
              - -
              - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
              -
              - Returns a string representation of this node and its descendants. [...] -
              inherited
              - -
              - -
              - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
              -
              - Returns a one-line detailed description of the object. [...] -
              inherited
              - -
              - -
              - toStringShort() - → String - - - -
              -
              - A short, textual description of this widget. -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              @nonVirtual, inherited
              - -
              - -
              -
              - -
              -

              Static Properties

              - -
              -
              - routes - → Map<String, WidgetBuilder> - -
              -
              - The routes for this app. -
              final
              - -
              - -
              -
              - -
              -

              Static Methods

              -
              -
              - hasAdminScope(AdminScope scope) - → bool - - - -
              -
              - - - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/app/RamLife/RamLife.html b/docs/app/RamLife/RamLife.html deleted file mode 100644 index 9694b2b20..000000000 --- a/docs/app/RamLife/RamLife.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - RamLife constructor - RamLife class - app library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              RamLife
              - -
              - -
              - - - - -
              -
              - -

              RamLife constructor - Null safety -

              - -
              const - RamLife() -
              - - -
              -

              Provides a const constructor.

              -
              - - - -
              -

              Implementation

              -
              const RamLife();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/app/RamLife/build.html b/docs/app/RamLife/build.html deleted file mode 100644 index 04ab6187b..000000000 --- a/docs/app/RamLife/build.html +++ /dev/null @@ -1,270 +0,0 @@ - - - - - - - - build method - RamLife class - app library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              build
              - -
              - -
              - - - - -
              -
              - -

              build method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -Widget -build(
              1. BuildContext context
              2. -
              ) - -
              override
              - -
              - -
              -

              Describes the part of the user interface represented by this widget.

              -

              The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

              -

              The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

              -

              Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

              -

              The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

              -

              The implementation of this method must only depend on:

              - -

              If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

              -

              See also:

              -
                -
              • StatelessWidget, which contains the discussion on performance considerations.
              • -
              -
              - - - -
              -

              Implementation

              -
              @override
              -Widget build (BuildContext context) => ThemeChanger(
              -	defaultBrightness: Brightness.light,
              -	light: ThemeData (
              -		brightness: Brightness.light,
              -		primarySwatch: Colors.blue,
              -		primaryColor: RamazColors.blue,
              -		primaryColorBrightness: Brightness.dark,
              -		primaryColorLight: RamazColors.blueLight,
              -		primaryColorDark: RamazColors.blueDark,
              -		accentColor: RamazColors.gold,
              -		accentColorBrightness: Brightness.light,
              -		textSelectionTheme: const TextSelectionThemeData(
              -			cursorColor: RamazColors.blueLight,
              -			selectionHandleColor: RamazColors.blueLight,
              -		),
              -		buttonColor: RamazColors.gold,
              -		buttonTheme: const ButtonThemeData (
              -			buttonColor: RamazColors.gold,
              -			textTheme: ButtonTextTheme.normal,
              -		),
              -		elevatedButtonTheme: ElevatedButtonThemeData(
              -			style: ButtonStyle(
              -				backgroundColor: MaterialStateProperty.all(RamazColors.gold)
              -			)
              -		)
              -	),
              -	dark: ThemeData(
              -		brightness: Brightness.dark,
              -		scaffoldBackgroundColor: Colors.grey[850],
              -		primarySwatch: Colors.blue,
              -		primaryColorBrightness: Brightness.dark,
              -		primaryColorLight: RamazColors.blueLight,
              -		primaryColorDark: RamazColors.blueDark,
              -		accentColor: RamazColors.goldDark,
              -		accentColorBrightness: Brightness.light,
              -		iconTheme: const IconThemeData (color: RamazColors.goldDark),
              -		primaryIconTheme: const IconThemeData (color: RamazColors.goldDark),
              -		accentIconTheme: const IconThemeData (color: RamazColors.goldDark),
              -		floatingActionButtonTheme: const FloatingActionButtonThemeData(
              -			backgroundColor: RamazColors.goldDark,
              -			foregroundColor: RamazColors.blue
              -		),
              -		textSelectionTheme: const TextSelectionThemeData(
              -			cursorColor: RamazColors.blueLight,
              -			selectionHandleColor: RamazColors.blueLight,
              -		),
              -		cardTheme: CardTheme (
              -			color: Colors.grey[820]
              -		),
              -		toggleableActiveColor: RamazColors.blueLight,
              -		buttonColor: RamazColors.blueDark,
              -		buttonTheme: const ButtonThemeData (
              -			buttonColor: RamazColors.blueDark,
              -			textTheme: ButtonTextTheme.accent,
              -		),
              -		elevatedButtonTheme: ElevatedButtonThemeData(
              -			style: ButtonStyle(
              -				backgroundColor: MaterialStateProperty.all(RamazColors.blueDark)
              -			)
              -		),
              -	),
              -	builder: (BuildContext context, ThemeData theme) => MaterialApp (
              -		initialRoute: Routes.home,
              -		title: "Ram Life",
              -		color: RamazColors.blue,
              -		theme: theme,
              -		onGenerateRoute: (RouteSettings settings) => PageRouteBuilder(
              -        settings: settings,
              -        transitionDuration: Duration.zero,
              -        pageBuilder: (BuildContext context, __, ___) {
              -        	final String routeName =
              -        		(settings.name == null || !routes.containsKey(settings.name))
              -        		? Routes.home : settings.name!;
              -        return routes [routeName]! (context);
              -        },
              -      )
              -	)
              -);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/app/RamLife/hasAdminScope.html b/docs/app/RamLife/hasAdminScope.html deleted file mode 100644 index 5a6fb291f..000000000 --- a/docs/app/RamLife/hasAdminScope.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - hasAdminScope method - RamLife class - app library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hasAdminScope
              - -
              - -
              - - - - -
              -
              - -

              hasAdminScope method - Null safety -

              - -
              - - -bool -hasAdminScope(
              1. AdminScope scope
              2. -
              ) - - - -
              - - - - -
              -

              Implementation

              -
              static bool hasAdminScope(AdminScope scope) => Auth.isSignedIn
              -	&& Models.instance.user.isAdmin
              -	&& Models.instance.user.adminScopes!.contains(scope);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/app/RamLife/routes.html b/docs/app/RamLife/routes.html deleted file mode 100644 index a395179a4..000000000 --- a/docs/app/RamLife/routes.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - routes property - RamLife class - app library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              routes
              - -
              - -
              - - - - -
              -
              - -

              routes property - Null safety -

              - -
              - Map<String, WidgetBuilder> - routes -
              final
              - -
              - -
              -

              The routes for this app.

              -
              - - -
              -

              Implementation

              -
              static final Map<String, WidgetBuilder> routes = {
              -	Routes.login: (_) => RouteInitializer(
              -		onError: null ,
              -		isAllowed: () => true,
              -		child: const Login(),
              -	),
              -	Routes.home: (_) => const RouteInitializer(
              -		child: HomePage(),
              -	),
              -	Routes.schedule: (_) => const RouteInitializer(
              -		child: HomePage(pageIndex: 1),
              -	),
              -	Routes.reminders: (_) => const RouteInitializer(
              -		child: HomePage(pageIndex: 2),
              -	),
              -	Routes.feedback: (_) => const RouteInitializer(
              -		child: FeedbackPage(),
              -	),
              -	Routes.calendar: (_) => RouteInitializer(
              -		isAllowed: () => hasAdminScope(AdminScope.calendar),
              -		child: const AdminCalendarPage(),
              -	),
              -	Routes.schedules: (_) => RouteInitializer(
              -		isAllowed: () => hasAdminScope(AdminScope.calendar),
              -		child: const AdminSchedulesPage(),
              -	),
              -	Routes.sports: (_) => const RouteInitializer(
              -		child: SportsPage(),
              -	),
              -};
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/app/app-library.html b/docs/app/app-library.html deleted file mode 100644 index ee199a1e1..000000000 --- a/docs/app/app-library.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - app library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              app
              - -
              - -
              - - - - -
              -
              - -

              app library - Null safety - -

              - - - - -
              -

              Classes

              - -
              -
              - RamLife - -
              -
              - The main app widget. -
              - -
              -
              - - - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/categories.json b/docs/categories.json deleted file mode 100644 index fe51488c7..000000000 --- a/docs/categories.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/docs/constants/DayComparison.html b/docs/constants/DayComparison.html deleted file mode 100644 index 348ec5e8e..000000000 --- a/docs/constants/DayComparison.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - DayComparison extension - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              DayComparison
              - -
              - -
              - - - - -
              -
              - -

              DayComparison extension - Null safety - -

              - - -
              -

              Has a method for checking if a DateTime is the same day as another.

              -
              - -
              -
              -
              on
              -
              -
                -
              • DateTime
              • -
              -
              -
              -
              - - -
              -

              Methods

              -
              -
              - isSameDay(DateTime other) - → bool - - - -
              -
              - Returns true if other is the same days as this date. - - -
              - -
              -
              - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/DayComparison/isSameDay.html b/docs/constants/DayComparison/isSameDay.html deleted file mode 100644 index 008bf5543..000000000 --- a/docs/constants/DayComparison/isSameDay.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - isSameDay method - DayComparison extension - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              isSameDay
              - -
              - -
              - - - - -
              -
              - -

              isSameDay method - Null safety -

              - -
              - - -bool -isSameDay(
              1. DateTime other
              2. -
              ) - - - -
              - -
              -

              Returns true if other is the same days as this date.

              -
              - - - -
              -

              Implementation

              -
              bool isSameDay(DateTime other) => other.year == year &&
              -	other.month == month &&
              -	other.day == day;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors-class.html b/docs/constants/RamazColors-class.html deleted file mode 100644 index 614522eaf..000000000 --- a/docs/constants/RamazColors-class.html +++ /dev/null @@ -1,346 +0,0 @@ - - - - - - - - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              RamazColors
              - -
              - -
              - - - - -
              -
              - -

              RamazColors class - Null safety - -

              - - -
              -

              A container for Ramaz-specific colors

              -

              blue and gold were taken from seniorelectives.ramaz.org

              -

              The other variants were taken from: -https://material.io/resources/color/#!/?view.left=0&view.right=0&primary.color=074d92&secondary.color=fcc30c

              -
              - - - -
              -

              Constructors

              - -
              -
              - RamazColors() -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - -
              -

              Constants

              - -
              -
              - blue - → const Color - - -
              -
              - Ramaz's brand blue. - - -
              - const Color(0xff074d92) -
              -
              - -
              - blueDark - → const Color - - -
              -
              - The material-specific dark variant of blue. - - -
              - const Color(0xff002664) -
              -
              - -
              - blueLight - → const Color - - -
              -
              - The material-specific light variant of blue. - - -
              - const Color(0xff4e78c3) -
              -
              - -
              - gold - → const Color - - -
              -
              - Ramaz's brand gold. - - -
              - const Color(0xfffcc30c) -
              -
              - -
              - goldDark - → const Color - - -
              -
              - The material-specific dark variant of gold. - - -
              - const Color(0xffc49300) -
              -
              - -
              - goldLight - → const Color - - -
              -
              - The material-specific light variant of gold. - - -
              - const Color(0xfffff552) -
              -
              - -
              -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/RamazColors.html b/docs/constants/RamazColors/RamazColors.html deleted file mode 100644 index 8d7cd64f2..000000000 --- a/docs/constants/RamazColors/RamazColors.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - RamazColors constructor - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              RamazColors
              - -
              - -
              - - - - -
              -
              - -

              RamazColors constructor - Null safety -

              - -
              - RamazColors() -
              - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/blue-constant.html b/docs/constants/RamazColors/blue-constant.html deleted file mode 100644 index 23ae6b11f..000000000 --- a/docs/constants/RamazColors/blue-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - blue constant - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              blue
              - -
              - -
              - - - - -
              -
              - -

              blue constant - Null safety -

              - -
              - Color - const blue - - -
              - -
              -

              Ramaz's brand blue.

              -
              - - -
              -

              Implementation

              -
              static const Color blue = Color(0xff074d92);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/blueDark-constant.html b/docs/constants/RamazColors/blueDark-constant.html deleted file mode 100644 index 2b50ab396..000000000 --- a/docs/constants/RamazColors/blueDark-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - blueDark constant - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              blueDark
              - -
              - -
              - - - - -
              -
              - -

              blueDark constant - Null safety -

              - -
              - Color - const blueDark - - -
              - -
              -

              The material-specific dark variant of blue.

              -
              - - -
              -

              Implementation

              -
              static const Color blueDark = Color (0xff002664);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/blueLight-constant.html b/docs/constants/RamazColors/blueLight-constant.html deleted file mode 100644 index ac00a61a2..000000000 --- a/docs/constants/RamazColors/blueLight-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - blueLight constant - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              blueLight
              - -
              - -
              - - - - -
              -
              - -

              blueLight constant - Null safety -

              - -
              - Color - const blueLight - - -
              - -
              -

              The material-specific light variant of blue.

              -
              - - -
              -

              Implementation

              -
              static const Color blueLight = Color(0xff4e78c3);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/gold-constant.html b/docs/constants/RamazColors/gold-constant.html deleted file mode 100644 index 90ef99105..000000000 --- a/docs/constants/RamazColors/gold-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - gold constant - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              gold
              - -
              - -
              - - - - -
              -
              - -

              gold constant - Null safety -

              - -
              - Color - const gold - - -
              - -
              -

              Ramaz's brand gold.

              -
              - - -
              -

              Implementation

              -
              static const Color gold = Color(0xfffcc30c);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/goldDark-constant.html b/docs/constants/RamazColors/goldDark-constant.html deleted file mode 100644 index aaaa465ac..000000000 --- a/docs/constants/RamazColors/goldDark-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - goldDark constant - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              goldDark
              - -
              - -
              - - - - -
              -
              - -

              goldDark constant - Null safety -

              - -
              - Color - const goldDark - - -
              - -
              -

              The material-specific dark variant of gold.

              -
              - - -
              -

              Implementation

              -
              static const Color goldDark = Color (0xffc49300);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/goldLight-constant.html b/docs/constants/RamazColors/goldLight-constant.html deleted file mode 100644 index 7d1832c87..000000000 --- a/docs/constants/RamazColors/goldLight-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - goldLight constant - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              goldLight
              - -
              - -
              - - - - -
              -
              - -

              goldLight constant - Null safety -

              - -
              - Color - const goldLight - - -
              - -
              -

              The material-specific light variant of gold.

              -
              - - -
              -

              Implementation

              -
              static const Color goldLight = Color (0xfffff552);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/hashCode.html b/docs/constants/RamazColors/hashCode.html deleted file mode 100644 index 58a062be0..000000000 --- a/docs/constants/RamazColors/hashCode.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - hashCode property - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/noSuchMethod.html b/docs/constants/RamazColors/noSuchMethod.html deleted file mode 100644 index 45b64e2ee..000000000 --- a/docs/constants/RamazColors/noSuchMethod.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - noSuchMethod method - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/operator_equals.html b/docs/constants/RamazColors/operator_equals.html deleted file mode 100644 index ac7aa56cd..000000000 --- a/docs/constants/RamazColors/operator_equals.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - operator == method - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/runtimeType.html b/docs/constants/RamazColors/runtimeType.html deleted file mode 100644 index f96dcc51f..000000000 --- a/docs/constants/RamazColors/runtimeType.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - runtimeType property - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/RamazColors/toString.html b/docs/constants/RamazColors/toString.html deleted file mode 100644 index 9193c84fc..000000000 --- a/docs/constants/RamazColors/toString.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - toString method - RamazColors class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              -

              toString method - Null safety -

              - -
              - - -String -toString() - -
              inherited
              - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              external String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/TimeConverter.html b/docs/constants/TimeConverter.html deleted file mode 100644 index 92cf1f20c..000000000 --- a/docs/constants/TimeConverter.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - TimeConverter extension - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              TimeConverter
              - -
              - -
              - - - - -
              -
              - -

              TimeConverter extension - Null safety - -

              - - -
              -

              Extension class for converting TimeOfDay to a Time.

              -
              - -
              -
              -
              on
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - asTime - Time - -
              -
              - Converts this object to a Time. -
              read-only
              - -
              - -
              -
              - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/TimeConverter/asTime.html b/docs/constants/TimeConverter/asTime.html deleted file mode 100644 index b2ab18c0b..000000000 --- a/docs/constants/TimeConverter/asTime.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - asTime property - TimeConverter extension - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              asTime
              - -
              - -
              - - - - -
              -
              - -

              asTime property - Null safety -

              - - - -
              - -
              - Time - asTime - - -
              - - -
              -

              Converts this object to a Time.

              -
              - - -
              -

              Implementation

              -
              Time get asTime => Time(hour, minute);
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/TimeOfDayConverter.html b/docs/constants/TimeOfDayConverter.html deleted file mode 100644 index 0b1c76b75..000000000 --- a/docs/constants/TimeOfDayConverter.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - TimeOfDayConverter extension - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              TimeOfDayConverter
              - -
              - -
              - - - - -
              -
              - -

              TimeOfDayConverter extension - Null safety - -

              - - -
              -

              Extension class for converting Time to a TimeOfDay.

              -

              This cannot be defined in the data library, since it would establish -a dependency on the material library.

              -
              - -
              -
              -
              on
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - asTimeOfDay - TimeOfDay - -
              -
              - Converts this object to a TimeOfDay. -
              read-only
              - -
              - -
              -
              - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/TimeOfDayConverter/asTimeOfDay.html b/docs/constants/TimeOfDayConverter/asTimeOfDay.html deleted file mode 100644 index c3c414ec9..000000000 --- a/docs/constants/TimeOfDayConverter/asTimeOfDay.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - asTimeOfDay property - TimeOfDayConverter extension - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              asTimeOfDay
              - -
              - -
              - - - - -
              -
              - -

              asTimeOfDay property - Null safety -

              - - - -
              - -
              - TimeOfDay - asTimeOfDay - - -
              - - -
              -

              Converts this object to a TimeOfDay.

              -
              - - -
              -

              Implementation

              -
              TimeOfDay get asTimeOfDay => TimeOfDay(hour: hour, minute: minutes);
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times-class.html b/docs/constants/Times-class.html deleted file mode 100644 index f1553d3aa..000000000 --- a/docs/constants/Times-class.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Times
              - -
              - -
              - - - - -
              -
              - -

              Times class - Null safety - -

              - - -
              -

              Some date constants.

              -
              - - - -
              -

              Constructors

              - -
              -
              - Times() -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - -
              -

              Constants

              - -
              -
              - schoolEnd - → const int - - -
              -
              - The month that school ends (July). - - -
              - 7 -
              -
              - -
              - schoolStart - → const int - - -
              -
              - The month that school starts (September). - - -
              - 9 -
              -
              - -
              - winterFridayDayEnd - → const int - - -
              -
              - The date that Winter Fridays end (assume the 1st). - - -
              - 1 -
              -
              - -
              - winterFridayDayStart - → const int - - -
              -
              - The date that Winter Fridays start (assume the 1st). - - -
              - 1 -
              -
              - -
              - winterFridayMonthEnd - → const int - - -
              -
              - The month that winter Fridays end (March). - - -
              - 3 -
              -
              - -
              - winterFridayMonthStart - → const int - - -
              -
              - The month that winter Fridays start (November). - - -
              - 11 -
              -
              - -
              -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/Times.html b/docs/constants/Times/Times.html deleted file mode 100644 index 8e3a0ee19..000000000 --- a/docs/constants/Times/Times.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - Times constructor - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Times
              - -
              - -
              - - - - -
              -
              - -

              Times constructor - Null safety -

              - -
              - Times() -
              - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/hashCode.html b/docs/constants/Times/hashCode.html deleted file mode 100644 index 097752476..000000000 --- a/docs/constants/Times/hashCode.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - hashCode property - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/noSuchMethod.html b/docs/constants/Times/noSuchMethod.html deleted file mode 100644 index e62c06923..000000000 --- a/docs/constants/Times/noSuchMethod.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - noSuchMethod method - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/operator_equals.html b/docs/constants/Times/operator_equals.html deleted file mode 100644 index b13c82d40..000000000 --- a/docs/constants/Times/operator_equals.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - operator == method - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/runtimeType.html b/docs/constants/Times/runtimeType.html deleted file mode 100644 index 95ccf2e25..000000000 --- a/docs/constants/Times/runtimeType.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - runtimeType property - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/schoolEnd-constant.html b/docs/constants/Times/schoolEnd-constant.html deleted file mode 100644 index 23572120d..000000000 --- a/docs/constants/Times/schoolEnd-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - schoolEnd constant - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schoolEnd
              - -
              - -
              - - - - -
              -
              - -

              schoolEnd constant - Null safety -

              - -
              - int - const schoolEnd - - -
              - -
              -

              The month that school ends (July).

              -
              - - -
              -

              Implementation

              -
              static const int schoolEnd = 7;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/schoolStart-constant.html b/docs/constants/Times/schoolStart-constant.html deleted file mode 100644 index 980f7bc93..000000000 --- a/docs/constants/Times/schoolStart-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - schoolStart constant - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schoolStart
              - -
              - -
              - - - - -
              -
              - -

              schoolStart constant - Null safety -

              - -
              - int - const schoolStart - - -
              - -
              -

              The month that school starts (September).

              -
              - - -
              -

              Implementation

              -
              static const int schoolStart = 9;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/toString.html b/docs/constants/Times/toString.html deleted file mode 100644 index 6c6523eca..000000000 --- a/docs/constants/Times/toString.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - toString method - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              -

              toString method - Null safety -

              - -
              - - -String -toString() - -
              inherited
              - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              external String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/winterFridayDayEnd-constant.html b/docs/constants/Times/winterFridayDayEnd-constant.html deleted file mode 100644 index 42e0269f0..000000000 --- a/docs/constants/Times/winterFridayDayEnd-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - winterFridayDayEnd constant - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              winterFridayDayEnd
              - -
              - -
              - - - - -
              -
              - -

              winterFridayDayEnd constant - Null safety -

              - -
              - int - const winterFridayDayEnd - - -
              - -
              -

              The date that Winter Fridays end (assume the 1st).

              -
              - - -
              -

              Implementation

              -
              static const int winterFridayDayEnd = 1;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/winterFridayDayStart-constant.html b/docs/constants/Times/winterFridayDayStart-constant.html deleted file mode 100644 index 6b37e29e7..000000000 --- a/docs/constants/Times/winterFridayDayStart-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - winterFridayDayStart constant - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              winterFridayDayStart
              - -
              - -
              - - - - -
              -
              - -

              winterFridayDayStart constant - Null safety -

              - -
              - int - const winterFridayDayStart - - -
              - -
              -

              The date that Winter Fridays start (assume the 1st).

              -
              - - -
              -

              Implementation

              -
              static const int winterFridayDayStart = 1;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/winterFridayMonthEnd-constant.html b/docs/constants/Times/winterFridayMonthEnd-constant.html deleted file mode 100644 index c37aedeed..000000000 --- a/docs/constants/Times/winterFridayMonthEnd-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - winterFridayMonthEnd constant - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              winterFridayMonthEnd
              - -
              - -
              - - - - -
              -
              - -

              winterFridayMonthEnd constant - Null safety -

              - -
              - int - const winterFridayMonthEnd - - -
              - -
              -

              The month that winter Fridays end (March).

              -
              - - -
              -

              Implementation

              -
              static const int winterFridayMonthEnd = 3;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Times/winterFridayMonthStart-constant.html b/docs/constants/Times/winterFridayMonthStart-constant.html deleted file mode 100644 index 49fe4a433..000000000 --- a/docs/constants/Times/winterFridayMonthStart-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - winterFridayMonthStart constant - Times class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              winterFridayMonthStart
              - -
              - -
              - - - - -
              -
              - -

              winterFridayMonthStart constant - Null safety -

              - -
              - int - const winterFridayMonthStart - - -
              - -
              -

              The month that winter Fridays start (November).

              -
              - - -
              -

              Implementation

              -
              static const int winterFridayMonthStart = 11;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls-class.html b/docs/constants/Urls-class.html deleted file mode 100644 index a13a1ac2d..000000000 --- a/docs/constants/Urls-class.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Urls
              - -
              - -
              - - - - -
              -
              - -

              Urls class - Null safety - -

              - - -
              -

              A collection of URLs used throughout the app

              -
              - - - -
              -

              Constructors

              - -
              -
              - Urls() -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - -
              -

              Constants

              - -
              -
              - email - → const String - - -
              -
              - The URL for Outlook mail. - - -
              - "http://mymail.ramaz.org" -
              -
              - -
              - googleDrive - → const String - - -
              -
              - The URL for Google Drive. - - -
              - "http://drive.google.com" -
              -
              - -
              - ramaz - → const String - - -
              -
              - The URL for the Ramaz website. - - -
              - "https://www.ramaz.org" -
              -
              - -
              - schoology - → const String - - -
              -
              - The URL for schoology. - - -
              - "https://app.schoology.com" -
              -
              - -
              - seniorSystems - → const String - - -
              -
              - The URL for Outlook mail. - - -
              - "https://my.ramaz.org/SeniorApps/facelets/home/home.xhtml" -
              -
              - -
              - sportsLivestream - → const String - - -
              -
              - The URL for Ramaz livestreaming. - - -
              - "https://www.ramaz.org/page.cfm?p=10769" -
              -
              - -
              -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/Urls.html b/docs/constants/Urls/Urls.html deleted file mode 100644 index 9d73ba010..000000000 --- a/docs/constants/Urls/Urls.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - Urls constructor - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Urls
              - -
              - -
              - - - - -
              -
              - -

              Urls constructor - Null safety -

              - -
              - Urls() -
              - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/email-constant.html b/docs/constants/Urls/email-constant.html deleted file mode 100644 index 48df4df8e..000000000 --- a/docs/constants/Urls/email-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - email constant - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              email
              - -
              - -
              - - - - -
              -
              - -

              email constant - Null safety -

              - -
              - String - const email - - -
              - -
              -

              The URL for Outlook mail.

              -
              - - -
              -

              Implementation

              -
              static const String email = "http://mymail.ramaz.org";
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/googleDrive-constant.html b/docs/constants/Urls/googleDrive-constant.html deleted file mode 100644 index f2157d4a7..000000000 --- a/docs/constants/Urls/googleDrive-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - googleDrive constant - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              googleDrive
              - -
              - -
              - - - - -
              -
              - -

              googleDrive constant - Null safety -

              - -
              - String - const googleDrive - - -
              - -
              -

              The URL for Google Drive.

              -
              - - -
              -

              Implementation

              -
              static const String googleDrive = "http://drive.google.com";
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/hashCode.html b/docs/constants/Urls/hashCode.html deleted file mode 100644 index 1ee5d3bc8..000000000 --- a/docs/constants/Urls/hashCode.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - hashCode property - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/noSuchMethod.html b/docs/constants/Urls/noSuchMethod.html deleted file mode 100644 index 1b383bbb2..000000000 --- a/docs/constants/Urls/noSuchMethod.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - noSuchMethod method - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/operator_equals.html b/docs/constants/Urls/operator_equals.html deleted file mode 100644 index 931d6c805..000000000 --- a/docs/constants/Urls/operator_equals.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - operator == method - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/ramaz-constant.html b/docs/constants/Urls/ramaz-constant.html deleted file mode 100644 index cb6b95dc9..000000000 --- a/docs/constants/Urls/ramaz-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - ramaz constant - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ramaz
              - -
              - -
              - - - - -
              -
              - -

              ramaz constant - Null safety -

              - -
              - String - const ramaz - - -
              - -
              -

              The URL for the Ramaz website.

              -
              - - -
              -

              Implementation

              -
              static const String ramaz = "https://www.ramaz.org";
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/runtimeType.html b/docs/constants/Urls/runtimeType.html deleted file mode 100644 index 6380ececc..000000000 --- a/docs/constants/Urls/runtimeType.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - runtimeType property - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/schoology-constant.html b/docs/constants/Urls/schoology-constant.html deleted file mode 100644 index 20d4790ae..000000000 --- a/docs/constants/Urls/schoology-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - schoology constant - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schoology
              - -
              - -
              - - - - -
              -
              - -

              schoology constant - Null safety -

              - -
              - String - const schoology - - -
              - -
              -

              The URL for schoology.

              -
              - - -
              -

              Implementation

              -
              static const String schoology = "https://app.schoology.com";
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/seniorSystems-constant.html b/docs/constants/Urls/seniorSystems-constant.html deleted file mode 100644 index 1de29cd4e..000000000 --- a/docs/constants/Urls/seniorSystems-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - seniorSystems constant - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              seniorSystems
              - -
              - -
              - - - - -
              -
              - -

              seniorSystems constant - Null safety -

              - -
              - String - const seniorSystems - - -
              - -
              -

              The URL for Outlook mail.

              -
              - - -
              -

              Implementation

              -
              static const String seniorSystems = "https://my.ramaz.org/SeniorApps/facelets/home/home.xhtml";
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/sportsLivestream-constant.html b/docs/constants/Urls/sportsLivestream-constant.html deleted file mode 100644 index c455e240d..000000000 --- a/docs/constants/Urls/sportsLivestream-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - sportsLivestream constant - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              sportsLivestream
              - -
              - -
              - - - - -
              -
              - -

              sportsLivestream constant - Null safety -

              - -
              - String - const sportsLivestream - - -
              - -
              -

              The URL for Ramaz livestreaming.

              -
              - - -
              -

              Implementation

              -
              static const String sportsLivestream = "https://www.ramaz.org/page.cfm?p=10769";
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/Urls/toString.html b/docs/constants/Urls/toString.html deleted file mode 100644 index df6387a5e..000000000 --- a/docs/constants/Urls/toString.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - toString method - Urls class - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              -

              toString method - Null safety -

              - -
              - - -String -toString() - -
              inherited
              - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              external String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/constants/constants-library.html b/docs/constants/constants-library.html deleted file mode 100644 index 6a7f98a64..000000000 --- a/docs/constants/constants-library.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - - constants library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              constants
              - -
              - -
              - - - - -
              -
              - -

              constants library - Null safety - -

              - - - - -
              -

              Classes

              - -
              -
              - RamazColors - -
              -
              - A container for Ramaz-specific colors [...] -
              - -
              - Times - -
              -
              - Some date constants. -
              - -
              - Urls - -
              -
              - A collection of URLs used throughout the app -
              - -
              -
              - - -
              -

              Extensions

              - -
              -
              - DayComparison - -
              -
              - Has a method for checking if a DateTime is the same day as another. -
              - - -
              - TimeConverter - -
              -
              - Extension class for converting TimeOfDay to a Time. -
              - - -
              - TimeOfDayConverter - -
              -
              - Extension class for converting Time to a TimeOfDay. [...] -
              - - -
              -
              - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity-class.html b/docs/data/Activity-class.html deleted file mode 100644 index 9bdce8151..000000000 --- a/docs/data/Activity-class.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - - - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Activity
              - -
              - -
              - - - - -
              -
              - -

              Activity class - Null safety - -

              - - -
              -

              An activity during a period.

              -

              Students can either be directed to their advisories or to a certain room. -See ActivityType for a description of different activities.

              -

              Activities can also be nested.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - Activity({required ActivityType type, required String message}) -
              -
              - Creates an activity. -
              const
              -
              -
              - Activity.fromJson(Map json) -
              -
              - Creates an activity from a JSON object. -
              factory
              -
              -
              - Activity.grade(GradeActivity gradeActivty) -
              -
              - Creates an activity for each grade -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - message - → String - -
              -
              - A message to be displayed with this activity. [...] -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - type - ActivityType - -
              -
              - The type of this activity. -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - -
              -

              Static Methods

              -
              -
              - getActivities(Map json) - → Map<String, Activity> - - - -
              -
              - Parses a JSON map of Activities still in JSON. - - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/Activity.fromJson.html b/docs/data/Activity/Activity.fromJson.html deleted file mode 100644 index d060b68c0..000000000 --- a/docs/data/Activity/Activity.fromJson.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - Activity.fromJson constructor - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Activity.fromJson
              - -
              - -
              - - - - -
              -
              - -

              Activity.fromJson constructor - Null safety -

              - -
              - Activity.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Creates an activity from a JSON object.

              -
              - - - -
              -

              Implementation

              -
              factory Activity.fromJson(Map json) => json ["message"] is Map
              -	? Activity.grade(
              -		GradeActivity.fromJson(Map.from(json ["message"]))
              -	)
              -	: Activity(
              -		type: parseActivityType(json ["type"]),
              -		message: json ["message"]
              -	);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/Activity.grade.html b/docs/data/Activity/Activity.grade.html deleted file mode 100644 index 95854ac51..000000000 --- a/docs/data/Activity/Activity.grade.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - Activity.grade constructor - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Activity.grade
              - -
              - -
              - - - - -
              -
              - -

              Activity.grade constructor - Null safety -

              - -
              - Activity.grade(
              1. GradeActivity gradeActivty
              2. -
              ) -
              - - -
              -

              Creates an activity for each grade

              -
              - - - -
              -

              Implementation

              -
              Activity.grade(GradeActivity gradeActivty) :
              -	message = gradeActivty.toString(),
              -	type = ActivityType.grade;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/Activity.html b/docs/data/Activity/Activity.html deleted file mode 100644 index 9aa7fe5c6..000000000 --- a/docs/data/Activity/Activity.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - Activity constructor - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Activity
              - -
              - -
              - - - - -
              -
              - -

              Activity constructor - Null safety -

              - -
              const - Activity(
              1. {required ActivityType type,
              2. -
              3. required String message}
              4. -
              ) -
              - - -
              -

              Creates an activity.

              -
              - - - -
              -

              Implementation

              -
              const Activity({
              -	required this.type,
              -	required this.message,
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/getActivities.html b/docs/data/Activity/getActivities.html deleted file mode 100644 index be50d01b9..000000000 --- a/docs/data/Activity/getActivities.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - getActivities method - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getActivities
              - -
              - -
              - - - - -
              -
              - -

              getActivities method - Null safety -

              - -
              - - -Map<String, Activity> -getActivities(
              1. Map json
              2. -
              ) - - - -
              - -
              -

              Parses a JSON map of Activities still in JSON.

              -
              - - - -
              -

              Implementation

              -
              static Map<String, Activity> getActivities(Map json) {
              -	final Map<String, Activity> result = {};
              -	for (final MapEntry entry in json.entries) {
              -		result [entry.key] = Activity.fromJson(
              -			Map.from(entry.value)
              -		);
              -	}
              -	return result;
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/hashCode.html b/docs/data/Activity/hashCode.html deleted file mode 100644 index 8bc4aa52a..000000000 --- a/docs/data/Activity/hashCode.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - hashCode property - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/message.html b/docs/data/Activity/message.html deleted file mode 100644 index 87422dd09..000000000 --- a/docs/data/Activity/message.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - message property - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              message
              - -
              - -
              - - - - -
              -
              - -

              message property - Null safety -

              - -
              - String - message -
              final
              - -
              - -
              -

              A message to be displayed with this activity.

              -

              For example, this can be used to direct students to a certain room based -on grade, which is better handled by the user rather than the app.

              -
              - - -
              -

              Implementation

              -
              final String message;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/noSuchMethod.html b/docs/data/Activity/noSuchMethod.html deleted file mode 100644 index 099626ac2..000000000 --- a/docs/data/Activity/noSuchMethod.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - noSuchMethod method - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/operator_equals.html b/docs/data/Activity/operator_equals.html deleted file mode 100644 index 2b24e241b..000000000 --- a/docs/data/Activity/operator_equals.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - operator == method - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/runtimeType.html b/docs/data/Activity/runtimeType.html deleted file mode 100644 index 51ac427e1..000000000 --- a/docs/data/Activity/runtimeType.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - runtimeType property - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/toJson.html b/docs/data/Activity/toJson.html deleted file mode 100644 index 5991245b6..000000000 --- a/docs/data/Activity/toJson.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - toJson method - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - - - - -
              -

              Implementation

              -
              Map toJson() => {
              -	"message": message,
              -	"type": activityTypeToString(type),
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/toString.html b/docs/data/Activity/toString.html deleted file mode 100644 index fa3178763..000000000 --- a/docs/data/Activity/toString.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - toString method - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() {
              -	switch (type) {
              -		case ActivityType.misc: return message;
              -		case ActivityType.advisory: return "Advisory -- $message";
              -		case ActivityType.room: return message;
              -		default: return "Activity";
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Activity/type.html b/docs/data/Activity/type.html deleted file mode 100644 index 720b73711..000000000 --- a/docs/data/Activity/type.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - type property - Activity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              type
              - -
              - -
              - - - - -
              -
              - -

              type property - Null safety -

              - -
              - ActivityType - type -
              final
              - -
              - -
              -

              The type of this activity.

              -
              - - -
              -

              Implementation

              -
              final ActivityType type;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ActivityType-class.html b/docs/data/ActivityType-class.html deleted file mode 100644 index 0b74306fc..000000000 --- a/docs/data/ActivityType-class.html +++ /dev/null @@ -1,357 +0,0 @@ - - - - - - - - ActivityType enum - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ActivityType
              - -
              - -
              - - - - -
              -
              - -

              ActivityType enum - Null safety - -

              - - -
              -

              A type of activity during the day.

              -
              - - - -
              -

              Constants

              - -
              -
              - advisory - → const ActivityType - - -
              -
              -

              When students should go to their advisories.

              -

              The app will show everyone to their advisories.

              - - -
              - const ActivityType(0) -
              -
              - -
              - grade - → const ActivityType - - -
              -
              -

              A grade activity.

              -

              Students will be shown the activities for each grade, and in the future, -students can be shown their grade's activity.

              - - -
              - const ActivityType(2) -
              -
              - -
              - misc - → const ActivityType - - -
              -
              -

              This type of activity should not be parsed by the app.

              -

              Just shows the message associated with the action.

              - - -
              - const ActivityType(3) -
              -
              - -
              - room - → const ActivityType - - -
              -
              -

              When students should go to a certain room.

              - - -
              - const ActivityType(1) -
              -
              - -
              - values - → const List<ActivityType> - - -
              -
              -

              A constant List of the values in this enum, in order of their declaration.

              - - -
              - const List<ActivityType> -
              -
              - -
              -
              - - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - index - → int - -
              -
              -

              The integer index of this enum.

              -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ActivityType/hashCode.html b/docs/data/ActivityType/hashCode.html deleted file mode 100644 index 2093594b3..000000000 --- a/docs/data/ActivityType/hashCode.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - hashCode property - ActivityType extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ActivityType/noSuchMethod.html b/docs/data/ActivityType/noSuchMethod.html deleted file mode 100644 index 51c606343..000000000 --- a/docs/data/ActivityType/noSuchMethod.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - noSuchMethod method - ActivityType extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ActivityType/operator_equals.html b/docs/data/ActivityType/operator_equals.html deleted file mode 100644 index 08a930916..000000000 --- a/docs/data/ActivityType/operator_equals.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - operator == method - ActivityType extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ActivityType/runtimeType.html b/docs/data/ActivityType/runtimeType.html deleted file mode 100644 index c99a24ab8..000000000 --- a/docs/data/ActivityType/runtimeType.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - runtimeType property - ActivityType extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ActivityType/toString.html b/docs/data/ActivityType/toString.html deleted file mode 100644 index 444cac11a..000000000 --- a/docs/data/ActivityType/toString.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - toString method - ActivityType extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/AdminScope-class.html b/docs/data/AdminScope-class.html deleted file mode 100644 index c435726a5..000000000 --- a/docs/data/AdminScope-class.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - AdminScope enum - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              AdminScope
              - -
              - -
              - - - - -
              -
              - -

              AdminScope enum - Null safety - -

              - - -
              -

              Scopes for administrative privileges.

              -

              Admin users use these scopes to determine what they can read/write.

              -
              - - - -
              -

              Constants

              - -
              -
              - calendar - → const AdminScope - - -
              -
              -

              The admin can access and modify the calendar.

              - - -
              - const AdminScope(0) -
              -
              - -
              - schedule - → const AdminScope - - -
              -
              -

              The admin can access and modify student schedules.

              - - -
              - const AdminScope(1) -
              -
              - -
              - sports - → const AdminScope - - -
              -
              -

              The admin can create and update sports games.

              - - -
              - const AdminScope(2) -
              -
              - -
              - values - → const List<AdminScope> - - -
              -
              -

              A constant List of the values in this enum, in order of their declaration.

              - - -
              - const List<AdminScope> -
              -
              - -
              -
              - - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - index - → int - -
              -
              -

              The integer index of this enum.

              -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/AdminScope/hashCode.html b/docs/data/AdminScope/hashCode.html deleted file mode 100644 index 8a6aa0b5f..000000000 --- a/docs/data/AdminScope/hashCode.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - hashCode property - AdminScope extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/AdminScope/noSuchMethod.html b/docs/data/AdminScope/noSuchMethod.html deleted file mode 100644 index 88f2b6526..000000000 --- a/docs/data/AdminScope/noSuchMethod.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - noSuchMethod method - AdminScope extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/AdminScope/operator_equals.html b/docs/data/AdminScope/operator_equals.html deleted file mode 100644 index f50bb39b8..000000000 --- a/docs/data/AdminScope/operator_equals.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - operator == method - AdminScope extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/AdminScope/runtimeType.html b/docs/data/AdminScope/runtimeType.html deleted file mode 100644 index 3914c18c6..000000000 --- a/docs/data/AdminScope/runtimeType.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - runtimeType property - AdminScope extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/AdminScope/toString.html b/docs/data/AdminScope/toString.html deleted file mode 100644 index 9c1977a35..000000000 --- a/docs/data/AdminScope/toString.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - toString method - AdminScope extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Advisory-class.html b/docs/data/Advisory-class.html deleted file mode 100644 index 8bb6c200c..000000000 --- a/docs/data/Advisory-class.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - - - Advisory class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Advisory
              - -
              - -
              - - - - -
              -
              - -

              Advisory class - Null safety - -

              - - -
              -

              Bundles data relevant to advisory.

              -

              This is not incorporated with the schedule since advisories can happen -during homeroom, and are thus dependent on the day, not the user's profile.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - Advisory({required String id, required String room}) -
              -
              - Holds advisory data. -
              const
              -
              -
              - Advisory.fromJson(Map json) -
              -
              - Creates an advisory object from JSON. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - id - → String - -
              -
              - The section ID of this advisory. -
              final
              - -
              - -
              - room - → String - -
              -
              - The room where this advisory meets. -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Advisory/Advisory.fromJson.html b/docs/data/Advisory/Advisory.fromJson.html deleted file mode 100644 index dc90c9972..000000000 --- a/docs/data/Advisory/Advisory.fromJson.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - Advisory.fromJson constructor - Advisory class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Advisory.fromJson
              - -
              - -
              - - - - -
              -
              - -

              Advisory.fromJson constructor - Null safety -

              - -
              - Advisory.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Creates an advisory object from JSON.

              -

              This JSON can be null, so this constructor should only be called if needed.

              -
              - - - -
              -

              Implementation

              -
              Advisory.fromJson(Map json) :
              -	id = json ["id"],
              -	room = json ["room"];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Advisory/Advisory.html b/docs/data/Advisory/Advisory.html deleted file mode 100644 index e29117b27..000000000 --- a/docs/data/Advisory/Advisory.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - Advisory constructor - Advisory class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Advisory
              - -
              - -
              - - - - -
              -
              - -

              Advisory constructor - Null safety -

              - -
              const - Advisory(
              1. {required String id,
              2. -
              3. required String room}
              4. -
              ) -
              - - -
              -

              Holds advisory data.

              -
              - - - -
              -

              Implementation

              -
              const Advisory({
              -	required this.id,
              -	required this.room,
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Advisory/hashCode.html b/docs/data/Advisory/hashCode.html deleted file mode 100644 index 16cfc5eda..000000000 --- a/docs/data/Advisory/hashCode.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - hashCode property - Advisory class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Advisory/id.html b/docs/data/Advisory/id.html deleted file mode 100644 index 46923b039..000000000 --- a/docs/data/Advisory/id.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - id property - Advisory class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              id
              - -
              - -
              - - - - -
              -
              - -

              id property - Null safety -

              - -
              - String - id -
              final
              - -
              - -
              -

              The section ID of this advisory.

              -
              - - -
              -

              Implementation

              -
              final String id;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Advisory/noSuchMethod.html b/docs/data/Advisory/noSuchMethod.html deleted file mode 100644 index be672eefe..000000000 --- a/docs/data/Advisory/noSuchMethod.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - noSuchMethod method - Advisory class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Advisory/operator_equals.html b/docs/data/Advisory/operator_equals.html deleted file mode 100644 index 021b8d679..000000000 --- a/docs/data/Advisory/operator_equals.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - operator == method - Advisory class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Advisory/room.html b/docs/data/Advisory/room.html deleted file mode 100644 index b5184d5df..000000000 --- a/docs/data/Advisory/room.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - room property - Advisory class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              room
              - -
              - -
              - - - - -
              -
              - -

              room property - Null safety -

              - -
              - String - room -
              final
              - -
              - -
              -

              The room where this advisory meets.

              -
              - - -
              -

              Implementation

              -
              final String room;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Advisory/runtimeType.html b/docs/data/Advisory/runtimeType.html deleted file mode 100644 index 0486efea7..000000000 --- a/docs/data/Advisory/runtimeType.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - runtimeType property - Advisory class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Advisory/toString.html b/docs/data/Advisory/toString.html deleted file mode 100644 index 36aaa8e9a..000000000 --- a/docs/data/Advisory/toString.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - toString method - Advisory class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              -

              toString method - Null safety -

              - -
              - - -String -toString() - -
              inherited
              - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              external String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club-class.html b/docs/data/Club-class.html deleted file mode 100644 index 9e762bf12..000000000 --- a/docs/data/Club-class.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - - - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Club
              - -
              - -
              - - - - -
              -
              - -

              Club class - Null safety - -

              - - - - - -
              -

              Constructors

              - -
              -
              - Club({required String name, required String shortDescription, required String description, required bool phoneNumberRequested, required List<ContactInfo> captains, required ContactInfo facultyAdvisor, required String image, String? formUrl}) -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - attendance - → Map<String, int> - -
              -
              - -
              final
              - -
              - -
              - captains - → List<ContactInfo> - -
              -
              - -
              final
              - -
              - -
              - description - → String - -
              -
              - -
              final
              - -
              - -
              - facultyAdvisor - → ContactInfo - -
              -
              - -
              final
              - -
              - -
              - formUrl - → String? - -
              -
              - -
              final
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - image - → String - -
              -
              - -
              final
              - -
              - -
              - members - → List<ContactInfo> - -
              -
              - -
              final
              - -
              - -
              - messages - → List<Message> - -
              -
              - -
              final
              - -
              - -
              - name - → String - -
              -
              - -
              final
              - -
              - -
              - phoneNumberRequested - → bool - -
              -
              - -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - shortDescription - → String - -
              -
              - -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/Club.html b/docs/data/Club/Club.html deleted file mode 100644 index 42ea647cf..000000000 --- a/docs/data/Club/Club.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - Club constructor - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Club
              - -
              - -
              - - - - -
              -
              - -

              Club constructor - Null safety -

              - -
              - Club(
              1. {required String name,
              2. -
              3. required String shortDescription,
              4. -
              5. required String description,
              6. -
              7. required bool phoneNumberRequested,
              8. -
              9. required List<ContactInfo> captains,
              10. -
              11. required ContactInfo facultyAdvisor,
              12. -
              13. required String image,
              14. -
              15. String? formUrl}
              16. -
              ) -
              - - - - - -
              -

              Implementation

              -
              Club({
              -	required this.name,
              -	required this.shortDescription,
              -	required this.description,
              -	required this.phoneNumberRequested,
              -	required this.captains,
              -	required this.facultyAdvisor,
              -	required this.image,
              -	this.formUrl,
              -}) :
              -	members = [],
              -	attendance = {},
              -	messages = [];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/attendance.html b/docs/data/Club/attendance.html deleted file mode 100644 index 73e43e76e..000000000 --- a/docs/data/Club/attendance.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - attendance property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              attendance
              - -
              - -
              - - - - -
              -
              - -

              attendance property - Null safety -

              - -
              - Map<String, int> - attendance -
              final
              - -
              - - - -
              -

              Implementation

              -
              final Map<String, int> attendance;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/captains.html b/docs/data/Club/captains.html deleted file mode 100644 index 39b243811..000000000 --- a/docs/data/Club/captains.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - captains property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              captains
              - -
              - -
              - - - - -
              -
              - -

              captains property - Null safety -

              - -
              - List<ContactInfo> - captains -
              final
              - -
              - - - -
              -

              Implementation

              -
              final List<ContactInfo> captains;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/description.html b/docs/data/Club/description.html deleted file mode 100644 index c2ec4d35e..000000000 --- a/docs/data/Club/description.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - description property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              description
              - -
              - -
              - - - - -
              -
              - -

              description property - Null safety -

              - -
              - String - description -
              final
              - -
              - - - -
              -

              Implementation

              -
              final String description;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/facultyAdvisor.html b/docs/data/Club/facultyAdvisor.html deleted file mode 100644 index bd31bc8a9..000000000 --- a/docs/data/Club/facultyAdvisor.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - facultyAdvisor property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              facultyAdvisor
              - -
              - -
              - - - - -
              -
              - -

              facultyAdvisor property - Null safety -

              - -
              - ContactInfo - facultyAdvisor -
              final
              - -
              - - - -
              -

              Implementation

              -
              final ContactInfo facultyAdvisor;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/formUrl.html b/docs/data/Club/formUrl.html deleted file mode 100644 index fcddcbb41..000000000 --- a/docs/data/Club/formUrl.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - formUrl property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              formUrl
              - -
              - -
              - - - - -
              -
              - -

              formUrl property - Null safety -

              - -
              - String? - formUrl -
              final
              - -
              - - - -
              -

              Implementation

              -
              final String? formUrl;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/hashCode.html b/docs/data/Club/hashCode.html deleted file mode 100644 index c1264f312..000000000 --- a/docs/data/Club/hashCode.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - hashCode property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/image.html b/docs/data/Club/image.html deleted file mode 100644 index 1b2923f1f..000000000 --- a/docs/data/Club/image.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - image property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              image
              - -
              - -
              - - - - -
              -
              - -

              image property - Null safety -

              - -
              - String - image -
              final
              - -
              - - - -
              -

              Implementation

              -
              final String image;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/members.html b/docs/data/Club/members.html deleted file mode 100644 index a29d5a6d2..000000000 --- a/docs/data/Club/members.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - members property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              members
              - -
              - -
              - - - - -
              -
              - -

              members property - Null safety -

              - -
              - List<ContactInfo> - members -
              final
              - -
              - - - -
              -

              Implementation

              -
              final List<ContactInfo> members;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/messages.html b/docs/data/Club/messages.html deleted file mode 100644 index 430441052..000000000 --- a/docs/data/Club/messages.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - messages property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              messages
              - -
              - -
              - - - - -
              -
              - -

              messages property - Null safety -

              - -
              - List<Message> - messages -
              final
              - -
              - - - -
              -

              Implementation

              -
              final List<Message> messages;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/name.html b/docs/data/Club/name.html deleted file mode 100644 index 1f46c59f7..000000000 --- a/docs/data/Club/name.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - name property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              name
              - -
              - -
              - - - - -
              -
              - -

              name property - Null safety -

              - -
              - String - name -
              final
              - -
              - - - -
              -

              Implementation

              -
              final String name;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/noSuchMethod.html b/docs/data/Club/noSuchMethod.html deleted file mode 100644 index 22fe3a87e..000000000 --- a/docs/data/Club/noSuchMethod.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - noSuchMethod method - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/operator_equals.html b/docs/data/Club/operator_equals.html deleted file mode 100644 index 0c276e017..000000000 --- a/docs/data/Club/operator_equals.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - operator == method - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/phoneNumberRequested.html b/docs/data/Club/phoneNumberRequested.html deleted file mode 100644 index 92180f0ad..000000000 --- a/docs/data/Club/phoneNumberRequested.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - phoneNumberRequested property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              phoneNumberRequested
              - -
              - -
              - - - - -
              -
              - -

              phoneNumberRequested property - Null safety -

              - -
              - bool - phoneNumberRequested -
              final
              - -
              - - - -
              -

              Implementation

              -
              final bool phoneNumberRequested;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/runtimeType.html b/docs/data/Club/runtimeType.html deleted file mode 100644 index 346071aa0..000000000 --- a/docs/data/Club/runtimeType.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - runtimeType property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/shortDescription.html b/docs/data/Club/shortDescription.html deleted file mode 100644 index 81b71a28b..000000000 --- a/docs/data/Club/shortDescription.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - shortDescription property - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              shortDescription
              - -
              - -
              - - - - -
              -
              - -

              shortDescription property - Null safety -

              - -
              - String - shortDescription -
              final
              - -
              - - - -
              -

              Implementation

              -
              final String shortDescription;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Club/toString.html b/docs/data/Club/toString.html deleted file mode 100644 index c2334f2bc..000000000 --- a/docs/data/Club/toString.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - toString method - Club class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              -

              toString method - Null safety -

              - -
              - - -String -toString() - -
              inherited
              - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              external String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day-class.html b/docs/data/Day-class.html deleted file mode 100644 index 33f913bf2..000000000 --- a/docs/data/Day-class.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Day
              - -
              - -
              - - - - -
              -
              - -

              Day class - Null safety - -

              - - -
              -

              A day at Ramaz.

              -

              Each day has a name and schedule property. -The name property decides which schedule to show, -while the schedule property decides what time slots to give the periods.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - Day({required String name, required Schedule schedule}) -
              -
              - Returns a new Day from a name and Schedule. -
              const
              -
              -
              - Day.fromJson(Map json) -
              -
              - Returns a Day from a JSON object. [...] -
              factory
              -
              -
              -
              - -
              -

              Properties

              - -
              -
              - displayName - → String - -
              -
              - A human-readable string representation of this day. -
              read-only
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only
              - -
              - -
              - n - → String - -
              -
              - Whether to say "a" or "an". [...] -
              read-only
              - -
              - -
              - name - → String - -
              -
              - The name of this day. [...] -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - schedule - Schedule - -
              -
              - The time allotment for this day. [...] -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - getCurrentPeriod() - → int? - - - -
              -
              - The period right now. [...] - - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - Returns a JSON representation of this Day. - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(dynamic other) - → bool - - - -
              -
              - The equality operator. [...] - - -
              - -
              -
              - - -
              -

              Static Methods

              -
              -
              - getCalendar(List<List<Map?>> year) - → List<List<Day?>> - - - -
              -
              - Gets the calendar for the whole year. [...] - - -
              - -
              - getDate(List<List<Day?>> calendar, DateTime date) - Day? - - - -
              -
              - Gets the Day for date in the calendar. - - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/Day.fromJson.html b/docs/data/Day/Day.fromJson.html deleted file mode 100644 index 5fa9ecfbf..000000000 --- a/docs/data/Day/Day.fromJson.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - Day.fromJson constructor - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Day.fromJson
              - -
              - -
              - - - - -
              -
              - -

              Day.fromJson constructor - Null safety -

              - -
              - Day.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Returns a Day from a JSON object.

              -

              json ["name"] and json ["schedule"] must not be null. -json ["schedule"] must be the name of a schedule in the calendar.

              -
              - - - -
              -

              Implementation

              -
              factory Day.fromJson(Map json) {
              -	final String scheduleName = json ["schedule"];
              -	final Schedule? schedule = Schedule.schedules.firstWhere(
              -		(Schedule schedule) => schedule.name == scheduleName
              -	);
              -	if (schedule == null) {
              -		throw ArgumentError.value(
              -			json ["schedule"],  // problematic value
              -			"scheduleName",     // description of this value
              -			"Unrecognized schedule name"  // error message
              -		);
              -	}
              -	return Day(name: json ["name"], schedule: schedule);
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/Day.html b/docs/data/Day/Day.html deleted file mode 100644 index 211210a11..000000000 --- a/docs/data/Day/Day.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - Day constructor - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Day
              - -
              - -
              - - - - -
              -
              - -

              Day constructor - Null safety -

              - -
              const - Day(
              1. {required String name,
              2. -
              3. required Schedule schedule}
              4. -
              ) -
              - - -
              -

              Returns a new Day from a name and Schedule.

              -
              - - - -
              -

              Implementation

              -
              const Day({
              -	required this.name,
              -	required this.schedule
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/displayName.html b/docs/data/Day/displayName.html deleted file mode 100644 index 57dd7a710..000000000 --- a/docs/data/Day/displayName.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - displayName property - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              displayName
              - -
              - -
              - - - - -
              -
              - -

              displayName property - Null safety -

              - - - -
              - -
              - String - displayName - - -
              - - -
              -

              A human-readable string representation of this day.

              -
              - - -
              -

              Implementation

              -
              String get displayName => "$name ${schedule.name}";
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/getCalendar.html b/docs/data/Day/getCalendar.html deleted file mode 100644 index c70827a61..000000000 --- a/docs/data/Day/getCalendar.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - getCalendar method - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getCalendar
              - -
              - -
              - - - - -
              -
              - -

              getCalendar method - Null safety -

              - -
              - - -List<List<Day?>> -getCalendar(
              1. List<List<Map?>> year
              2. -
              ) - - - -
              - -
              -

              Gets the calendar for the whole year.

              -

              Each element of year's months should be a JSON representation of a Day. -See Day.fromJson for how to represent a Day in JSON.

              -
              - - - -
              -

              Implementation

              -
              static List<List<Day?>> getCalendar(List<List<Map?>> year) => [
              -	for (final List<Map?> month in year) [
              -		for (final Map? day in month)
              -			if (day == null) null
              -			else Day.fromJson(day)
              -	]
              -];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/getCurrentPeriod.html b/docs/data/Day/getCurrentPeriod.html deleted file mode 100644 index 8d253f1a2..000000000 --- a/docs/data/Day/getCurrentPeriod.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - getCurrentPeriod method - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getCurrentPeriod
              - -
              - -
              - - - - -
              -
              - -

              getCurrentPeriod method - Null safety -

              - -
              - - -int? -getCurrentPeriod() - - - -
              - -
              -

              The period right now.

              -

              Uses schedule to calculate the time slots for all the different periods, -and uses DateTime.now() to look up what period it is right now. Also -makes use of Range and Time comparison operators.

              -
              - - - -
              -

              Implementation

              -
              int? getCurrentPeriod() {
              -	final Time time = Time.fromDateTime(DateTime.now());
              -	for (int index = 0; index < schedule.periods.length; index++) {
              -		final Range range = schedule.periods [index].time;
              -		if (range.contains(time)  // during class
              -			|| (  // between periods
              -				index != 0 &&
              -				schedule.periods [index - 1].time < time &&
              -				range > time
              -			)
              -		) {
              -			return index;
              -		}
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/getDate.html b/docs/data/Day/getDate.html deleted file mode 100644 index 94eb4035d..000000000 --- a/docs/data/Day/getDate.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - getDate method - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getDate
              - -
              - -
              - - - - -
              -
              - -

              getDate method - Null safety -

              - -
              - - -Day? -getDate(
              1. List<List<Day?>> calendar,
              2. -
              3. DateTime date
              4. -
              ) - - - -
              - -
              -

              Gets the Day for date in the calendar.

              -
              - - - -
              -

              Implementation

              -
              static Day? getDate(List<List<Day?>> calendar, DateTime date) =>
              -	calendar [date.month - 1] [date.day - 1];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/hashCode.html b/docs/data/Day/hashCode.html deleted file mode 100644 index a556bef37..000000000 --- a/docs/data/Day/hashCode.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - hashCode property - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              - -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode - - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              @override
              -int get hashCode => name.hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/n.html b/docs/data/Day/n.html deleted file mode 100644 index ad62a7a7b..000000000 --- a/docs/data/Day/n.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - n property - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              n
              - -
              - -
              - - - - -
              -
              - -

              n property - Null safety -

              - - - -
              - -
              - String - n - - -
              - - -
              -

              Whether to say "a" or "an".

              -

              Remember, name can be a letter and not a word. -So a letter like "R" might need "an" while "B" would need "a".

              -
              - - -
              -

              Implementation

              -
              String get n =>
              -	{"A", "E", "I", "O", "U"}.contains(name [0])
              -	|| {"A", "M", "R", "E", "F"}.contains(name) ? "n" : "";
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/name.html b/docs/data/Day/name.html deleted file mode 100644 index e59af5fa6..000000000 --- a/docs/data/Day/name.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - name property - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              name
              - -
              - -
              - - - - -
              -
              - -

              name property - Null safety -

              - -
              - String - name -
              final
              - -
              - -
              -

              The name of this day.

              -

              This decides which schedule of the student is shown.

              -
              - - -
              -

              Implementation

              -
              final String name;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/noSuchMethod.html b/docs/data/Day/noSuchMethod.html deleted file mode 100644 index dfe54d0e9..000000000 --- a/docs/data/Day/noSuchMethod.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - noSuchMethod method - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/operator_equals.html b/docs/data/Day/operator_equals.html deleted file mode 100644 index 1f37125c3..000000000 --- a/docs/data/Day/operator_equals.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - operator == method - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              - -

              operator == method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -bool -operator ==(
              1. dynamic other
              2. -
              ) - - - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              @override
              -bool operator == (dynamic other) => other is Day &&
              -	other.name == name &&
              -	other.schedule == schedule;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/runtimeType.html b/docs/data/Day/runtimeType.html deleted file mode 100644 index dbe9a26b1..000000000 --- a/docs/data/Day/runtimeType.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - runtimeType property - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/schedule.html b/docs/data/Day/schedule.html deleted file mode 100644 index 9e69a08ec..000000000 --- a/docs/data/Day/schedule.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - schedule property - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schedule
              - -
              - -
              - - - - -
              -
              - -

              schedule property - Null safety -

              - -
              - Schedule - schedule -
              final
              - -
              - -
              -

              The time allotment for this day.

              -

              See the Schedule class for more details.

              -
              - - -
              -

              Implementation

              -
              final Schedule schedule;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/toJson.html b/docs/data/Day/toJson.html deleted file mode 100644 index fb718ca4f..000000000 --- a/docs/data/Day/toJson.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - toJson method - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - -
              -

              Returns a JSON representation of this Day.

              -
              - - - -
              -

              Implementation

              -
              Map toJson() => {
              -	"name": name,
              -	"schedule": schedule.name,
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Day/toString.html b/docs/data/Day/toString.html deleted file mode 100644 index b56fa7128..000000000 --- a/docs/data/Day/toString.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - toString method - Day class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() => displayName;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback-class.html b/docs/data/Feedback-class.html deleted file mode 100644 index cd68835d8..000000000 --- a/docs/data/Feedback-class.html +++ /dev/null @@ -1,346 +0,0 @@ - - - - - - - - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Feedback
              - -
              - -
              - - - - -
              -
              - -

              Feedback class - Null safety - -

              - - -
              -

              Feedback from the user.

              -
              - - - -
              -

              Constructors

              - -
              -
              - Feedback({required String message, required bool anonymous, required DateTime timestamp, String? email, String? name}) -
              -
              - A const constructor for making a Feedback. [...] -
              const
              -
              -
              -
              - -
              -

              Properties

              - -
              -
              - anonymous - → bool - -
              -
              - If the feedback should be anonymized. -
              final
              - -
              - -
              - email - → String? - -
              -
              - The user's email -
              final
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - message - → String - -
              -
              - The message to the developer. -
              final
              - -
              - -
              - name - → String? - -
              -
              - The user's name -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - timestamp - → DateTime - -
              -
              - When the feedback was submitted. -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - A JSON representation of this feedback. - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/Feedback.html b/docs/data/Feedback/Feedback.html deleted file mode 100644 index c98f75902..000000000 --- a/docs/data/Feedback/Feedback.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - Feedback constructor - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Feedback
              - -
              - -
              - - - - -
              -
              - -

              Feedback constructor - Null safety -

              - -
              const - Feedback(
              1. {required String message,
              2. -
              3. required bool anonymous,
              4. -
              5. required DateTime timestamp,
              6. -
              7. String? email,
              8. -
              9. String? name}
              10. -
              ) -
              - - -
              -

              A const constructor for making a Feedback.

              -

              If anonymous is true, email and name must be null. -This is for privacy reasons.

              -
              - - - -
              -

              Implementation

              -
              const Feedback({
              -	required this.message,
              -	required this.anonymous,
              -	required this.timestamp,
              -	String? email,
              -	String? name,
              -}) :
              -	email = anonymous ? null : email,
              -	name = anonymous ? null : name;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/anonymous.html b/docs/data/Feedback/anonymous.html deleted file mode 100644 index 0c694d2e4..000000000 --- a/docs/data/Feedback/anonymous.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - anonymous property - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              anonymous
              - -
              - -
              - - - - -
              -
              - -

              anonymous property - Null safety -

              - -
              - bool - anonymous -
              final
              - -
              - -
              -

              If the feedback should be anonymized.

              -
              - - -
              -

              Implementation

              -
              final bool anonymous;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/email.html b/docs/data/Feedback/email.html deleted file mode 100644 index e1f8bc843..000000000 --- a/docs/data/Feedback/email.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - email property - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              email
              - -
              - -
              - - - - -
              -
              - -

              email property - Null safety -

              - -
              - String? - email -
              final
              - -
              - -
              -

              The user's email

              -
              - - -
              -

              Implementation

              -
              final String? email;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/hashCode.html b/docs/data/Feedback/hashCode.html deleted file mode 100644 index 6c4e0350d..000000000 --- a/docs/data/Feedback/hashCode.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - hashCode property - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/message.html b/docs/data/Feedback/message.html deleted file mode 100644 index 2bffe1b8b..000000000 --- a/docs/data/Feedback/message.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - message property - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              message
              - -
              - -
              - - - - -
              -
              - -

              message property - Null safety -

              - -
              - String - message -
              final
              - -
              - -
              -

              The message to the developer.

              -
              - - -
              -

              Implementation

              -
              final String message;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/name.html b/docs/data/Feedback/name.html deleted file mode 100644 index fbbb76482..000000000 --- a/docs/data/Feedback/name.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - name property - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              name
              - -
              - -
              - - - - -
              -
              - -

              name property - Null safety -

              - -
              - String? - name -
              final
              - -
              - -
              -

              The user's name

              -
              - - -
              -

              Implementation

              -
              final String? name;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/noSuchMethod.html b/docs/data/Feedback/noSuchMethod.html deleted file mode 100644 index 3fa634af4..000000000 --- a/docs/data/Feedback/noSuchMethod.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - noSuchMethod method - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/operator_equals.html b/docs/data/Feedback/operator_equals.html deleted file mode 100644 index 6e89d0207..000000000 --- a/docs/data/Feedback/operator_equals.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - operator == method - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/runtimeType.html b/docs/data/Feedback/runtimeType.html deleted file mode 100644 index aa4a2cd58..000000000 --- a/docs/data/Feedback/runtimeType.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - runtimeType property - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/timestamp.html b/docs/data/Feedback/timestamp.html deleted file mode 100644 index 0119dcec8..000000000 --- a/docs/data/Feedback/timestamp.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - timestamp property - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              timestamp
              - -
              - -
              - - - - -
              -
              - -

              timestamp property - Null safety -

              - -
              - DateTime - timestamp -
              final
              - -
              - -
              -

              When the feedback was submitted.

              -
              - - -
              -

              Implementation

              -
              final DateTime timestamp;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/toJson.html b/docs/data/Feedback/toJson.html deleted file mode 100644 index 08a406350..000000000 --- a/docs/data/Feedback/toJson.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - toJson method - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - -
              -

              A JSON representation of this feedback.

              -
              - - - -
              -

              Implementation

              -
              Map toJson() => {
              -	"message": message,
              -	"email": email,
              -	"name": name,
              -	"anonymous": anonymous,
              -	"timestamp": timestamp
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Feedback/toString.html b/docs/data/Feedback/toString.html deleted file mode 100644 index 8d33adead..000000000 --- a/docs/data/Feedback/toString.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - toString method - Feedback class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              -

              toString method - Null safety -

              - -
              - - -String -toString() - -
              inherited
              - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              external String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Grade-class.html b/docs/data/Grade-class.html deleted file mode 100644 index 793562183..000000000 --- a/docs/data/Grade-class.html +++ /dev/null @@ -1,357 +0,0 @@ - - - - - - - - Grade enum - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Grade
              - -
              - -
              - - - - -
              -
              - -

              Grade enum - Null safety - -

              - - -
              -

              What grade the user is in.

              -

              The User.grade field could be an int, but by specifying the exact -possible values, we avoid any possible errors, as well as possibly cleaner -code.

              -

              Faculty users can have User.grade be null.

              -
              - - - -
              -

              Constants

              - -
              -
              - freshman - → const Grade - - -
              -
              -

              A Freshman.

              - - -
              - const Grade(0) -
              -
              - -
              - junior - → const Grade - - -
              -
              -

              A Junior.

              - - -
              - const Grade(2) -
              -
              - -
              - senior - → const Grade - - -
              -
              -

              A Senior.

              - - -
              - const Grade(3) -
              -
              - -
              - sophomore - → const Grade - - -
              -
              -

              A Sophomore.

              - - -
              - const Grade(1) -
              -
              - -
              - values - → const List<Grade> - - -
              -
              -

              A constant List of the values in this enum, in order of their declaration.

              - - -
              - const List<Grade> -
              -
              - -
              -
              - - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - index - → int - -
              -
              -

              The integer index of this enum.

              -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Grade/hashCode.html b/docs/data/Grade/hashCode.html deleted file mode 100644 index 5fac0604b..000000000 --- a/docs/data/Grade/hashCode.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - hashCode property - Grade extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Grade/noSuchMethod.html b/docs/data/Grade/noSuchMethod.html deleted file mode 100644 index 43e8088a2..000000000 --- a/docs/data/Grade/noSuchMethod.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - noSuchMethod method - Grade extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Grade/operator_equals.html b/docs/data/Grade/operator_equals.html deleted file mode 100644 index e08f052ec..000000000 --- a/docs/data/Grade/operator_equals.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - operator == method - Grade extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Grade/runtimeType.html b/docs/data/Grade/runtimeType.html deleted file mode 100644 index e7e455b09..000000000 --- a/docs/data/Grade/runtimeType.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - runtimeType property - Grade extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Grade/toString.html b/docs/data/Grade/toString.html deleted file mode 100644 index 3764f483d..000000000 --- a/docs/data/Grade/toString.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - toString method - Grade extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity-class.html b/docs/data/GradeActivity-class.html deleted file mode 100644 index 9e25d0f88..000000000 --- a/docs/data/GradeActivity-class.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - - - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              GradeActivity
              - -
              - -
              - - - - -
              -
              - -

              GradeActivity class - Null safety - -

              - - -
              -

              An activity for each grade.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - GradeActivity({required Activity? freshmen, required Activity? sophomores, required Activity? juniors, required Activity? seniors}) -
              -
              - Creates a container for activities by grade. -
              const
              -
              -
              - GradeActivity.fromJson(Map json) -
              -
              - Creates a container for activities from a JSON object. -
              -
              -
              - -
              -

              Properties

              - -
              -
              - freshmen - Activity? - -
              -
              - The activity for freshmen. -
              final
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - juniors - Activity? - -
              -
              - The activity for juniors. -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - seniors - Activity? - -
              -
              - The activity for seniors. -
              final
              - -
              - -
              - sophomores - Activity? - -
              -
              - The activity for sophomores. -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/GradeActivity.fromJson.html b/docs/data/GradeActivity/GradeActivity.fromJson.html deleted file mode 100644 index 82a3ba990..000000000 --- a/docs/data/GradeActivity/GradeActivity.fromJson.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - GradeActivity.fromJson constructor - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              GradeActivity.fromJson
              - -
              - -
              - - - - -
              -
              - -

              GradeActivity.fromJson constructor - Null safety -

              - -
              - GradeActivity.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Creates a container for activities from a JSON object.

              -
              - - - -
              -

              Implementation

              -
              GradeActivity.fromJson(Map json) :
              -	freshmen = Activity.fromJson(Map.from(json ["freshmen"])),
              -	sophomores = Activity.fromJson(
              -		Map.from(json ["sophomores"])
              -	),
              -	juniors = Activity.fromJson(Map.from(json ["juniors"])),
              -	seniors = Activity.fromJson(Map.from(json ["seniors"]));
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/GradeActivity.html b/docs/data/GradeActivity/GradeActivity.html deleted file mode 100644 index dea24eafd..000000000 --- a/docs/data/GradeActivity/GradeActivity.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - GradeActivity constructor - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              GradeActivity
              - -
              - -
              - - - - -
              -
              - -

              GradeActivity constructor - Null safety -

              - -
              const - GradeActivity(
              1. {required Activity? freshmen,
              2. -
              3. required Activity? sophomores,
              4. -
              5. required Activity? juniors,
              6. -
              7. required Activity? seniors}
              8. -
              ) -
              - - -
              -

              Creates a container for activities by grade.

              -
              - - - -
              -

              Implementation

              -
              const GradeActivity({
              -	required this.freshmen,
              -	required this.sophomores,
              -	required this.juniors,
              -	required this.seniors,
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/freshmen.html b/docs/data/GradeActivity/freshmen.html deleted file mode 100644 index 06a5c3e4c..000000000 --- a/docs/data/GradeActivity/freshmen.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - freshmen property - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              freshmen
              - -
              - -
              - - - - -
              -
              - -

              freshmen property - Null safety -

              - -
              - Activity? - freshmen -
              final
              - -
              - -
              -

              The activity for freshmen.

              -
              - - -
              -

              Implementation

              -
              final Activity? freshmen;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/hashCode.html b/docs/data/GradeActivity/hashCode.html deleted file mode 100644 index e1a97f20c..000000000 --- a/docs/data/GradeActivity/hashCode.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - hashCode property - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/juniors.html b/docs/data/GradeActivity/juniors.html deleted file mode 100644 index 9b42d9939..000000000 --- a/docs/data/GradeActivity/juniors.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - juniors property - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              juniors
              - -
              - -
              - - - - -
              -
              - -

              juniors property - Null safety -

              - -
              - Activity? - juniors -
              final
              - -
              - -
              -

              The activity for juniors.

              -
              - - -
              -

              Implementation

              -
              final Activity? juniors;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/noSuchMethod.html b/docs/data/GradeActivity/noSuchMethod.html deleted file mode 100644 index 8af0b6ef5..000000000 --- a/docs/data/GradeActivity/noSuchMethod.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - noSuchMethod method - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/operator_equals.html b/docs/data/GradeActivity/operator_equals.html deleted file mode 100644 index 5e8fddd36..000000000 --- a/docs/data/GradeActivity/operator_equals.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - operator == method - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/runtimeType.html b/docs/data/GradeActivity/runtimeType.html deleted file mode 100644 index 66736a350..000000000 --- a/docs/data/GradeActivity/runtimeType.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - runtimeType property - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/seniors.html b/docs/data/GradeActivity/seniors.html deleted file mode 100644 index fb01427a8..000000000 --- a/docs/data/GradeActivity/seniors.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - seniors property - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              seniors
              - -
              - -
              - - - - -
              -
              - -

              seniors property - Null safety -

              - -
              - Activity? - seniors -
              final
              - -
              - -
              -

              The activity for seniors.

              -
              - - -
              -

              Implementation

              -
              final Activity? seniors;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/sophomores.html b/docs/data/GradeActivity/sophomores.html deleted file mode 100644 index 569dcdcdc..000000000 --- a/docs/data/GradeActivity/sophomores.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - sophomores property - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              sophomores
              - -
              - -
              - - - - -
              -
              - -

              sophomores property - Null safety -

              - -
              - Activity? - sophomores -
              final
              - -
              - -
              -

              The activity for sophomores.

              -
              - - -
              -

              Implementation

              -
              final Activity? sophomores;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/GradeActivity/toString.html b/docs/data/GradeActivity/toString.html deleted file mode 100644 index 4feeeee05..000000000 --- a/docs/data/GradeActivity/toString.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - toString method - GradeActivity class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() =>
              -	"Freshmen: ${freshmen.toString()}\n\n"
              -	"Sophomores: ${sophomores.toString()}\n\n"
              -	"Juniors: ${juniors.toString()}\n\n"
              -	"Seniors: ${seniors.toString()}";
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Message-class.html b/docs/data/Message-class.html deleted file mode 100644 index 5219c4bb4..000000000 --- a/docs/data/Message-class.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - Message class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Message
              - -
              - -
              - - - - -
              -
              - -

              Message class - Null safety - -

              - - - - - -
              -

              Constructors

              - -
              -
              - Message({required ContactInfo sender, required DateTime timestamp, required String body}) -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - body - ↔ String - -
              -
              - -
              read / write
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - sender - ↔ ContactInfo - -
              -
              - -
              read / write
              - -
              - -
              - timestamp - ↔ DateTime - -
              -
              - -
              read / write
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Message/Message.html b/docs/data/Message/Message.html deleted file mode 100644 index 8817f44fc..000000000 --- a/docs/data/Message/Message.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - Message constructor - Message class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Message
              - -
              - -
              - - - - -
              -
              - -

              Message constructor - Null safety -

              - -
              - Message(
              1. {required ContactInfo sender,
              2. -
              3. required DateTime timestamp,
              4. -
              5. required String body}
              6. -
              ) -
              - - - - - -
              -

              Implementation

              -
              Message({
              -	required this.sender,
              -	required this.timestamp,
              -	required this.body,
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Message/body.html b/docs/data/Message/body.html deleted file mode 100644 index 960f834b8..000000000 --- a/docs/data/Message/body.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - body property - Message class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              body
              - -
              - -
              - - - - -
              -
              - -

              body property - Null safety -

              - -
              - String - body -
              read / write
              - -
              - - - -
              -

              Implementation

              -
              String body;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Message/hashCode.html b/docs/data/Message/hashCode.html deleted file mode 100644 index 0d8afb516..000000000 --- a/docs/data/Message/hashCode.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - hashCode property - Message class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Message/noSuchMethod.html b/docs/data/Message/noSuchMethod.html deleted file mode 100644 index ce1c5a5d2..000000000 --- a/docs/data/Message/noSuchMethod.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - noSuchMethod method - Message class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Message/operator_equals.html b/docs/data/Message/operator_equals.html deleted file mode 100644 index 1e94ee978..000000000 --- a/docs/data/Message/operator_equals.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - operator == method - Message class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Message/runtimeType.html b/docs/data/Message/runtimeType.html deleted file mode 100644 index 4d239a02d..000000000 --- a/docs/data/Message/runtimeType.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - runtimeType property - Message class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Message/sender.html b/docs/data/Message/sender.html deleted file mode 100644 index 6d12d9bd6..000000000 --- a/docs/data/Message/sender.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - sender property - Message class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              sender
              - -
              - -
              - - - - -
              -
              - -

              sender property - Null safety -

              - -
              - ContactInfo - sender -
              read / write
              - -
              - - - -
              -

              Implementation

              -
              ContactInfo sender;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Message/timestamp.html b/docs/data/Message/timestamp.html deleted file mode 100644 index bc0c351ea..000000000 --- a/docs/data/Message/timestamp.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - timestamp property - Message class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              timestamp
              - -
              - -
              - - - - -
              -
              - -

              timestamp property - Null safety -

              - -
              - DateTime - timestamp -
              read / write
              - -
              - - - -
              -

              Implementation

              -
              DateTime timestamp;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Message/toString.html b/docs/data/Message/toString.html deleted file mode 100644 index 60e776aad..000000000 --- a/docs/data/Message/toString.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - toString method - Message class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              -

              toString method - Null safety -

              - -
              - - -String -toString() - -
              inherited
              - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              external String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period-class.html b/docs/data/Period-class.html deleted file mode 100644 index 7695e003c..000000000 --- a/docs/data/Period-class.html +++ /dev/null @@ -1,430 +0,0 @@ - - - - - - - - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Period
              - -
              - -
              - - - - -
              -
              - -

              Period class - Null safety - -

              - - -
              -

              A representation of a period, including the time it takes place.

              -

              Period objects unpack the PeriodData passed to them, -so that they alone contain all the information to represent a period.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - Period({required PeriodData? data, required Range time, required String name, Activity? activity}) -
              -
              - Unpacks a PeriodData object and returns a Period. -
              const
              -
              -
              - Period.fromJson(Map json) -
              -
              - A Period as represented by the calendar. [...] -
              -
              - Period.raw({required String name, required Range time, Activity? activity}) -
              -
              - A Period as represented by the calendar. [...] -
              const
              -
              -
              -
              - -
              -

              Properties

              - -
              -
              - activity - Activity? - -
              -
              - The activity for this period. -
              final
              - -
              - -
              - data - PeriodData? - -
              -
              - The section ID and room for this period. [...] -
              final
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only
              - -
              - -
              - id - → String? - -
              -
              - The section ID for this period. [...] -
              read-only
              - -
              - -
              - isFree - → bool - -
              -
              - Whether this is a free period. -
              read-only
              - -
              - -
              - name - → String - -
              -
              - A String representation of this period. [...] -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - time - Range - -
              -
              - The time this period takes place. -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - copyWith(PeriodData? data) - Period - - - -
              -
              - Copies this period with the PeriodData of another. [...] - - -
              - -
              - getInfo(Subject? subject) - → List<String> - - - -
              -
              - Returns a list of descriptions for this period. [...] - - -
              - -
              - getName(Subject? subject) - → String - - - -
              -
              - Returns a String representation of this period. [...] - - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - The JSON representation of this period. - - -
              - -
              - toString() - → String - - - -
              -
              - This is only for debug purposes. Use getName for UI labels. - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(dynamic other) - → bool - - - -
              -
              - The equality operator. [...] - - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/Period.fromJson.html b/docs/data/Period/Period.fromJson.html deleted file mode 100644 index ddd33183c..000000000 --- a/docs/data/Period/Period.fromJson.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - Period.fromJson constructor - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Period.fromJson
              - -
              - -
              - - - - -
              -
              - -

              Period.fromJson constructor - Null safety -

              - -
              - Period.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              A Period as represented by the calendar.

              -

              This period is student-agnostic, so data is automatically null.

              -
              - - - -
              -

              Implementation

              -
              Period.fromJson(Map json) :
              -	time = Range.fromJson(json ["time"]),
              -	name = json ["name"],
              -	data = null,
              -	activity = json ["activity"] == null ? null
              -		: Activity.fromJson(json ["activity"]);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/Period.html b/docs/data/Period/Period.html deleted file mode 100644 index 3b4d908e0..000000000 --- a/docs/data/Period/Period.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - Period constructor - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Period
              - -
              - -
              - - - - -
              -
              - -

              Period constructor - Null safety -

              - -
              const - Period(
              1. {required PeriodData? data,
              2. -
              3. required Range time,
              4. -
              5. required String name,
              6. -
              7. Activity? activity}
              8. -
              ) -
              - - -
              -

              Unpacks a PeriodData object and returns a Period.

              -
              - - - -
              -

              Implementation

              -
              const Period({
              -	required this.data,
              -	required this.time,
              -	required this.name,
              -	this.activity
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/Period.raw.html b/docs/data/Period/Period.raw.html deleted file mode 100644 index 10880c13f..000000000 --- a/docs/data/Period/Period.raw.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - Period.raw constructor - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Period.raw
              - -
              - -
              - - - - -
              -
              - -

              Period.raw constructor - Null safety -

              - -
              const - Period.raw(
              1. {required String name,
              2. -
              3. required Range time,
              4. -
              5. Activity? activity}
              6. -
              ) -
              - - -
              -

              A Period as represented by the calendar.

              -

              This period is student-agnostic, so data is automatically null. This -constructor can be used instead of fromJson() to build preset schedules

              -
              - - - -
              -

              Implementation

              -
              const Period.raw({
              -	required this.name,
              -	required this.time,
              -	this.activity,
              -}) : data = null;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/activity.html b/docs/data/Period/activity.html deleted file mode 100644 index 5dde340cb..000000000 --- a/docs/data/Period/activity.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - activity property - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              activity
              - -
              - -
              - - - - -
              -
              - -

              activity property - Null safety -

              - -
              - Activity? - activity -
              final
              - -
              - -
              -

              The activity for this period.

              -
              - - -
              -

              Implementation

              -
              final Activity? activity;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/copyWith.html b/docs/data/Period/copyWith.html deleted file mode 100644 index 5798c0790..000000000 --- a/docs/data/Period/copyWith.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - copyWith method - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              copyWith
              - -
              - -
              - - - - -
              -
              - -

              copyWith method - Null safety -

              - -
              - - -Period -copyWith(
              1. PeriodData? data
              2. -
              ) - - - -
              - -
              -

              Copies this period with the PeriodData of another.

              -

              This is useful because Period objects serve a dual purpose. Their first -use is in the calendar, where they simply store data about Ranges and -are used to determine when the periods occur. Then, this information is -merged with the user's PeriodData objects to create a Period that has -access to the class the user has at a given time.

              -
              - - - -
              -

              Implementation

              -
              Period copyWith(PeriodData? data) => Period(
              -	name: name,
              -	data: data,
              -	time: time,
              -	activity: activity,
              -);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/data.html b/docs/data/Period/data.html deleted file mode 100644 index 988b0bd7a..000000000 --- a/docs/data/Period/data.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - data property - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              data
              - -
              - -
              - - - - -
              -
              - -

              data property - Null safety -

              - -
              - PeriodData? - data -
              final
              - -
              - -
              -

              The section ID and room for this period.

              -

              If null, it's a free period.

              -
              - - -
              -

              Implementation

              -
              final PeriodData? data;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/getInfo.html b/docs/data/Period/getInfo.html deleted file mode 100644 index 8a11e8226..000000000 --- a/docs/data/Period/getInfo.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - getInfo method - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getInfo
              - -
              - -
              - - - - -
              -
              - -

              getInfo method - Null safety -

              - -
              - - -List<String> -getInfo(
              1. Subject? subject
              2. -
              ) - - - -
              - -
              -

              Returns a list of descriptions for this period.

              -

              The expected subject can be retrieved by looking up data.id.

              -

              Useful throughout the UI. This function will:

              -
                -
              1. Always display the time.
              2. -
              3. If name is a number, will display the period.
              4. -
              5. If data.room is not null, will display the room.
              6. -
              7. If data.id is valid, will return the name of the Subject.
              8. -
              -
              - - - -
              -

              Implementation

              -
              List <String> getInfo (Subject? subject) => [
              -	"Time: $time",
              -	if (int.tryParse(name) != null) "Period: $name",
              -	if (data != null) "Room: ${data!.room}",
              -	if (subject != null) "Teacher: ${subject.teacher}",
              -	if (subject?.virtualLink != null) "Zoom link: ${subject!.virtualLink}",
              -];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/getName.html b/docs/data/Period/getName.html deleted file mode 100644 index 57b7cafd8..000000000 --- a/docs/data/Period/getName.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - getName method - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getName
              - -
              - -
              - - - - -
              -
              - -

              getName method - Null safety -

              - -
              - - -String -getName(
              1. Subject? subject
              2. -
              ) - - - -
              - -
              -

              Returns a String representation of this period.

              -

              The expected subject can be retrieved by looking up data.id.

              -

              If name is an integer and data is null, then it is a free period. -Otherwise, if name is not a number, than it is returned instead. -Finally, the Subject that corresponds to data will be returned.

              -

              For example:

              -
                -
              1. A period with null data will return "Free period"
              2. -
              3. A period with name == "Homeroom" will return "Homeroom"
              4. -
              5. A period with name == "3" will return the name of the Subject.
              6. -
              -
              - - - -
              -

              Implementation

              -
              String getName(Subject? subject) => int.tryParse(name) != null && isFree
              -	? "Free period"
              -	: subject?.name ?? name;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/hashCode.html b/docs/data/Period/hashCode.html deleted file mode 100644 index 5c885a913..000000000 --- a/docs/data/Period/hashCode.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - hashCode property - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              - -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode - - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              @override
              -int get hashCode => "$name-${data?.id ?? ''}".hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/id.html b/docs/data/Period/id.html deleted file mode 100644 index 1366d8959..000000000 --- a/docs/data/Period/id.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - id property - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              id
              - -
              - -
              - - - - -
              -
              - -

              id property - Null safety -

              - - - -
              - -
              - String? - id - - -
              - - -
              -

              The section ID for this period.

              -

              See PeriodData.id.

              -
              - - -
              -

              Implementation

              -
              String? get id => data?.id;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/isFree.html b/docs/data/Period/isFree.html deleted file mode 100644 index a28f797a7..000000000 --- a/docs/data/Period/isFree.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - isFree property - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              isFree
              - -
              - -
              - - - - -
              -
              - -

              isFree property - Null safety -

              - - - -
              - -
              - bool - isFree - - -
              - - -
              -

              Whether this is a free period.

              -
              - - -
              -

              Implementation

              -
              bool get isFree => data == null;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/name.html b/docs/data/Period/name.html deleted file mode 100644 index a31dc7320..000000000 --- a/docs/data/Period/name.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - name property - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              name
              - -
              - -
              - - - - -
              -
              - -

              name property - Null safety -

              - -
              - String - name -
              final
              - -
              - -
              -

              A String representation of this period.

              -

              Since a period can be a number (like 9), or a word (like "Homeroom"), -String was chosen to represent both. This means that the app does not -care whether a period is a regular class or something like homeroom.

              -
              - - -
              -

              Implementation

              -
              final String name;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/noSuchMethod.html b/docs/data/Period/noSuchMethod.html deleted file mode 100644 index 8d6cf2220..000000000 --- a/docs/data/Period/noSuchMethod.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - noSuchMethod method - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/operator_equals.html b/docs/data/Period/operator_equals.html deleted file mode 100644 index 1bbae1f9b..000000000 --- a/docs/data/Period/operator_equals.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - operator == method - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              - -

              operator == method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -bool -operator ==(
              1. dynamic other
              2. -
              ) - - - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              @override
              -bool operator == (dynamic other) => other is Period &&
              -	other.time == time &&
              -	other.name == name &&
              -	other.data == data;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/runtimeType.html b/docs/data/Period/runtimeType.html deleted file mode 100644 index be24f2362..000000000 --- a/docs/data/Period/runtimeType.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - runtimeType property - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/time.html b/docs/data/Period/time.html deleted file mode 100644 index ac4ae9c4e..000000000 --- a/docs/data/Period/time.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - time property - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              time
              - -
              - -
              - - - - -
              -
              - -

              time property - Null safety -

              - -
              - Range - time -
              final
              - -
              - -
              -

              The time this period takes place.

              -
              - - -
              -

              Implementation

              -
              final Range time;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/toJson.html b/docs/data/Period/toJson.html deleted file mode 100644 index 5a8688397..000000000 --- a/docs/data/Period/toJson.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - toJson method - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - -
              -

              The JSON representation of this period.

              -
              - - - -
              -

              Implementation

              -
              Map toJson() => {
              -	"time": time.toJson(),
              -	"name": name,
              -	"activity": activity?.toJson(),
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Period/toString.html b/docs/data/Period/toString.html deleted file mode 100644 index 4d8ce21c8..000000000 --- a/docs/data/Period/toString.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - toString method - Period class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              This is only for debug purposes. Use getName for UI labels.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() => "Period $name";
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData-class.html b/docs/data/PeriodData-class.html deleted file mode 100644 index 43622b816..000000000 --- a/docs/data/PeriodData-class.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - - - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              PeriodData
              - -
              - -
              - - - - -
              -
              - -

              PeriodData class - Null safety - -

              - - -
              -

              A representation of a period, independent of the time.

              -

              This is needed since the time can change on any day. -See Schedule for how to handle different times.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - PeriodData({required String room, required String id}) -
              -
              - A const constructor for a PeriodData. [...] -
              const
              -
              -
              - PeriodData.fromJson(Map json) -
              -
              - Returns a PeriodData from a JSON object. [...] -
              factory
              -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only
              - -
              - -
              - id - → String - -
              -
              - The id for this period's subject. [...] -
              final
              - -
              - -
              - room - → String - -
              -
              - The room the student needs to be in for this period. -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(dynamic other) - → bool - - - -
              -
              - The equality operator. [...] - - -
              - -
              -
              - - -
              -

              Static Methods

              -
              -
              - getList(List json) - → List<PeriodData?> - - - -
              -
              - Returns a list of PeriodData from a JSON object. [...] - - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData/PeriodData.fromJson.html b/docs/data/PeriodData/PeriodData.fromJson.html deleted file mode 100644 index 37d14689b..000000000 --- a/docs/data/PeriodData/PeriodData.fromJson.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - PeriodData.fromJson constructor - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              PeriodData.fromJson
              - -
              - -
              - - - - -
              -
              - -

              PeriodData.fromJson constructor - Null safety -

              - -
              - PeriodData.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Returns a PeriodData from a JSON object.

              -

              Both json ["room"] and json ["id"] must be non-null.

              -
              - - - -
              -

              Implementation

              -
              factory PeriodData.fromJson(Map json) => PeriodData(
              -	room: json ["room"],
              -	id: json ["id"]
              -);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData/PeriodData.html b/docs/data/PeriodData/PeriodData.html deleted file mode 100644 index 684d8c5fb..000000000 --- a/docs/data/PeriodData/PeriodData.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - PeriodData constructor - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              PeriodData
              - -
              - -
              - - - - -
              -
              - -

              PeriodData constructor - Null safety -

              - -
              const - PeriodData(
              1. {required String room,
              2. -
              3. required String id}
              4. -
              ) -
              - - -
              -

              A const constructor for a PeriodData.

              -

              Free periods should be represented by null and not PeriodData.

              -
              - - - -
              -

              Implementation

              -
              const PeriodData ({
              -	required this.room,
              -	required this.id
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData/getList.html b/docs/data/PeriodData/getList.html deleted file mode 100644 index 1892573dd..000000000 --- a/docs/data/PeriodData/getList.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - getList method - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getList
              - -
              - -
              - - - - -
              -
              - -

              getList method - Null safety -

              - -
              - - -List<PeriodData?> -getList(
              1. List json
              2. -
              ) - - - -
              - -
              -

              Returns a list of PeriodData from a JSON object.

              -

              Note that some entries in the list may be null. -They represent a free period in the schedule. -See PeriodData.fromJson for more details.

              -
              - - - -
              -

              Implementation

              -
              static List<PeriodData?> getList(List json) => [
              -	for (final dynamic periodJson in json)
              -		periodJson == null ? null :
              -			PeriodData.fromJson(Map.from(periodJson))
              -];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData/hashCode.html b/docs/data/PeriodData/hashCode.html deleted file mode 100644 index 2ab05dae1..000000000 --- a/docs/data/PeriodData/hashCode.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - hashCode property - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              - -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode - - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              @override
              -int get hashCode => "$room-$id".hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData/id.html b/docs/data/PeriodData/id.html deleted file mode 100644 index 3a027c2cf..000000000 --- a/docs/data/PeriodData/id.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - id property - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              id
              - -
              - -
              - - - - -
              -
              - -

              id property - Null safety -

              - -
              - String - id -
              final
              - -
              - -
              -

              The id for this period's subject.

              -

              See the Subject class for more details.

              -
              - - -
              -

              Implementation

              -
              final String id;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData/noSuchMethod.html b/docs/data/PeriodData/noSuchMethod.html deleted file mode 100644 index 6ecd7a9f5..000000000 --- a/docs/data/PeriodData/noSuchMethod.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - noSuchMethod method - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData/operator_equals.html b/docs/data/PeriodData/operator_equals.html deleted file mode 100644 index acbd01368..000000000 --- a/docs/data/PeriodData/operator_equals.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - operator == method - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              - -

              operator == method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -bool -operator ==(
              1. dynamic other
              2. -
              ) - - - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              @override
              -bool operator == (dynamic other) => other is PeriodData &&
              -	other.id == id &&
              -	other.room == room;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData/room.html b/docs/data/PeriodData/room.html deleted file mode 100644 index c41c44dfa..000000000 --- a/docs/data/PeriodData/room.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - room property - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              room
              - -
              - -
              - - - - -
              -
              - -

              room property - Null safety -

              - -
              - String - room -
              final
              - -
              - -
              -

              The room the student needs to be in for this period.

              -
              - - -
              -

              Implementation

              -
              final String room;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData/runtimeType.html b/docs/data/PeriodData/runtimeType.html deleted file mode 100644 index dc46d221a..000000000 --- a/docs/data/PeriodData/runtimeType.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - runtimeType property - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodData/toString.html b/docs/data/PeriodData/toString.html deleted file mode 100644 index 4d4cbca8a..000000000 --- a/docs/data/PeriodData/toString.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - toString method - PeriodData class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() => "PeriodData ($id, $room)";
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodReminderTime-class.html b/docs/data/PeriodReminderTime-class.html deleted file mode 100644 index 34137963a..000000000 --- a/docs/data/PeriodReminderTime-class.html +++ /dev/null @@ -1,382 +0,0 @@ - - - - - - - - PeriodReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              PeriodReminderTime
              - -
              - -
              - - - - -
              -
              - -

              PeriodReminderTime class - Null safety - -

              - - -
              -

              A ReminderTime that depends on a name and period.

              -
              - - -
              -
              -
              Inheritance
              -
              - - - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - PeriodReminderTime({required String dayName, required String period, required bool repeats}) -
              -
              - Returns a new PeriodReminderTime. [...] -
              const
              -
              -
              - PeriodReminderTime.fromJson(Map json) -
              -
              - Creates a new ReminderTime from JSON. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - dayName - → String - -
              -
              - The day for when this reminder should be displayed. -
              final
              - -
              - -
              - hash - → String - -
              -
              - -
              read-only, override
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - period - → String - -
              -
              - The period when this reminder should be displayed. -
              final
              - -
              - -
              - repeats - → bool - -
              -
              - Whether the reminder should repeat. -
              final, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - type - ReminderTimeType - -
              -
              - The type of reminder. [...] -
              final, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - doesApply({required String? dayName, required String? subject, required String? period}) - → bool - - - -
              -
              - Returns true if dayName and period match this instance's fields. -
              override
              - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - Returns this ReminderTime as JSON. -
              override
              - -
              - -
              - toString() - → String - - - -
              -
              - Returns a String representation of this ReminderTime. [...] -
              override
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodReminderTime/PeriodReminderTime.fromJson.html b/docs/data/PeriodReminderTime/PeriodReminderTime.fromJson.html deleted file mode 100644 index 21bc7662d..000000000 --- a/docs/data/PeriodReminderTime/PeriodReminderTime.fromJson.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - PeriodReminderTime.fromJson constructor - PeriodReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              PeriodReminderTime.fromJson
              - -
              - -
              - - - - -
              -
              - -

              PeriodReminderTime.fromJson constructor - Null safety -

              - -
              - PeriodReminderTime.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Creates a new ReminderTime from JSON.

              -

              json ["dayName"] should be one of the valid names.

              -

              json ["period"] should be a valid period for that day, -notwithstanding any schedule changes (like an "early dismissal").

              -
              - - - -
              -

              Implementation

              -
              PeriodReminderTime.fromJson(Map json) :
              -	dayName = json ["dayName"],
              -	period = json ["period"],
              -	super (repeats: json ["repeats"], type: ReminderTimeType.period);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodReminderTime/PeriodReminderTime.html b/docs/data/PeriodReminderTime/PeriodReminderTime.html deleted file mode 100644 index b7d2cb6c6..000000000 --- a/docs/data/PeriodReminderTime/PeriodReminderTime.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - PeriodReminderTime constructor - PeriodReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              PeriodReminderTime
              - -
              - -
              - - - - -
              -
              - -

              PeriodReminderTime constructor - Null safety -

              - -
              const - PeriodReminderTime(
              1. {required String dayName,
              2. -
              3. required String period,
              4. -
              5. required bool repeats}
              6. -
              ) -
              - - -
              -

              Returns a new PeriodReminderTime.

              -

              All parameters must be non-null.

              -
              - - - -
              -

              Implementation

              -
              const PeriodReminderTime({
              -	required this.dayName,
              -	required this.period,
              -	required bool repeats
              -}) : super (repeats: repeats, type: ReminderTimeType.period);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodReminderTime/dayName.html b/docs/data/PeriodReminderTime/dayName.html deleted file mode 100644 index d7ccca424..000000000 --- a/docs/data/PeriodReminderTime/dayName.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - dayName property - PeriodReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              dayName
              - -
              - -
              - - - - -
              -
              - -

              dayName property - Null safety -

              - -
              - String - dayName -
              final
              - -
              - -
              -

              The day for when this reminder should be displayed.

              -
              - - -
              -

              Implementation

              -
              final String dayName;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodReminderTime/doesApply.html b/docs/data/PeriodReminderTime/doesApply.html deleted file mode 100644 index fe35bd4f3..000000000 --- a/docs/data/PeriodReminderTime/doesApply.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - doesApply method - PeriodReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              doesApply
              - -
              - -
              - - - - -
              -
              - -

              doesApply method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -bool -doesApply(
              1. {required String? dayName,
              2. -
              3. required String? subject,
              4. -
              5. required String? period}
              6. -
              ) - -
              override
              - -
              - -
              -

              Returns true if dayName and period match this instance's fields.

              -
              - - - -
              -

              Implementation

              -
              @override
              -bool doesApply({
              -	required String? dayName,
              -	required String? subject,
              -	required String? period,
              -}) => dayName == this.dayName && period == this.period;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodReminderTime/hash.html b/docs/data/PeriodReminderTime/hash.html deleted file mode 100644 index cc13673a2..000000000 --- a/docs/data/PeriodReminderTime/hash.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - hash property - PeriodReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hash
              - -
              - -
              - - - - -
              -
              - -

              hash property - Null safety -

              - - - -
              - -
              - String - hash -
              override
              - -
              - - - - -
              -

              Implementation

              -
              @override
              -String get hash => "$dayName-$period-$repeats";
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodReminderTime/period.html b/docs/data/PeriodReminderTime/period.html deleted file mode 100644 index 39ede81cd..000000000 --- a/docs/data/PeriodReminderTime/period.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - period property - PeriodReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              period
              - -
              - -
              - - - - -
              -
              - -

              period property - Null safety -

              - -
              - String - period -
              final
              - -
              - -
              -

              The period when this reminder should be displayed.

              -
              - - -
              -

              Implementation

              -
              final String period;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodReminderTime/toJson.html b/docs/data/PeriodReminderTime/toJson.html deleted file mode 100644 index e488c3967..000000000 --- a/docs/data/PeriodReminderTime/toJson.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - toJson method - PeriodReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -Map -toJson() - -
              override
              - -
              - -
              -

              Returns this ReminderTime as JSON.

              -
              - - - -
              -

              Implementation

              -
              @override
              -Map toJson() => {
              -	"dayName": dayName,
              -	"period": period,
              -	"repeats": repeats,
              -	"type": reminderTimeToString [type],
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/PeriodReminderTime/toString.html b/docs/data/PeriodReminderTime/toString.html deleted file mode 100644 index 6ec6d3206..000000000 --- a/docs/data/PeriodReminderTime/toString.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - toString method - PeriodReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - -
              override
              - -
              - -
              -

              Returns a String representation of this ReminderTime.

              -

              Used for debugging and throughout the UI.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() =>
              -	"${repeats ? 'Repeats every ' : ''}$dayName-$period";
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range-class.html b/docs/data/Range-class.html deleted file mode 100644 index d9b8be898..000000000 --- a/docs/data/Range-class.html +++ /dev/null @@ -1,379 +0,0 @@ - - - - - - - - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Range
              - -
              - -
              - - - - -
              -
              - -

              Range class - Null safety - -

              - - -
              -

              A range of times.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - Range(Time start, Time end) -
              -
              - Provides a const constructor. -
              const
              -
              -
              - Range.fromJson(Map json) -
              -
              - Returns a new Range from JSON data [...] -
              -
              - Range.nums(int startHour, int startMinute, int endHour, int endMinute) -
              -
              - Convenience method for manually creating a range by hand. -
              -
              -
              - -
              -

              Properties

              - -
              -
              - end - Time - -
              -
              - When this range ends. -
              final
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - start - Time - -
              -
              - When this range starts. -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - contains(Time other) - → bool - - - -
              -
              - Returns whether other is in this range. - - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - Returns a JSON representation of this range. - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator <(Time other) - → bool - - - -
              -
              - Returns whether this range is before another range. - - -
              - -
              - operator ==(dynamic other) - → bool - - - -
              -
              - The equality operator. [...] - - -
              - -
              - operator >(Time other) - → bool - - - -
              -
              - Returns whether this range is after another range. - - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/Range.fromJson.html b/docs/data/Range/Range.fromJson.html deleted file mode 100644 index 840fc9b4b..000000000 --- a/docs/data/Range/Range.fromJson.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - Range.fromJson constructor - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Range.fromJson
              - -
              - -
              - - - - -
              -
              - -

              Range.fromJson constructor - Null safety -

              - -
              - Range.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Returns a new Range from JSON data

              -

              The json must have start and end fields -that map to Time JSON objects. -See Time.fromJson for more details.

              -
              - - - -
              -

              Implementation

              -
              Range.fromJson(Map json) :
              -	start = Time.fromJson(Map.from(json ["start"])),
              -	end = Time.fromJson(Map.from(json ["end"]));
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/Range.html b/docs/data/Range/Range.html deleted file mode 100644 index 51e7b393e..000000000 --- a/docs/data/Range/Range.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - Range constructor - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Range
              - -
              - -
              - - - - -
              -
              - -

              Range constructor - Null safety -

              - -
              const - Range(
              1. Time start,
              2. -
              3. Time end
              4. -
              ) -
              - - -
              -

              Provides a const constructor.

              -
              - - - -
              -

              Implementation

              -
              const Range (this.start, this.end);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/Range.nums.html b/docs/data/Range/Range.nums.html deleted file mode 100644 index 144b18869..000000000 --- a/docs/data/Range/Range.nums.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - Range.nums constructor - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Range.nums
              - -
              - -
              - - - - -
              -
              - -

              Range.nums constructor - Null safety -

              - -
              - Range.nums(
              1. int startHour,
              2. -
              3. int startMinute,
              4. -
              5. int endHour,
              6. -
              7. int endMinute
              8. -
              ) -
              - - -
              -

              Convenience method for manually creating a range by hand.

              -
              - - - -
              -

              Implementation

              -
              Range.nums (
              -	int startHour,
              -	int startMinute,
              -	int endHour,
              -	int endMinute
              -) :
              -	start = Time (startHour, startMinute),
              -	end = Time (endHour, endMinute);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/contains.html b/docs/data/Range/contains.html deleted file mode 100644 index f4ede8537..000000000 --- a/docs/data/Range/contains.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - contains method - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              contains
              - -
              - -
              - - - - -
              -
              - -

              contains method - Null safety -

              - -
              - - -bool -contains(
              1. Time other
              2. -
              ) - - - -
              - -
              -

              Returns whether other is in this range.

              -
              - - - -
              -

              Implementation

              -
              bool contains (Time other) => start <= other && other <= end;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/end.html b/docs/data/Range/end.html deleted file mode 100644 index 3ecf47816..000000000 --- a/docs/data/Range/end.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - end property - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              end
              - -
              - -
              - - - - -
              -
              - -

              end property - Null safety -

              - -
              - Time - end -
              final
              - -
              - -
              -

              When this range ends.

              -
              - - -
              -

              Implementation

              -
              final Time end;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/hashCode.html b/docs/data/Range/hashCode.html deleted file mode 100644 index b2d5ae385..000000000 --- a/docs/data/Range/hashCode.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - hashCode property - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              - -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode - - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              @override int get hashCode => toString().hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/noSuchMethod.html b/docs/data/Range/noSuchMethod.html deleted file mode 100644 index 4dcf35b77..000000000 --- a/docs/data/Range/noSuchMethod.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - noSuchMethod method - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/operator_equals.html b/docs/data/Range/operator_equals.html deleted file mode 100644 index fa87cb67c..000000000 --- a/docs/data/Range/operator_equals.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - operator == method - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              - -

              operator == method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -bool -operator ==(
              1. dynamic other
              2. -
              ) - - - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              @override bool operator == (dynamic other) => other is Range &&
              -	other.start == start && other.end == end;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/operator_greater.html b/docs/data/Range/operator_greater.html deleted file mode 100644 index d4a07bba3..000000000 --- a/docs/data/Range/operator_greater.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - operator > method - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator >
              - -
              - -
              - - - - -
              -
              - -

              operator > method - Null safety -

              - -
              - - -bool -operator >(
              1. Time other
              2. -
              ) - - - -
              - -
              -

              Returns whether this range is after another range.

              -
              - - - -
              -

              Implementation

              -
              bool operator > (Time other) => start.hour > other.hour ||
              -(
              -	start.hour == other.hour &&
              -	start.minutes > other.minutes
              -);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/operator_less.html b/docs/data/Range/operator_less.html deleted file mode 100644 index feec02e95..000000000 --- a/docs/data/Range/operator_less.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - operator < method - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator <
              - -
              - -
              - - - - -
              -
              - -

              operator < method - Null safety -

              - -
              - - -bool -operator <(
              1. Time other
              2. -
              ) - - - -
              - -
              -

              Returns whether this range is before another range.

              -
              - - - -
              -

              Implementation

              -
              bool operator < (Time other) => end.hour < other.hour ||
              -(
              -	end.hour == other.hour &&
              -	end.minutes < other.minutes
              -);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/runtimeType.html b/docs/data/Range/runtimeType.html deleted file mode 100644 index cd7ba7162..000000000 --- a/docs/data/Range/runtimeType.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - runtimeType property - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/start.html b/docs/data/Range/start.html deleted file mode 100644 index 79a057466..000000000 --- a/docs/data/Range/start.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - start property - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              start
              - -
              - -
              - - - - -
              -
              - -

              start property - Null safety -

              - -
              - Time - start -
              final
              - -
              - -
              -

              When this range starts.

              -
              - - -
              -

              Implementation

              -
              final Time start;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/toJson.html b/docs/data/Range/toJson.html deleted file mode 100644 index 4ef4afd67..000000000 --- a/docs/data/Range/toJson.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - toJson method - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - -
              -

              Returns a JSON representation of this range.

              -
              - - - -
              -

              Implementation

              -
              Map toJson() => {
              -	"start": start.toJson(),
              -	"end": end.toJson(),
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Range/toString.html b/docs/data/Range/toString.html deleted file mode 100644 index c06ed9de4..000000000 --- a/docs/data/Range/toString.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - toString method - Range class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              @override String toString() => "$start-$end";
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder-class.html b/docs/data/Reminder-class.html deleted file mode 100644 index 0005de306..000000000 --- a/docs/data/Reminder-class.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - - - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Reminder
              - -
              - -
              - - - - -
              -
              - -

              Reminder class - Null safety - -

              - - -
              -

              A user-generated reminder.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - Reminder({required String message, required ReminderTime time}) -
              -
              - Creates a new reminder. -
              const
              -
              -
              - Reminder.fromJson(dynamic json) -
              -
              - Creates a new Reminder from a JSON object. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hash - → String - -
              -
              - -
              read-only
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - message - → String - -
              -
              - The message this reminder should show. -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - time - ReminderTime - -
              -
              - The ReminderTime for this reminder. -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - Returns a JSON representation of this reminder. - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - -
              -

              Static Methods

              -
              -
              - fromList(List reminders) - → List<Reminder> - - - -
              -
              - Returns a list of reminders from a list of JSON objects. [...] - - -
              - -
              - getReminders({required List<Reminder> reminders, required String? dayName, required String? period, required String? subject}) - → List<int> - - - -
              -
              - Returns all reminders from a list of reminders that should be shown. [...] - - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/Reminder.fromJson.html b/docs/data/Reminder/Reminder.fromJson.html deleted file mode 100644 index 086bc3c71..000000000 --- a/docs/data/Reminder/Reminder.fromJson.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - Reminder.fromJson constructor - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Reminder.fromJson
              - -
              - -
              - - - - -
              -
              - -

              Reminder.fromJson constructor - Null safety -

              - -
              - Reminder.fromJson(
              1. dynamic json
              2. -
              ) -
              - - -
              -

              Creates a new Reminder from a JSON object.

              -

              Uses json ["message"] for the message and passes json["time"] -to ReminderTime.fromJson

              -
              - - - -
              -

              Implementation

              -
              Reminder.fromJson(dynamic json) :
              -	message = json ["message"],
              -	time = ReminderTime.fromJson(Map.from(json ["time"]));
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/Reminder.html b/docs/data/Reminder/Reminder.html deleted file mode 100644 index 047f4462e..000000000 --- a/docs/data/Reminder/Reminder.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - Reminder constructor - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Reminder
              - -
              - -
              - - - - -
              -
              - -

              Reminder constructor - Null safety -

              - -
              const - Reminder(
              1. {required String message,
              2. -
              3. required ReminderTime time}
              4. -
              ) -
              - - -
              -

              Creates a new reminder.

              -
              - - - -
              -

              Implementation

              -
              const Reminder({
              -	required this.message,
              -	required this.time,
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/fromList.html b/docs/data/Reminder/fromList.html deleted file mode 100644 index 33b3156f6..000000000 --- a/docs/data/Reminder/fromList.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - fromList method - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              fromList
              - -
              - -
              - - - - -
              -
              - -

              fromList method - Null safety -

              - -
              - - -List<Reminder> -fromList(
              1. List reminders
              2. -
              ) - - - -
              - -
              -

              Returns a list of reminders from a list of JSON objects.

              -

              Calls Reminder.fromJson for every JSON object in the list.

              -
              - - - -
              -

              Implementation

              -
              static List<Reminder> fromList(List reminders) => [
              -	for (final dynamic json in reminders)
              -		Reminder.fromJson(Map.from(json))
              -];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/getReminders.html b/docs/data/Reminder/getReminders.html deleted file mode 100644 index 2a8cd383b..000000000 --- a/docs/data/Reminder/getReminders.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - getReminders method - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getReminders
              - -
              - -
              - - - - -
              -
              - -

              getReminders method - Null safety -

              - -
              - - -List<int> -getReminders(
              1. {required List<Reminder> reminders,
              2. -
              3. required String? dayName,
              4. -
              5. required String? period,
              6. -
              7. required String? subject}
              8. -
              ) - - - -
              - -
              -

              Returns all reminders from a list of reminders that should be shown.

              -

              All possible parameters are required. -This function delegates logic to ReminderTime.doesApply

              -
              - - - -
              -

              Implementation

              -
              static List<int> getReminders({
              -	required List<Reminder> reminders,
              -	required String? dayName,
              -	required String? period,
              -	required String? subject,
              -}) => [
              -	for (int index = 0; index < reminders.length; index++)
              -		if (reminders [index].time.doesApply(
              -			dayName: dayName,
              -			period: period,
              -			subject: subject
              -		)) index
              -];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/hash.html b/docs/data/Reminder/hash.html deleted file mode 100644 index 957b39a61..000000000 --- a/docs/data/Reminder/hash.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - hash property - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hash
              - -
              - -
              - - - - -
              -
              - -

              hash property - Null safety -

              - - - -
              - -
              - String - hash - - -
              - - - - -
              -

              Implementation

              -
              String get hash => "$message-${time.hash}";
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/hashCode.html b/docs/data/Reminder/hashCode.html deleted file mode 100644 index 6990b3aae..000000000 --- a/docs/data/Reminder/hashCode.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - hashCode property - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/message.html b/docs/data/Reminder/message.html deleted file mode 100644 index 7c6276091..000000000 --- a/docs/data/Reminder/message.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - message property - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              message
              - -
              - -
              - - - - -
              -
              - -

              message property - Null safety -

              - -
              - String - message -
              final
              - -
              - -
              -

              The message this reminder should show.

              -
              - - -
              -

              Implementation

              -
              final String message;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/noSuchMethod.html b/docs/data/Reminder/noSuchMethod.html deleted file mode 100644 index c5d8731c2..000000000 --- a/docs/data/Reminder/noSuchMethod.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - noSuchMethod method - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/operator_equals.html b/docs/data/Reminder/operator_equals.html deleted file mode 100644 index 1beb53ba5..000000000 --- a/docs/data/Reminder/operator_equals.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - operator == method - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/runtimeType.html b/docs/data/Reminder/runtimeType.html deleted file mode 100644 index 6361ac07e..000000000 --- a/docs/data/Reminder/runtimeType.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - runtimeType property - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/time.html b/docs/data/Reminder/time.html deleted file mode 100644 index d8c431e5f..000000000 --- a/docs/data/Reminder/time.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - time property - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              time
              - -
              - -
              - - - - -
              -
              - -

              time property - Null safety -

              - -
              - ReminderTime - time -
              final
              - -
              - -
              -

              The ReminderTime for this reminder.

              -
              - - -
              -

              Implementation

              -
              final ReminderTime time;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/toJson.html b/docs/data/Reminder/toJson.html deleted file mode 100644 index 45af9add0..000000000 --- a/docs/data/Reminder/toJson.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - toJson method - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - -
              -

              Returns a JSON representation of this reminder.

              -
              - - - -
              -

              Implementation

              -
              Map toJson() => {
              -	"message": message,
              -	"time": time.toJson(),
              -	"hash": hash,
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Reminder/toString.html b/docs/data/Reminder/toString.html deleted file mode 100644 index 4512e02f0..000000000 --- a/docs/data/Reminder/toString.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - toString method - Reminder class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              @override String toString() => "$message ($time)";
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime-class.html b/docs/data/ReminderTime-class.html deleted file mode 100644 index 2c1bd4223..000000000 --- a/docs/data/ReminderTime-class.html +++ /dev/null @@ -1,370 +0,0 @@ - - - - - - - - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ReminderTime
              - -
              - -
              - - - - -
              -
              - -

              ReminderTime class - Null safety - -

              - - -
              -

              A time that a reminder should show.

              -
              - - -
              -
              - - - -
              Implementers
              -
              - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - ReminderTime({required bool repeats, required ReminderTimeType type}) -
              -
              - Allows its subclasses to be const. -
              const
              -
              -
              - ReminderTime.fromJson(Map json) -
              -
              - Initializes a new instance from JSON. [...] -
              factory
              -
              -
              - ReminderTime.fromType({required ReminderTimeType type, required String? dayName, required String? period, required String? name, required bool repeats}) -
              -
              - Instantiates new ReminderTime with all possible parameters. [...] -
              factory
              -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hash - → String - -
              -
              - -
              read-only
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - repeats - → bool - -
              -
              - Whether the reminder should repeat. -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - type - ReminderTimeType - -
              -
              - The type of reminder. [...] -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - doesApply({required String? dayName, required String? subject, required String? period}) - → bool - - - -
              -
              - Checks if the reminder should be displayed. [...] - - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - Returns this ReminderTime as JSON. - - -
              - -
              - toString() - → String - - - -
              -
              - Returns a String representation of this ReminderTime. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/ReminderTime.fromJson.html b/docs/data/ReminderTime/ReminderTime.fromJson.html deleted file mode 100644 index 09fb35399..000000000 --- a/docs/data/ReminderTime/ReminderTime.fromJson.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - ReminderTime.fromJson constructor - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ReminderTime.fromJson
              - -
              - -
              - - - - -
              -
              - -

              ReminderTime.fromJson constructor - Null safety -

              - -
              - ReminderTime.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Initializes a new instance from JSON.

              -

              Mainly looks at json ["type"] to choose which type of -ReminderTime it should instantiate, and then leaves the -work to that subclass' .fromJson method.

              -

              Example JSON:

              -
              {
              -	"type": "period",
              -	"repeats": false,
              -	"period": "9",
              -	"name": "Monday",
              -}
              -
              -
              - - - -
              -

              Implementation

              -
              factory ReminderTime.fromJson(Map json) {
              -	switch (stringToReminderTime [json ["type"]]) {
              -		case ReminderTimeType.period: return PeriodReminderTime.fromJson(json);
              -		case ReminderTimeType.subject: return SubjectReminderTime.fromJson(json);
              -		default: throw JsonUnsupportedObjectError(
              -			json,
              -			cause: "Invalid time for reminder: $json"
              -		);
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/ReminderTime.fromType.html b/docs/data/ReminderTime/ReminderTime.fromType.html deleted file mode 100644 index 25e8e6083..000000000 --- a/docs/data/ReminderTime/ReminderTime.fromType.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - ReminderTime.fromType constructor - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ReminderTime.fromType
              - -
              - -
              - - - - -
              -
              - -

              ReminderTime.fromType constructor - Null safety -

              - -
              - ReminderTime.fromType(
              1. {required ReminderTimeType type,
              2. -
              3. required String? dayName,
              4. -
              5. required String? period,
              6. -
              7. required String? name,
              8. -
              9. required bool repeats}
              10. -
              ) -
              - - -
              -

              Instantiates new ReminderTime with all possible parameters.

              -

              Used for cases where the caller doesn't care about the ReminderTimeType, -such as a UI reminder builder.

              -
              - - - -
              -

              Implementation

              -
              factory ReminderTime.fromType({
              -	required ReminderTimeType type,
              -	required String? dayName,
              -	required String? period,
              -	required String? name,
              -	required bool repeats,
              -}) {
              -	switch (type) {
              -		case ReminderTimeType.period: return PeriodReminderTime(
              -			period: period!,
              -			dayName: dayName!,
              -			repeats: repeats,
              -		); case ReminderTimeType.subject: return SubjectReminderTime(
              -			name: name!,
              -			repeats: repeats,
              -		); default: throw ArgumentError.notNull("type");
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/ReminderTime.html b/docs/data/ReminderTime/ReminderTime.html deleted file mode 100644 index aa8ca4e8c..000000000 --- a/docs/data/ReminderTime/ReminderTime.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - ReminderTime constructor - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ReminderTime
              - -
              - -
              - - - - -
              -
              - -

              ReminderTime constructor - Null safety -

              - -
              const - ReminderTime(
              1. {required bool repeats,
              2. -
              3. required ReminderTimeType type}
              4. -
              ) -
              - - -
              -

              Allows its subclasses to be const.

              -
              - - - -
              -

              Implementation

              -
              const ReminderTime({
              -	required this.repeats,
              -	required this.type
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/doesApply.html b/docs/data/ReminderTime/doesApply.html deleted file mode 100644 index 9a0f1c3de..000000000 --- a/docs/data/ReminderTime/doesApply.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - doesApply method - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              doesApply
              - -
              - -
              - - - - -
              -
              - -

              doesApply method - Null safety -

              - -
              - - -bool -doesApply(
              1. {required String? dayName,
              2. -
              3. required String? subject,
              4. -
              5. required String? period}
              6. -
              ) - - - -
              - -
              -

              Checks if the reminder should be displayed.

              -

              All possible parameters are required.

              -
              - - - -
              -

              Implementation

              -
              bool doesApply({
              -	required String? dayName,
              -	required String? subject,
              -	required String? period,
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/hash.html b/docs/data/ReminderTime/hash.html deleted file mode 100644 index 70af70668..000000000 --- a/docs/data/ReminderTime/hash.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - hash property - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hash
              - -
              - -
              - - - - -
              -
              - -

              hash property - Null safety -

              - - - -
              - -
              - String - hash - - -
              - - - - -
              -

              Implementation

              -
              String get hash;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/hashCode.html b/docs/data/ReminderTime/hashCode.html deleted file mode 100644 index 7a2c36d1d..000000000 --- a/docs/data/ReminderTime/hashCode.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - hashCode property - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/noSuchMethod.html b/docs/data/ReminderTime/noSuchMethod.html deleted file mode 100644 index e91538e1a..000000000 --- a/docs/data/ReminderTime/noSuchMethod.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - noSuchMethod method - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/operator_equals.html b/docs/data/ReminderTime/operator_equals.html deleted file mode 100644 index d84a24d70..000000000 --- a/docs/data/ReminderTime/operator_equals.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - operator == method - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/repeats.html b/docs/data/ReminderTime/repeats.html deleted file mode 100644 index fb5a3458c..000000000 --- a/docs/data/ReminderTime/repeats.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - repeats property - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              repeats
              - -
              - -
              - - - - -
              -
              - -

              repeats property - Null safety -

              - -
              - bool - repeats -
              final
              - -
              - -
              -

              Whether the reminder should repeat.

              -
              - - -
              -

              Implementation

              -
              final bool repeats;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/runtimeType.html b/docs/data/ReminderTime/runtimeType.html deleted file mode 100644 index 6b8bef0f9..000000000 --- a/docs/data/ReminderTime/runtimeType.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - runtimeType property - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/toJson.html b/docs/data/ReminderTime/toJson.html deleted file mode 100644 index 3b90a92fe..000000000 --- a/docs/data/ReminderTime/toJson.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - toJson method - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - -
              -

              Returns this ReminderTime as JSON.

              -
              - - - -
              -

              Implementation

              -
              Map toJson();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/toString.html b/docs/data/ReminderTime/toString.html deleted file mode 100644 index eb2555f39..000000000 --- a/docs/data/ReminderTime/toString.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - toString method - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              Returns a String representation of this ReminderTime.

              -

              Used for debugging and throughout the UI.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTime/type.html b/docs/data/ReminderTime/type.html deleted file mode 100644 index afa56cf5c..000000000 --- a/docs/data/ReminderTime/type.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - type property - ReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              type
              - -
              - -
              - - - - -
              -
              - -

              type property - Null safety -

              - -
              - ReminderTimeType - type -
              final
              - -
              - -
              -

              The type of reminder.

              -

              This field is here for other objects to use.

              -
              - - -
              -

              Implementation

              -
              final ReminderTimeType type;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTimeType-class.html b/docs/data/ReminderTimeType-class.html deleted file mode 100644 index da2fc1455..000000000 --- a/docs/data/ReminderTimeType-class.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - ReminderTimeType enum - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ReminderTimeType
              - -
              - -
              - - - - -
              -
              - -

              ReminderTimeType enum - Null safety - -

              - - -
              -

              An enum to decide when the reminder should appear.

              -

              period means the reminder needs a Day name and a period (as String) -subject means the reminder needs a name of a class.

              -
              - - - -
              -

              Constants

              - -
              -
              - period - → const ReminderTimeType - - -
              -
              -

              Whether the reminder should be displayed on a specific period.

              - - -
              - const ReminderTimeType(0) -
              -
              - -
              - subject - → const ReminderTimeType - - -
              -
              -

              Whether the reminder should be displayed on a specific subject.

              - - -
              - const ReminderTimeType(1) -
              -
              - -
              - values - → const List<ReminderTimeType> - - -
              -
              -

              A constant List of the values in this enum, in order of their declaration.

              - - -
              - const List<ReminderTimeType> -
              -
              - -
              -
              - - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - index - → int - -
              -
              -

              The integer index of this enum.

              -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTimeType/hashCode.html b/docs/data/ReminderTimeType/hashCode.html deleted file mode 100644 index 7056f9d72..000000000 --- a/docs/data/ReminderTimeType/hashCode.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - hashCode property - ReminderTimeType extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTimeType/noSuchMethod.html b/docs/data/ReminderTimeType/noSuchMethod.html deleted file mode 100644 index 3fb2b41f0..000000000 --- a/docs/data/ReminderTimeType/noSuchMethod.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - noSuchMethod method - ReminderTimeType extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTimeType/operator_equals.html b/docs/data/ReminderTimeType/operator_equals.html deleted file mode 100644 index 29d26619b..000000000 --- a/docs/data/ReminderTimeType/operator_equals.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - operator == method - ReminderTimeType extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTimeType/runtimeType.html b/docs/data/ReminderTimeType/runtimeType.html deleted file mode 100644 index 6d138e4de..000000000 --- a/docs/data/ReminderTimeType/runtimeType.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - runtimeType property - ReminderTimeType extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/ReminderTimeType/toString.html b/docs/data/ReminderTimeType/toString.html deleted file mode 100644 index 96b02b2d9..000000000 --- a/docs/data/ReminderTimeType/toString.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - toString method - ReminderTimeType extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule-class.html b/docs/data/Schedule-class.html deleted file mode 100644 index be4d346db..000000000 --- a/docs/data/Schedule-class.html +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - - - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Schedule
              - -
              - -
              - - - - -
              -
              - -

              Schedule class - Null safety - -

              - - -
              -

              A description of the time allotment for a day.

              -

              Some days require different time periods, or even periods that -are skipped altogether, as well as homeroom and Mincha movements. -This class helps facilitate that.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - Schedule({required String name, required List<Period> periods}) -
              -
              - A const constructor. -
              const
              -
              -
              - Schedule.fromJson(Map json) -
              -
              - Returns a new Schedule from a JSON value. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only
              - -
              - -
              - name - → String - -
              -
              - The name of this schedule. -
              final
              - -
              - -
              - periods - → List<Period> - -
              -
              - The time allotments for the periods. -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - Returns a JSON representation of this schedule. - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(dynamic other) - → bool - - - -
              -
              - The equality operator. [...] - - -
              - -
              -
              - -
              -

              Static Properties

              - -
              -
              - schedules - ↔ List<Schedule> - -
              -
              - The list of schedules defined in the calendar. [...] -
              read / write
              - -
              - -
              -
              - -
              -

              Static Methods

              -
              -
              - getWinterFriday([DateTime? today]) - Schedule - - - -
              -
              - Determines whether to use a Winter Friday or regular Friday schedule. [...] - - -
              - -
              -
              - -
              -

              Constants

              - -
              -
              - amAssembly - → const Schedule - - -
              -
              - The schedule for when there is an assembly during Homeroom. - - -
              - Schedule(name: "AM Assembly", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 50))), Period.raw(name: "2", time: Range(Time(8, 55), Time(9, 30))), Period.… -
              -
              - -
              - covid - → const Schedule - - -
              -
              - The shorter schedule for the COVID-19 pandemic. - - -
              - Schedule(name: "COVID-19", periods: [Period.raw(name: "1", time: Range(Time(8, 30), Time(9, 15))), Period.raw(name: "Tefilla", time: Range(Time(9, 20), Time(9, 55))), Per… -
              -
              - -
              - early - → const Schedule - - -
              -
              - The schedule for an early dismissal. - - -
              - Schedule(name: "Early Dismissal", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 45))), Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 25))), Per… -
              -
              - -
              - fastDay - → const Schedule - - -
              -
              - The schedule for fast days. - - -
              - Schedule(name: "Tzom", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 55))), Period.raw(name: "2", time: Range(Time(9, 0), Time(9, 35))), Period.raw(name… -
              -
              - -
              - friday - → const Schedule - - -
              -
              - The schedule for Fridays. - - -
              - Schedule(name: "Friday", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 45))), Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 30))), Period.raw(n… -
              -
              - -
              - fridayRoshChodesh - → const Schedule - - -
              -
              - The schedule for when Rosh Chodesh falls on a Friday. - - -
              - Schedule(name: "Friday Rosh Chodesh", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(9, 5))), Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 45))), … -
              -
              - -
              - pmAssembly - → const Schedule - - -
              -
              - The schedule for when there is an assembly during Mincha. - - -
              - Schedule(name: "PM Assembly", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 50))), Period.raw(name: "2", time: Range(Time(8, 55), Time(9, 30))), Period.… -
              -
              - -
              - roshChodesh - → const Schedule - - -
              -
              - The schedule for Rosh Chodesh. - - -
              - Schedule(name: "Rosh Chodesh", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(9, 5))), Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 50))), Period.… -
              -
              - -
              - winterFriday - → const Schedule - - -
              -
              - The schedule for a winter Friday. See Schedule.getWinterFriday. - - -
              - Schedule(name: "Winter Friday", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(8, 45))), Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 25))), Perio… -
              -
              - -
              - winterFridayRoshChodesh - → const Schedule - - -
              -
              - The schedule for when a Rosh Chodesh falls on a Winter Friday. - - -
              - Schedule(name: "Winter Friday Rosh Chodesh", periods: [Period.raw(name: "1", time: Range(Time(8, 0), Time(9, 5))), Period.raw(name: "2", time: Range(Time(9, 10), Time(9, … -
              -
              - -
              -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/Schedule.fromJson.html b/docs/data/Schedule/Schedule.fromJson.html deleted file mode 100644 index 3fecf452c..000000000 --- a/docs/data/Schedule/Schedule.fromJson.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - Schedule.fromJson constructor - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Schedule.fromJson
              - -
              - -
              - - - - -
              -
              - -

              Schedule.fromJson constructor - Null safety -

              - -
              - Schedule.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Returns a new Schedule from a JSON value.

              -

              The JSON must have:

              -
                -
              • a "name" field, which should be a string. See name.
              • -
              • a "periods" field, which should be a list of Period JSON objects.
              • -
              -
              - - - -
              -

              Implementation

              -
              Schedule.fromJson(Map json) :
              -	name = json ["name"],  // name
              -	periods = [  // list of periods
              -		for (final dynamic jsonElement in json ["periods"])
              -			Period.fromJson(jsonElement)
              -	];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/Schedule.html b/docs/data/Schedule/Schedule.html deleted file mode 100644 index 378d0cf72..000000000 --- a/docs/data/Schedule/Schedule.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - Schedule constructor - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Schedule
              - -
              - -
              - - - - -
              -
              - -

              Schedule constructor - Null safety -

              - -
              const - Schedule(
              1. {required String name,
              2. -
              3. required List<Period> periods}
              4. -
              ) -
              - - -
              -

              A const constructor.

              -
              - - - -
              -

              Implementation

              -
              const Schedule({
              -	required this.name,
              -	required this.periods,
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/amAssembly-constant.html b/docs/data/Schedule/amAssembly-constant.html deleted file mode 100644 index 5f8e10fbb..000000000 --- a/docs/data/Schedule/amAssembly-constant.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - amAssembly constant - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              amAssembly
              - -
              - -
              - - - - -
              -
              - -

              amAssembly constant - Null safety -

              - -
              - Schedule - const amAssembly - - -
              - -
              -

              The schedule for when there is an assembly during Homeroom.

              -
              - - -
              -

              Implementation

              -
              static const Schedule amAssembly = Schedule(
              -	name: "AM Assembly",
              -	periods: [
              -		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 50))),
              -		Period.raw(name: "2", time: Range(Time(8, 55), Time(9, 30))),
              -		Period.raw(name: "3", time: Range(Time(9, 35), Time(10, 10))),
              -		Period.raw(name: "Homeroom", time: Range(Time(10, 10), Time(11, 10))),
              -		Period.raw(name: "4", time: Range(Time(11, 10), Time(11, 45))),
              -		Period.raw(name: "5", time: Range(Time(11, 50), Time(12, 25))),
              -		Period.raw(name: "6", time: Range(Time(12, 30), Time(13, 05))),
              -		Period.raw(name: "7", time: Range(Time(13, 10), Time(13, 45))),
              -		Period.raw(name: "8", time: Range(Time(13, 50), Time(14, 25))),
              -		Period.raw(name: "9", time: Range(Time(14, 30), Time(15, 05))),
              -		Period.raw(name: "Mincha", time: Range(Time(15, 05), Time(15, 25))),
              -		Period.raw(name: "10", time: Range(Time(15, 25), Time(16, 00))),
              -		Period.raw(name: "11", time: Range(Time(16, 05), Time(16, 45))),
              -	],
              -);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/covid-constant.html b/docs/data/Schedule/covid-constant.html deleted file mode 100644 index 3bb07adab..000000000 --- a/docs/data/Schedule/covid-constant.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - covid constant - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              covid
              - -
              - -
              - - - - -
              -
              - -

              covid constant - Null safety -

              - -
              - Schedule - const covid - - -
              - -
              -

              The shorter schedule for the COVID-19 pandemic.

              -
              - - -
              -

              Implementation

              -
              static const Schedule covid = Schedule(
              -	name: "COVID-19",
              -	periods: [
              -		Period.raw(name: "1", time: Range(Time(8, 30), Time(9, 15))),
              -		Period.raw(name: "Tefilla", time: Range(Time(9, 20), Time(9, 55))),
              -		Period.raw(name: "2", time: Range(Time(10, 00), Time(10, 45))),
              -		Period.raw(name: "3", time: Range(Time(10, 55), Time(11, 40))),
              -		Period.raw(name: "4", time: Range(Time(11, 50), Time(12, 35))),
              -		Period.raw(name: "Lunch", time: Range(Time(12, 35), Time(13, 05))),
              -		Period.raw(name: "5", time: Range(Time(13, 15), Time(14, 00))),
              -		Period.raw(name: "Mincha", time: Range(Time(14, 00), Time(14, 10))),
              -		Period.raw(name: "6", time: Range(Time(14, 20), Time(15, 05))),
              -		Period.raw(name: "7", time: Range(Time(15, 15), Time(16, 00))),
              -	],
              -);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/early-constant.html b/docs/data/Schedule/early-constant.html deleted file mode 100644 index f37aa6078..000000000 --- a/docs/data/Schedule/early-constant.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - early constant - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              early
              - -
              - -
              - - - - -
              -
              - -

              early constant - Null safety -

              - -
              - Schedule - const early - - -
              - -
              -

              The schedule for an early dismissal.

              -
              - - -
              -

              Implementation

              -
              static const Schedule early = Schedule(
              -	name: "Early Dismissal",
              -	periods: [
              -		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 45))),
              -		Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 25))),
              -		Period.raw(name: "3", time: Range(Time(9, 30), Time(10, 05))),
              -		Period.raw(name: "Homeroom", time: Range(Time(10, 05), Time(10, 20))),
              -		Period.raw(name: "4", time: Range(Time(10, 20), Time(10, 55))),
              -		Period.raw(name: "5", time: Range(Time(11, 00), Time(11, 35))),
              -		Period.raw(name: "6", time: Range(Time(11, 40), Time(12, 15))),
              -		Period.raw(name: "7", time: Range(Time(12, 20), Time(12, 55))),
              -		Period.raw(name: "8", time: Range(Time(13, 00), Time(13, 35))),
              -		Period.raw(name: "9", time: Range(Time(13, 40), Time(14, 15))),
              -		Period.raw(name: "Mincha", time: Range(Time(14, 15), Time(14, 35))),
              -		Period.raw(name: "10", time: Range(Time(14, 35), Time(15, 10))),
              -		Period.raw(name: "11", time: Range(Time(15, 15), Time(15, 50))),
              -	],
              -);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/fastDay-constant.html b/docs/data/Schedule/fastDay-constant.html deleted file mode 100644 index 0ea80bb71..000000000 --- a/docs/data/Schedule/fastDay-constant.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - fastDay constant - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              fastDay
              - -
              - -
              - - - - -
              -
              - -

              fastDay constant - Null safety -

              - -
              - Schedule - const fastDay - - -
              - -
              -

              The schedule for fast days.

              -
              - - -
              -

              Implementation

              -
              static const Schedule fastDay = Schedule(
              -	name: "Tzom",
              -	periods: [
              -		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 55))),
              -		Period.raw(name: "2", time: Range(Time(9, 00), Time(9, 35))),
              -		Period.raw(name: "3", time: Range(Time(9, 40), Time(10, 15))),
              -		Period.raw(name: "4", time: Range(Time(10, 20), Time(10, 55))),
              -		Period.raw(name: "5", time: Range(Time(11, 00), Time(11, 35))),
              -		Period.raw(name: "9", time: Range(Time(11, 40), Time(12, 15))),
              -		Period.raw(name: "10", time: Range(Time(12, 20), Time(12, 55))),
              -		Period.raw(name: "11", time: Range(Time(13, 00), Time(13, 35))),
              -		Period.raw(name: "Mincha", time: Range(Time(13, 35), Time(14, 05))),
              -	],
              -);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/friday-constant.html b/docs/data/Schedule/friday-constant.html deleted file mode 100644 index ac30689ed..000000000 --- a/docs/data/Schedule/friday-constant.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - friday constant - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              friday
              - -
              - -
              - - - - -
              -
              - -

              friday constant - Null safety -

              - -
              - Schedule - const friday - - -
              - -
              -

              The schedule for Fridays.

              -
              - - -
              -

              Implementation

              -
              static const Schedule friday = Schedule(
              -	name: "Friday",
              -	periods: [
              -		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 45))),
              -		Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 30))),
              -		Period.raw(name: "3", time: Range(Time(9, 35), Time(10, 15))),
              -		Period.raw(name: "4", time: Range(Time(10, 20), Time(11, 00))),
              -		Period.raw(name: "Homeroom", time: Range(Time(11, 00), Time(11, 20))),
              -		Period.raw(name: "5", time: Range(Time(11, 20), Time(12, 00))),
              -		Period.raw(name: "6", time: Range(Time(12, 05), Time(12, 45))),
              -		Period.raw(name: "7", time: Range(Time(12, 50), Time(13, 30))),
              -	],
              -);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/fridayRoshChodesh-constant.html b/docs/data/Schedule/fridayRoshChodesh-constant.html deleted file mode 100644 index c00508972..000000000 --- a/docs/data/Schedule/fridayRoshChodesh-constant.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - fridayRoshChodesh constant - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              fridayRoshChodesh
              - -
              - -
              - - - - -
              -
              - -

              fridayRoshChodesh constant - Null safety -

              - -
              - Schedule - const fridayRoshChodesh - - -
              - -
              -

              The schedule for when Rosh Chodesh falls on a Friday.

              -
              - - -
              -

              Implementation

              -
              static const Schedule fridayRoshChodesh = Schedule(
              -	name: "Friday Rosh Chodesh",
              -	periods: [
              -		Period.raw(name: "1", time: Range(Time(8, 00), Time(9, 05))),
              -		Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 45))),
              -		Period.raw(name: "3", time: Range(Time(9, 50), Time(10, 25))),
              -		Period.raw(name: "4", time: Range(Time(10, 30), Time(11, 05))),
              -		Period.raw(name: "Homeroom", time: Range(Time(11, 05), Time(11, 25))),
              -		Period.raw(name: "5", time: Range(Time(11, 25), Time(12, 00))),
              -		Period.raw(name: "6", time: Range(Time(12, 05), Time(12, 40))),
              -		Period.raw(name: "7", time: Range(Time(12, 45), Time(13, 20))),
              -	],
              -);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/getWinterFriday.html b/docs/data/Schedule/getWinterFriday.html deleted file mode 100644 index f9735b8f9..000000000 --- a/docs/data/Schedule/getWinterFriday.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - getWinterFriday method - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getWinterFriday
              - -
              - -
              - - - - -
              -
              - -

              getWinterFriday method - Null safety -

              - -
              - - -Schedule -getWinterFriday(
              1. [DateTime? today]
              2. -
              ) - - - -
              - -
              -

              Determines whether to use a Winter Friday or regular Friday schedule.

              -

              Winter Fridays mean shorter periods, with an ultimately shorter dismissal.

              -
              - - - -
              -

              Implementation

              -
              static Schedule getWinterFriday([DateTime? today]) {
              -	final DateTime date = today ?? DateTime.now();
              -	final int month = date.month, day = date.day;
              -	if (month >= Times.schoolStart && month < Times.winterFridayMonthStart) {
              -		return friday;
              -	} else if (
              -		month > Times.winterFridayMonthStart ||
              -		month < Times.winterFridayMonthEnd
              -	) {
              -		return winterFriday;
              -	} else if (
              -		month > Times.winterFridayMonthEnd &&
              -		month <= Times.schoolEnd
              -	) {
              -		return friday;
              -	} else if (month == Times.winterFridayMonthStart) {
              -		return day < Times.winterFridayDayStart ? friday : winterFriday;
              -	} else if (month == Times.winterFridayMonthEnd) {
              -		return day < Times.winterFridayDayEnd ? winterFriday : friday;
              -	} else {
              -		return friday;
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/hashCode.html b/docs/data/Schedule/hashCode.html deleted file mode 100644 index e0ea86496..000000000 --- a/docs/data/Schedule/hashCode.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - hashCode property - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              - -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode - - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              @override
              -int get hashCode => name.hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/name.html b/docs/data/Schedule/name.html deleted file mode 100644 index f9465b0b6..000000000 --- a/docs/data/Schedule/name.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - name property - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              name
              - -
              - -
              - - - - -
              -
              - -

              name property - Null safety -

              - -
              - String - name -
              final
              - -
              - -
              -

              The name of this schedule.

              -
              - - -
              -

              Implementation

              -
              final String name;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/noSuchMethod.html b/docs/data/Schedule/noSuchMethod.html deleted file mode 100644 index 9ef3fe7ba..000000000 --- a/docs/data/Schedule/noSuchMethod.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - noSuchMethod method - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/operator_equals.html b/docs/data/Schedule/operator_equals.html deleted file mode 100644 index 6e22e39fb..000000000 --- a/docs/data/Schedule/operator_equals.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - operator == method - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              - -

              operator == method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -bool -operator ==(
              1. dynamic other
              2. -
              ) - - - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              @override
              -bool operator == (dynamic other) => other is Schedule &&
              -	other.name == name;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/periods.html b/docs/data/Schedule/periods.html deleted file mode 100644 index 06d4df62b..000000000 --- a/docs/data/Schedule/periods.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - periods property - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              periods
              - -
              - -
              - - - - -
              -
              - -

              periods property - Null safety -

              - -
              - List<Period> - periods -
              final
              - -
              - -
              -

              The time allotments for the periods.

              -
              - - -
              -

              Implementation

              -
              final List<Period> periods;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/pmAssembly-constant.html b/docs/data/Schedule/pmAssembly-constant.html deleted file mode 100644 index 23a35edeb..000000000 --- a/docs/data/Schedule/pmAssembly-constant.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - pmAssembly constant - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              pmAssembly
              - -
              - -
              - - - - -
              -
              - -

              pmAssembly constant - Null safety -

              - -
              - Schedule - const pmAssembly - - -
              - -
              -

              The schedule for when there is an assembly during Mincha.

              -
              - - -
              -

              Implementation

              -
              static const Schedule pmAssembly = Schedule(
              -	name: "PM Assembly",
              -	periods: [
              -		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 50))),
              -		Period.raw(name: "2", time: Range(Time(8, 55), Time(9, 30))),
              -		Period.raw(name: "3", time: Range(Time(9, 35), Time(10, 10))),
              -		Period.raw(name: "4", time: Range(Time(10, 15), Time(10, 50))),
              -		Period.raw(name: "5", time: Range(Time(10, 55), Time(11, 30))),
              -		Period.raw(name: "6", time: Range(Time(11, 35), Time(12, 10))),
              -		Period.raw(name: "7", time: Range(Time(12, 15), Time(12, 50))),
              -		Period.raw(name: "8", time: Range(Time(12, 55), Time(13, 30))),
              -		Period.raw(name: "9", time: Range(Time(13, 35), Time(14, 10))),
              -		Period.raw(name: "Mincha", time: Range(Time(14, 10), Time(15, 30))),
              -		Period.raw(name: "10", time: Range(Time(15, 30), Time(16, 05))),
              -		Period.raw(name: "11", time: Range(Time(16, 10), Time(16, 45))),
              -	],
              -);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/roshChodesh-constant.html b/docs/data/Schedule/roshChodesh-constant.html deleted file mode 100644 index a101c5110..000000000 --- a/docs/data/Schedule/roshChodesh-constant.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - roshChodesh constant - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              roshChodesh
              - -
              - -
              - - - - -
              -
              - -

              roshChodesh constant - Null safety -

              - -
              - Schedule - const roshChodesh - - -
              - -
              -

              The schedule for Rosh Chodesh.

              -
              - - -
              -

              Implementation

              -
              static const Schedule roshChodesh = Schedule(
              -	name: "Rosh Chodesh",
              -	periods: [
              -		Period.raw(name: "1", time: Range(Time(8, 00), Time(9, 05))),
              -		Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 50))),
              -		Period.raw(name: "3", time: Range(Time(9, 55), Time(10, 35))),
              -		Period.raw(name: "Homeroom", time: Range(Time(10, 35), Time(10, 50))),
              -		Period.raw(name: "4", time: Range(Time(10, 50), Time(11, 30))),
              -		Period.raw(name: "5", time: Range(Time(11, 35), Time(12, 15))),
              -		Period.raw(name: "6", time: Range(Time(12, 20), Time(12, 55))),
              -		Period.raw(name: "7", time: Range(Time(13, 00), Time(13, 35))),
              -		Period.raw(name: "8", time: Range(Time(13, 40), Time(14, 15))),
              -		Period.raw(name: "9", time: Range(Time(14, 30), Time(15, 00))),
              -		Period.raw(name: "Mincha", time: Range(Time(15, 00), Time(15, 20))),
              -		Period.raw(name: "10", time: Range(Time(15, 20), Time(16, 00))),
              -		Period.raw(name: "11", time: Range(Time(16, 05), Time(16, 45))),
              -	],
              -);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/runtimeType.html b/docs/data/Schedule/runtimeType.html deleted file mode 100644 index 586447f3f..000000000 --- a/docs/data/Schedule/runtimeType.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - runtimeType property - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/schedules.html b/docs/data/Schedule/schedules.html deleted file mode 100644 index 69a2df85b..000000000 --- a/docs/data/Schedule/schedules.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - schedules property - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schedules
              - -
              - -
              - - - - -
              -
              - -

              schedules property - Null safety -

              - -
              - List<Schedule> - schedules -
              read / write
              - -
              - -
              -

              The list of schedules defined in the calendar.

              -

              This is a rare exception where the database and data layers intermingle. -Schedules are defined by their name, but their values exist elsewhere in -the database. So, the data layer needs some lookup method in order to be -useful. Specifically, Day.fromJson() needs to work somehow.

              -

              late means that this value is initialized after startup, but the value -cannot be used until it is. This means that we need to be careful not to -access this value until we can be sure that the database values were -synced. Dart will throw a runtime error otherwise, so it should be fairly -simple to catch problems during testing.

              -
              - - -
              -

              Implementation

              -
              static late List<Schedule> schedules;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/toJson.html b/docs/data/Schedule/toJson.html deleted file mode 100644 index 853c02929..000000000 --- a/docs/data/Schedule/toJson.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - toJson method - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - -
              -

              Returns a JSON representation of this schedule.

              -
              - - - -
              -

              Implementation

              -
              Map toJson() => {
              -	"name": name,
              -	"periods": [
              -		for (final Period period in periods)
              -			period.toJson(),
              -	],
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/toString.html b/docs/data/Schedule/toString.html deleted file mode 100644 index 719f7fb39..000000000 --- a/docs/data/Schedule/toString.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - toString method - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() => name;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/winterFriday-constant.html b/docs/data/Schedule/winterFriday-constant.html deleted file mode 100644 index afe44e17c..000000000 --- a/docs/data/Schedule/winterFriday-constant.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - winterFriday constant - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              winterFriday
              - -
              - -
              - - - - -
              -
              - -

              winterFriday constant - Null safety -

              - -
              - Schedule - const winterFriday - - -
              - -
              -

              The schedule for a winter Friday. See Schedule.getWinterFriday.

              -
              - - -
              -

              Implementation

              -
              static const Schedule winterFriday = Schedule(
              -	name: "Winter Friday",
              -	periods: [
              -		Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 45))),
              -		Period.raw(name: "2", time: Range(Time(8, 50), Time(9, 25))),
              -		Period.raw(name: "3", time: Range(Time(9, 30), Time(10, 05))),
              -		Period.raw(name: "4", time: Range(Time(10, 10), Time(10, 45))),
              -		Period.raw(name: "Homeroom", time: Range(Time(10, 45), Time(11, 05))),
              -		Period.raw(name: "5", time: Range(Time(11, 05), Time(11, 40))),
              -		Period.raw(name: "6", time: Range(Time(11, 45), Time(12, 20))),
              -		Period.raw(name: "7", time: Range(Time(12, 25), Time(13, 00))),
              -	],
              -);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Schedule/winterFridayRoshChodesh-constant.html b/docs/data/Schedule/winterFridayRoshChodesh-constant.html deleted file mode 100644 index 1b950ad57..000000000 --- a/docs/data/Schedule/winterFridayRoshChodesh-constant.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - winterFridayRoshChodesh constant - Schedule class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              winterFridayRoshChodesh
              - -
              - -
              - - - - -
              -
              - -

              winterFridayRoshChodesh constant - Null safety -

              - -
              - Schedule - const winterFridayRoshChodesh - - -
              - -
              -

              The schedule for when a Rosh Chodesh falls on a Winter Friday.

              -
              - - -
              -

              Implementation

              -
              static const Schedule winterFridayRoshChodesh = Schedule(
              -	name: "Winter Friday Rosh Chodesh",
              -	periods: [
              -		Period.raw(name: "1", time: Range(Time(8, 00), Time(9, 05))),
              -		Period.raw(name: "2", time: Range(Time(9, 10), Time(9, 40))),
              -		Period.raw(name: "3", time: Range(Time(9, 45), Time(10, 15))),
              -		Period.raw(name: "4", time: Range(Time(10, 20), Time(10, 50))),
              -		Period.raw(name: "Homeroom", time: Range(Time(10, 50), Time(11, 10))),
              -		Period.raw(name: "5", time: Range(Time(11, 10), Time(11, 40))),
              -		Period.raw(name: "6", time: Range(Time(11, 45), Time(12, 15))),
              -		Period.raw(name: "7", time: Range(Time(12, 20), Time(12, 50))),
              -	],
              -);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores-class.html b/docs/data/Scores-class.html deleted file mode 100644 index eb8cff473..000000000 --- a/docs/data/Scores-class.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - - - - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Scores
              - -
              - -
              - - - - -
              -
              - -

              Scores class - Null safety - -

              - - -
              -

              The scores for a SportsGame.

              -

              This class provides helper functions that will simplify higher-level logic.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - Scores({required int ramazScore, required int otherScore, required bool isHome}) -
              -
              - Holds the scores for a SportsGame. -
              const
              -
              -
              - Scores.fromJson(Map json) -
              -
              - Creates a Scores object from a JSON entry. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - didDraw - → bool - -
              -
              - If the game ended in a tie. -
              read-only
              - -
              - -
              - didWin - → bool - -
              -
              - If Ramaz won the game. -
              read-only
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - isHome - → bool - -
              -
              - Whether the game is being played at home. [...] -
              final
              - -
              - -
              - otherScore - → int - -
              -
              - The score for the other team. -
              final
              - -
              - -
              - ramazScore - → int - -
              -
              - The score for Ramaz. -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - getScore({required bool home}) - → int - - - -
              -
              - Gets the score for either the home team or the away team. - - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - Converts this object to JSON. [...] - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/Scores.fromJson.html b/docs/data/Scores/Scores.fromJson.html deleted file mode 100644 index 97d7f51fa..000000000 --- a/docs/data/Scores/Scores.fromJson.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - Scores.fromJson constructor - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Scores.fromJson
              - -
              - -
              - - - - -
              -
              - -

              Scores.fromJson constructor - Null safety -

              - -
              - Scores.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Creates a Scores object from a JSON entry.

              -

              The entry must have:

              -
                -
              • an "isHome" field, which should be a bool. See isHome.
              • -
              • an "otherScore" field, which should be an integer. See otherScore.
              • -
              • a "ramazScore" field, which should be an integer. See ramazScore.
              • -
              -
              - - - -
              -

              Implementation

              -
              /// - an "isHome" field, which should be a bool. See [isHome].
              -	/// - an "otherScore" field, which should be an integer. See [otherScore].
              -	/// - a "ramazScore" field, which should be an integer. See [ramazScore].
              -Scores.fromJson(Map json) :
              -	isHome = json ["isHome"],
              -	ramazScore = json ["ramaz"],
              -	otherScore = json ["other"];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/Scores.html b/docs/data/Scores/Scores.html deleted file mode 100644 index 4e854f59a..000000000 --- a/docs/data/Scores/Scores.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - Scores constructor - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Scores
              - -
              - -
              - - - - -
              -
              - -

              Scores constructor - Null safety -

              - -
              const - Scores(
              1. {required int ramazScore,
              2. -
              3. required int otherScore,
              4. -
              5. required bool isHome}
              6. -
              ) -
              - - -
              -

              Holds the scores for a SportsGame.

              -
              - - - -
              -

              Implementation

              -
              const Scores({
              -	required this.ramazScore,
              -	required this.otherScore,
              -	required this.isHome
              -	});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/didDraw.html b/docs/data/Scores/didDraw.html deleted file mode 100644 index d2f41ad6e..000000000 --- a/docs/data/Scores/didDraw.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - didDraw property - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              didDraw
              - -
              - -
              - - - - -
              -
              - -

              didDraw property - Null safety -

              - - - -
              - -
              - bool - didDraw - - -
              - - -
              -

              If the game ended in a tie.

              -
              - - -
              -

              Implementation

              -
              bool get didDraw => ramazScore == otherScore;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/didWin.html b/docs/data/Scores/didWin.html deleted file mode 100644 index f2c62ca54..000000000 --- a/docs/data/Scores/didWin.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - didWin property - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              didWin
              - -
              - -
              - - - - -
              -
              - -

              didWin property - Null safety -

              - - - -
              - -
              - bool - didWin - - -
              - - -
              -

              If Ramaz won the game.

              -
              - - -
              -

              Implementation

              -
              bool get didWin => ramazScore > otherScore;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/getScore.html b/docs/data/Scores/getScore.html deleted file mode 100644 index 48425c682..000000000 --- a/docs/data/Scores/getScore.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - getScore method - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getScore
              - -
              - -
              - - - - -
              -
              - -

              getScore method - Null safety -

              - -
              - - -int -getScore(
              1. {required bool home}
              2. -
              ) - - - -
              - -
              -

              Gets the score for either the home team or the away team.

              -
              - - - -
              -

              Implementation

              -
              int getScore({required bool home}) => home == isHome
              -	  ? ramazScore : otherScore;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/hashCode.html b/docs/data/Scores/hashCode.html deleted file mode 100644 index d45f2b95a..000000000 --- a/docs/data/Scores/hashCode.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - hashCode property - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/isHome.html b/docs/data/Scores/isHome.html deleted file mode 100644 index 89172618e..000000000 --- a/docs/data/Scores/isHome.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - isHome property - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              isHome
              - -
              - -
              - - - - -
              -
              - -

              isHome property - Null safety -

              - -
              - bool - isHome -
              final
              - -
              - -
              -

              Whether the game is being played at home.

              -

              This dictates which score is returned for getScore.

              -
              - - -
              -

              Implementation

              -
              final bool isHome;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/noSuchMethod.html b/docs/data/Scores/noSuchMethod.html deleted file mode 100644 index 337034eec..000000000 --- a/docs/data/Scores/noSuchMethod.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - noSuchMethod method - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/operator_equals.html b/docs/data/Scores/operator_equals.html deleted file mode 100644 index 72ea92c21..000000000 --- a/docs/data/Scores/operator_equals.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - operator == method - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/otherScore.html b/docs/data/Scores/otherScore.html deleted file mode 100644 index cbc4bf1ec..000000000 --- a/docs/data/Scores/otherScore.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - otherScore property - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              otherScore
              - -
              - -
              - - - - -
              -
              - -

              otherScore property - Null safety -

              - -
              - int - otherScore -
              final
              - -
              - -
              -

              The score for the other team.

              -
              - - -
              -

              Implementation

              -
              final int otherScore;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/ramazScore.html b/docs/data/Scores/ramazScore.html deleted file mode 100644 index 6d87812d3..000000000 --- a/docs/data/Scores/ramazScore.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - ramazScore property - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ramazScore
              - -
              - -
              - - - - -
              -
              - -

              ramazScore property - Null safety -

              - -
              - int - ramazScore -
              final
              - -
              - -
              -

              The score for Ramaz.

              -
              - - -
              -

              Implementation

              -
              final int ramazScore;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/runtimeType.html b/docs/data/Scores/runtimeType.html deleted file mode 100644 index 079e14da3..000000000 --- a/docs/data/Scores/runtimeType.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - runtimeType property - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/toJson.html b/docs/data/Scores/toJson.html deleted file mode 100644 index 898eda4c0..000000000 --- a/docs/data/Scores/toJson.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - toJson method - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - -
              -

              Converts this object to JSON.

              -

              Passing the result of this function to Scores.fromJson() should -return an equivalent object.

              -
              - - - -
              -

              Implementation

              -
              Map toJson() => {
              -  	"isHome": isHome,
              -  	"ramaz": ramazScore,
              -  	"other": otherScore,
              -  };
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Scores/toString.html b/docs/data/Scores/toString.html deleted file mode 100644 index 331c1fcb6..000000000 --- a/docs/data/Scores/toString.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - toString method - Scores class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() => "Ramaz: $ramazScore, Other: $otherScore";
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Sport-class.html b/docs/data/Sport-class.html deleted file mode 100644 index 9c9f6465d..000000000 --- a/docs/data/Sport-class.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - - - - Sport enum - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Sport
              - -
              - -
              - - - - -
              -
              - -

              Sport enum - Null safety - -

              - - -
              -

              All the different sports that can be played.

              -
              - - - -
              -

              Constants

              - -
              -
              - baseball - → const Sport - - -
              -
              -

              Baseball.

              - - -
              - const Sport(0) -
              -
              - -
              - basketball - → const Sport - - -
              -
              -

              Basketball.

              - - -
              - const Sport(1) -
              -
              - -
              - hockey - → const Sport - - -
              -
              -

              Hockey.

              - - -
              - const Sport(2) -
              -
              - -
              - soccer - → const Sport - - -
              -
              -

              Soccer.

              - - -
              - const Sport(5) -
              -
              - -
              - tennis - → const Sport - - -
              -
              -

              Tennis.

              - - -
              - const Sport(3) -
              -
              - -
              - values - → const List<Sport> - - -
              -
              -

              A constant List of the values in this enum, in order of their declaration.

              - - -
              - const List<Sport> -
              -
              - -
              - volleyball - → const Sport - - -
              -
              -

              Volleyball.

              - - -
              - const Sport(4) -
              -
              - -
              -
              - - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - index - → int - -
              -
              -

              The integer index of this enum.

              -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Sport/hashCode.html b/docs/data/Sport/hashCode.html deleted file mode 100644 index 4fedd2a81..000000000 --- a/docs/data/Sport/hashCode.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - hashCode property - Sport extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Sport/noSuchMethod.html b/docs/data/Sport/noSuchMethod.html deleted file mode 100644 index 7b32e3058..000000000 --- a/docs/data/Sport/noSuchMethod.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - noSuchMethod method - Sport extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Sport/operator_equals.html b/docs/data/Sport/operator_equals.html deleted file mode 100644 index ecbfd854e..000000000 --- a/docs/data/Sport/operator_equals.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - operator == method - Sport extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Sport/runtimeType.html b/docs/data/Sport/runtimeType.html deleted file mode 100644 index 61b256eab..000000000 --- a/docs/data/Sport/runtimeType.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - runtimeType property - Sport extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Sport/toString.html b/docs/data/Sport/toString.html deleted file mode 100644 index 300ff371c..000000000 --- a/docs/data/Sport/toString.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - toString method - Sport extension - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame-class.html b/docs/data/SportsGame-class.html deleted file mode 100644 index 3dc6eeab7..000000000 --- a/docs/data/SportsGame-class.html +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - - - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              SportsGame
              - -
              - -
              - - - - -
              -
              - -

              SportsGame class - Null safety - -

              - - -
              -

              A sports game.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - SportsGame({required Sport sport, required DateTime date, required Range times, required String team, required String opponent, required bool isHome, Scores? scores}) -
              -
              - Creates a game dataclass. -
              const
              -
              -
              - SportsGame.fromJson(Map json) -
              -
              - Converts a JSON entry to a SportsGame. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - awayTeam - → String - -
              -
              - The name of the away team. -
              read-only
              - -
              - -
              - date - → DateTime - -
              -
              - The date of the game. [...] -
              final
              - -
              - -
              - dateTime - → DateTime - -
              -
              - The end of the match. [...] -
              read-only
              - -
              - -
              - description - → String - -
              -
              - Specifies which team is away and which team is home. -
              read-only
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only
              - -
              - -
              - homeTeam - → String - -
              -
              - The name of the home team. -
              read-only
              - -
              - -
              - isHome - → bool - -
              -
              - Whether the game is being played at home or somewhere else. [...] -
              final
              - -
              - -
              - opponent - → String - -
              -
              - The opponent school being played. -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - scores - Scores? - -
              -
              - The scores for this game. [...] -
              final
              - -
              - -
              - sport - Sport - -
              -
              - The type of sport being played. -
              final
              - -
              - -
              - team - → String - -
              -
              - The team playing the game. -
              final
              - -
              - -
              - times - Range - -
              -
              - The start and end times for this game. [...] -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - replaceScores(Scores? newScores) - SportsGame - - - -
              -
              - Returns a new SportsGame with the scores switched out. [...] - - -
              - -
              - toJson() - → Map - - - -
              -
              - Converts this game to JSON. [...] - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(dynamic other) - → bool - - - -
              -
              - The equality operator. [...] - - -
              - -
              -
              - - -
              -

              Static Methods

              -
              -
              - capitalize(Sport sport) - → String - - - -
              -
              - Capitalizes a word. [...] - - -
              - -
              - fromList(List<Map> listJson) - → List<SportsGame> - - - -
              -
              - Converts a list of JSON entries into a list of SportsGames. [...] - - -
              - -
              - getJsonList(List<SportsGame> games) - → List<Map> - - - -
              -
              - Converts a list of SportsGames into a list of JSON entries. - - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/SportsGame.fromJson.html b/docs/data/SportsGame/SportsGame.fromJson.html deleted file mode 100644 index d2475b737..000000000 --- a/docs/data/SportsGame/SportsGame.fromJson.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - SportsGame.fromJson constructor - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              SportsGame.fromJson
              - -
              - -
              - - - - -
              -
              - -

              SportsGame.fromJson constructor - Null safety -

              - -
              - SportsGame.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Converts a JSON entry to a SportsGame.

              -

              The JSON should have:

              -
                -
              • a "sport" field (String)
              • -
              • a "date" field (String acceptable to DateTime.parse. Eg, "2012-02-27")
              • -
              • a "times" field. See Range.fromJson for format.
              • -
              • a "team" field (String)
              • -
              • a "home" field (bool)
              • -
              • an "opponent" field (String)
              • -
              • a "scores" field. See Scores.fromJson for format.
              • -
              -
              - - - -
              -

              Implementation

              -
              SportsGame.fromJson(Map json) :
              -	sport = stringToSport [json ["sport"]]!,
              -	date = DateTime.parse(json ["date"]),
              -	times = Range.fromJson(json ["times"]),
              -	team = json ["team"],
              -	isHome = json ["isHome"],
              -	opponent = json ["opponent"],
              -	scores = json ["scores"] == null ? null : Scores.fromJson(
              -		Map.from(json ["scores"])
              -	);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/SportsGame.html b/docs/data/SportsGame/SportsGame.html deleted file mode 100644 index ece588f4b..000000000 --- a/docs/data/SportsGame/SportsGame.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - SportsGame constructor - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              SportsGame
              - -
              - -
              - - - - -
              -
              - -

              SportsGame constructor - Null safety -

              - -
              const - SportsGame(
              1. {required Sport sport,
              2. -
              3. required DateTime date,
              4. -
              5. required Range times,
              6. -
              7. required String team,
              8. -
              9. required String opponent,
              10. -
              11. required bool isHome,
              12. -
              13. Scores? scores}
              14. -
              ) -
              - - -
              -

              Creates a game dataclass.

              -
              - - - -
              -

              Implementation

              -
              const SportsGame({
              -	required this.sport,
              -	required this.date,
              -	required this.times,
              -	required this.team,
              -	required this.opponent,
              -	required this.isHome,
              -	this.scores,
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/awayTeam.html b/docs/data/SportsGame/awayTeam.html deleted file mode 100644 index d8b6ee157..000000000 --- a/docs/data/SportsGame/awayTeam.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - awayTeam property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              awayTeam
              - -
              - -
              - - - - -
              -
              - -

              awayTeam property - Null safety -

              - - - -
              - -
              - String - awayTeam - - -
              - - -
              -

              The name of the away team.

              -
              - - -
              -

              Implementation

              -
              String get awayTeam => isHome ? opponent : "Ramaz";
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/capitalize.html b/docs/data/SportsGame/capitalize.html deleted file mode 100644 index 0f71b2d47..000000000 --- a/docs/data/SportsGame/capitalize.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - capitalize method - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              capitalize
              - -
              - -
              - - - - -
              -
              - -

              capitalize method - Null safety -

              - -
              - - -String -capitalize(
              1. Sport sport
              2. -
              ) - - - -
              - -
              -

              Capitalizes a word.

              -

              Useful for the Sport enum.

              -
              - - - -
              -

              Implementation

              -
              static String capitalize(Sport sport) =>
              -	sportToString [sport]! [0].toUpperCase()
              -	+ sportToString [sport]!.substring(1);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/date.html b/docs/data/SportsGame/date.html deleted file mode 100644 index 79e9a1e82..000000000 --- a/docs/data/SportsGame/date.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - date property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              date
              - -
              - -
              - - - - -
              -
              - -

              date property - Null safety -

              - -
              - DateTime - date -
              final
              - -
              - -
              -

              The date of the game.

              -

              The time can be ignored since it is represented in times.

              -
              - - -
              -

              Implementation

              -
              final DateTime date;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/dateTime.html b/docs/data/SportsGame/dateTime.html deleted file mode 100644 index 4aa44ad66..000000000 --- a/docs/data/SportsGame/dateTime.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - dateTime property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              dateTime
              - -
              - -
              - - - - -
              -
              - -

              dateTime property - Null safety -

              - - - -
              - -
              - DateTime - dateTime - - -
              - - -
              -

              The end of the match.

              -

              This is convenient for checking if the game already passed.

              -
              - - -
              -

              Implementation

              -
              DateTime get dateTime => DateTime(
              -	date.year,
              -	date.month,
              -	date.day,
              -	times.end.hour,
              -	times.end.minutes,
              -);
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/description.html b/docs/data/SportsGame/description.html deleted file mode 100644 index 37f8ad45e..000000000 --- a/docs/data/SportsGame/description.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - description property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              description
              - -
              - -
              - - - - -
              -
              - -

              description property - Null safety -

              - - - -
              - -
              - String - description - - -
              - - -
              -

              Specifies which team is away and which team is home.

              -
              - - -
              -

              Implementation

              -
              String get description => "$awayTeam @ $homeTeam";
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/fromList.html b/docs/data/SportsGame/fromList.html deleted file mode 100644 index 6370b3a1f..000000000 --- a/docs/data/SportsGame/fromList.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - fromList method - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              fromList
              - -
              - -
              - - - - -
              -
              - -

              fromList method - Null safety -

              - -
              - - -List<SportsGame> -fromList(
              1. List<Map> listJson
              2. -
              ) - - - -
              - -
              -

              Converts a list of JSON entries into a list of SportsGames.

              -

              This method is needed since it casts each dynamic entry to a -Map, and then passes those values to -SportsGame.fromJson.

              -
              - - - -
              -

              Implementation

              -
              static List<SportsGame> fromList(List<Map> listJson) => [
              -	for (final Map json in listJson)
              -		SportsGame.fromJson(json)
              -];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/getJsonList.html b/docs/data/SportsGame/getJsonList.html deleted file mode 100644 index 2e151e7ab..000000000 --- a/docs/data/SportsGame/getJsonList.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - getJsonList method - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getJsonList
              - -
              - -
              - - - - -
              -
              - -

              getJsonList method - Null safety -

              - -
              - - -List<Map> -getJsonList(
              1. List<SportsGame> games
              2. -
              ) - - - -
              - -
              -

              Converts a list of SportsGames into a list of JSON entries.

              -
              - - - -
              -

              Implementation

              -
              static List<Map> getJsonList(List<SportsGame> games) => [
              -	for (final SportsGame game in games)
              -		game.toJson()
              -];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/hashCode.html b/docs/data/SportsGame/hashCode.html deleted file mode 100644 index 9244edf8f..000000000 --- a/docs/data/SportsGame/hashCode.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - hashCode property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              - -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode - - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              @override
              -int get hashCode => "$isHome-$opponent-$sport-$team-$date-$times".hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/homeTeam.html b/docs/data/SportsGame/homeTeam.html deleted file mode 100644 index 8f4bb959f..000000000 --- a/docs/data/SportsGame/homeTeam.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - homeTeam property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              homeTeam
              - -
              - -
              - - - - -
              -
              - -

              homeTeam property - Null safety -

              - - - -
              - -
              - String - homeTeam - - -
              - - -
              -

              The name of the home team.

              -
              - - -
              -

              Implementation

              -
              String get homeTeam => isHome ? "Ramaz" : opponent;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/isHome.html b/docs/data/SportsGame/isHome.html deleted file mode 100644 index 385efcce4..000000000 --- a/docs/data/SportsGame/isHome.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - isHome property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              isHome
              - -
              - -
              - - - - -
              -
              - -

              isHome property - Null safety -

              - -
              - bool - isHome -
              final
              - -
              - -
              -

              Whether the game is being played at home or somewhere else.

              -

              This affects the UI representation of the game, as well as Scores.isHome.

              -
              - - -
              -

              Implementation

              -
              final bool isHome;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/noSuchMethod.html b/docs/data/SportsGame/noSuchMethod.html deleted file mode 100644 index b4b066b98..000000000 --- a/docs/data/SportsGame/noSuchMethod.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - noSuchMethod method - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/operator_equals.html b/docs/data/SportsGame/operator_equals.html deleted file mode 100644 index e06fe7fad..000000000 --- a/docs/data/SportsGame/operator_equals.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - operator == method - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              - -

              operator == method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -bool -operator ==(
              1. dynamic other
              2. -
              ) - - - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              @override
              -bool operator == (dynamic other) => other is SportsGame &&
              -	other.sport == sport &&
              -	other.opponent == opponent &&
              -	other.isHome == isHome &&
              -	other.team == team &&
              -	other.date.isSameDay(date) &&
              -	other.times == times;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/opponent.html b/docs/data/SportsGame/opponent.html deleted file mode 100644 index 5b1b31091..000000000 --- a/docs/data/SportsGame/opponent.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - opponent property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              opponent
              - -
              - -
              - - - - -
              -
              - -

              opponent property - Null safety -

              - -
              - String - opponent -
              final
              - -
              - -
              -

              The opponent school being played.

              -
              - - -
              -

              Implementation

              -
              final String opponent;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/replaceScores.html b/docs/data/SportsGame/replaceScores.html deleted file mode 100644 index 97d364f9a..000000000 --- a/docs/data/SportsGame/replaceScores.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - replaceScores method - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              replaceScores
              - -
              - -
              - - - - -
              -
              - -

              replaceScores method - Null safety -

              - -
              - - -SportsGame -replaceScores(
              1. Scores? newScores
              2. -
              ) - - - -
              - -
              -

              Returns a new SportsGame with the scores switched out.

              -

              This method allows SportsGames to stay immutable.

              -
              - - - -
              -

              Implementation

              -
              SportsGame replaceScores(Scores? newScores) => SportsGame(
              -	sport: sport,
              -	team: team,
              -	isHome: isHome,
              -	date: date,
              -	opponent: opponent,
              -	times: times,
              -	scores: newScores,
              -);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/runtimeType.html b/docs/data/SportsGame/runtimeType.html deleted file mode 100644 index e68c81210..000000000 --- a/docs/data/SportsGame/runtimeType.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - runtimeType property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/scores.html b/docs/data/SportsGame/scores.html deleted file mode 100644 index 65803d78e..000000000 --- a/docs/data/SportsGame/scores.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - scores property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              scores
              - -
              - -
              - - - - -
              -
              - -

              scores property - Null safety -

              - -
              - Scores? - scores -
              final
              - -
              - -
              -

              The scores for this game.

              -

              The Scores dataclass holds helper methods to simplify logic about who -won, and which score to get depending on isHome.

              -
              - - -
              -

              Implementation

              -
              final Scores? scores;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/sport.html b/docs/data/SportsGame/sport.html deleted file mode 100644 index eb2d116a0..000000000 --- a/docs/data/SportsGame/sport.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - sport property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              sport
              - -
              - -
              - - - - -
              -
              - -

              sport property - Null safety -

              - -
              - Sport - sport -
              final
              - -
              - -
              -

              The type of sport being played.

              -
              - - -
              -

              Implementation

              -
              final Sport sport;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/team.html b/docs/data/SportsGame/team.html deleted file mode 100644 index e4871c1b8..000000000 --- a/docs/data/SportsGame/team.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - team property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              team
              - -
              - -
              - - - - -
              -
              - -

              team property - Null safety -

              - -
              - String - team -
              final
              - -
              - -
              -

              The team playing the game.

              -
              - - -
              -

              Implementation

              -
              // TODO(Levi): make sure this data is downloaded properly, #2
              -final String team;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/times.html b/docs/data/SportsGame/times.html deleted file mode 100644 index 8d6c06fda..000000000 --- a/docs/data/SportsGame/times.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - times property - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              times
              - -
              - -
              - - - - -
              -
              - -

              times property - Null safety -

              - -
              - Range - times -
              final
              - -
              - -
              -

              The start and end times for this game.

              -

              The date can be ignored since it is represented in date.

              -
              - - -
              -

              Implementation

              -
              final Range times;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/toJson.html b/docs/data/SportsGame/toJson.html deleted file mode 100644 index 193692486..000000000 --- a/docs/data/SportsGame/toJson.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - toJson method - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - -
              -

              Converts this game to JSON.

              -

              Passing the result of this function to SportsGame.fromJson() should -return an equivalent object.

              -
              - - - -
              -

              Implementation

              -
              Map toJson() => {
              -	"sport": sportToString [sport],
              -	"date": date.toString(),
              -	"times": times.toJson(),
              -	"team": team,
              -	"isHome": isHome,
              -	"opponent": opponent,
              -	"scores": scores?.toJson(),
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SportsGame/toString.html b/docs/data/SportsGame/toString.html deleted file mode 100644 index 7ef366426..000000000 --- a/docs/data/SportsGame/toString.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - toString method - SportsGame class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              -

              toString method - Null safety -

              - -
              - - -String -toString() - -
              inherited
              - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              external String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject-class.html b/docs/data/Subject-class.html deleted file mode 100644 index 5fa4dc68e..000000000 --- a/docs/data/Subject-class.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - - - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Subject
              - -
              - -
              - - - - -
              -
              - -

              Subject class - Null safety - -

              - - -
              -

              A subject, or class, that a student can take.

              -

              Since one's schedule contains multiple instances of the same subject, -subjects are represented externally by an ID, which is used to look up -a canonicalized Subject instance. This saves space and simplifies -compatibility with existing school databases.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - Subject({required String name, required String teacher, String? virtualLink}) -
              -
              - A const constructor for a Subject. -
              const
              -
              -
              - Subject.fromJson(Map json) -
              -
              - Returns a Subject instance from a JSON object. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only
              - -
              - -
              - name - → String - -
              -
              - The name of this subject. -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - teacher - → String - -
              -
              - The teacher who teaches this subject. -
              final
              - -
              - - -
              - A link to a virtual class, like Zoom. -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(dynamic other) - → bool - - - -
              -
              - The equality operator. [...] - - -
              - -
              -
              - - -
              -

              Static Methods

              -
              -
              - getSubjects(Map<String, Map> data) - → Map<String, Subject> - - - -
              -
              - Returns a map of Subjects from a list of JSON objects. [...] - - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/Subject.fromJson.html b/docs/data/Subject/Subject.fromJson.html deleted file mode 100644 index 6f9321773..000000000 --- a/docs/data/Subject/Subject.fromJson.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - Subject.fromJson constructor - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Subject.fromJson
              - -
              - -
              - - - - -
              -
              - -

              Subject.fromJson constructor - Null safety -

              - -
              - Subject.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Returns a Subject instance from a JSON object.

              -

              The JSON map must have a teacher and name field.

              -
              - - - -
              -

              Implementation

              -
              Subject.fromJson(Map json) :
              -	name = json ["name"],
              -	teacher = json ["teacher"],
              -	virtualLink = json ["virtualLink"];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/Subject.html b/docs/data/Subject/Subject.html deleted file mode 100644 index 2460a5b75..000000000 --- a/docs/data/Subject/Subject.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - Subject constructor - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Subject
              - -
              - -
              - - - - -
              -
              - -

              Subject constructor - Null safety -

              - -
              const - Subject(
              1. {required String name,
              2. -
              3. required String teacher,
              4. -
              5. String? virtualLink}
              6. -
              ) -
              - - -
              -

              A const constructor for a Subject.

              -
              - - - -
              -

              Implementation

              -
              const Subject ({
              -	required this.name,
              -	required this.teacher,
              -	this.virtualLink,
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/getSubjects.html b/docs/data/Subject/getSubjects.html deleted file mode 100644 index 3d7437914..000000000 --- a/docs/data/Subject/getSubjects.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - getSubjects method - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getSubjects
              - -
              - -
              - - - - -
              -
              - -

              getSubjects method - Null safety -

              - -
              - - -Map<String, Subject> -getSubjects(
              1. Map<String, Map> data
              2. -
              ) - - - -
              - -
              -

              Returns a map of Subjects from a list of JSON objects.

              -

              The keys are IDs to the subject, and the values are the -corresponding Subject instances. -See Subject.fromJson for more details.

              -
              - - - -
              -

              Implementation

              -
              static Map<String, Subject> getSubjects(
              -	Map<String, Map> data
              -) => data.map (
              -	(String id, Map json) => MapEntry (
              -		id,
              -		Subject.fromJson(json)
              -	)
              -);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/hashCode.html b/docs/data/Subject/hashCode.html deleted file mode 100644 index da1d7df16..000000000 --- a/docs/data/Subject/hashCode.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - hashCode property - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              - -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode - - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              @override
              -int get hashCode => "$name-$teacher".hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/name.html b/docs/data/Subject/name.html deleted file mode 100644 index 65d2182b6..000000000 --- a/docs/data/Subject/name.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - name property - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              name
              - -
              - -
              - - - - -
              -
              - -

              name property - Null safety -

              - -
              - String - name -
              final
              - -
              - -
              -

              The name of this subject.

              -
              - - -
              -

              Implementation

              -
              final String name;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/noSuchMethod.html b/docs/data/Subject/noSuchMethod.html deleted file mode 100644 index b7b39d2af..000000000 --- a/docs/data/Subject/noSuchMethod.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - noSuchMethod method - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/operator_equals.html b/docs/data/Subject/operator_equals.html deleted file mode 100644 index c12cc3aa5..000000000 --- a/docs/data/Subject/operator_equals.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - operator == method - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              - -

              operator == method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -bool -operator ==(
              1. dynamic other
              2. -
              ) - - - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              @override
              -bool operator == (dynamic other) => other is Subject &&
              -	other.name == name &&
              -	other.teacher == teacher;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/runtimeType.html b/docs/data/Subject/runtimeType.html deleted file mode 100644 index 13736285f..000000000 --- a/docs/data/Subject/runtimeType.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - runtimeType property - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/teacher.html b/docs/data/Subject/teacher.html deleted file mode 100644 index 38327928a..000000000 --- a/docs/data/Subject/teacher.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - teacher property - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              teacher
              - -
              - -
              - - - - -
              -
              - -

              teacher property - Null safety -

              - -
              - String - teacher -
              final
              - -
              - -
              -

              The teacher who teaches this subject.

              -
              - - -
              -

              Implementation

              -
              final String teacher;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/toString.html b/docs/data/Subject/toString.html deleted file mode 100644 index e7970119a..000000000 --- a/docs/data/Subject/toString.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - toString method - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() => "$name ($teacher)";
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Subject/virtualLink.html b/docs/data/Subject/virtualLink.html deleted file mode 100644 index b001aa077..000000000 --- a/docs/data/Subject/virtualLink.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - virtualLink property - Subject class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              virtualLink
              - -
              - -
              - - - - -
              -
              - -

              virtualLink property - Null safety -

              - -
              - String? - virtualLink -
              final
              - -
              - -
              -

              A link to a virtual class, like Zoom.

              -
              - - -
              -

              Implementation

              -
              final String? virtualLink;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SubjectReminderTime-class.html b/docs/data/SubjectReminderTime-class.html deleted file mode 100644 index 3154b2bb5..000000000 --- a/docs/data/SubjectReminderTime-class.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - - - - SubjectReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              SubjectReminderTime
              - -
              - -
              - - - - -
              -
              - -

              SubjectReminderTime class - Null safety - -

              - - -
              -

              A ReminderTime that depends on a subject.

              -
              - - -
              -
              -
              Inheritance
              -
              - - - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - SubjectReminderTime({required String name, required bool repeats}) -
              -
              - Returns a new SubjectReminderTime. All parameters must be non-null. -
              const
              -
              -
              - SubjectReminderTime.fromJson(Map json) -
              -
              - Returns a new SubjectReminderTime from a JSON object. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hash - → String - -
              -
              - -
              read-only, override
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - name - → String - -
              -
              - The name of the subject this ReminderTime depends on. -
              final
              - -
              - -
              - repeats - → bool - -
              -
              - Whether the reminder should repeat. -
              final, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - type - ReminderTimeType - -
              -
              - The type of reminder. [...] -
              final, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - doesApply({required String? dayName, required String? subject, required String? period}) - → bool - - - -
              -
              - Returns true if this instance's subject field -matches the subject parameter. -
              override
              - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - Returns this ReminderTime as JSON. -
              override
              - -
              - -
              - toString() - → String - - - -
              -
              - Returns a String representation of this ReminderTime. [...] -
              override
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SubjectReminderTime/SubjectReminderTime.fromJson.html b/docs/data/SubjectReminderTime/SubjectReminderTime.fromJson.html deleted file mode 100644 index 8ed8b6e9b..000000000 --- a/docs/data/SubjectReminderTime/SubjectReminderTime.fromJson.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - SubjectReminderTime.fromJson constructor - SubjectReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              SubjectReminderTime.fromJson
              - -
              - -
              - - - - -
              -
              - -

              SubjectReminderTime.fromJson constructor - Null safety -

              - -
              - SubjectReminderTime.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Returns a new SubjectReminderTime from a JSON object.

              -

              The fields repeats and name must not be null.

              -
              - - - -
              -

              Implementation

              -
              SubjectReminderTime.fromJson(Map json) :
              -	name = json ["name"],
              -	super (repeats: json ["repeats"], type: ReminderTimeType.subject);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SubjectReminderTime/SubjectReminderTime.html b/docs/data/SubjectReminderTime/SubjectReminderTime.html deleted file mode 100644 index c5234db8a..000000000 --- a/docs/data/SubjectReminderTime/SubjectReminderTime.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - SubjectReminderTime constructor - SubjectReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              SubjectReminderTime
              - -
              - -
              - - - - -
              -
              - -

              SubjectReminderTime constructor - Null safety -

              - -
              const - SubjectReminderTime(
              1. {required String name,
              2. -
              3. required bool repeats}
              4. -
              ) -
              - - -
              -

              Returns a new SubjectReminderTime. All parameters must be non-null.

              -
              - - - -
              -

              Implementation

              -
              const SubjectReminderTime({
              -	required this.name,
              -	required bool repeats,
              -}) : super (repeats: repeats, type: ReminderTimeType.subject);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SubjectReminderTime/doesApply.html b/docs/data/SubjectReminderTime/doesApply.html deleted file mode 100644 index 6402449c2..000000000 --- a/docs/data/SubjectReminderTime/doesApply.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - doesApply method - SubjectReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              doesApply
              - -
              - -
              - - - - -
              -
              - -

              doesApply method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -bool -doesApply(
              1. {required String? dayName,
              2. -
              3. required String? subject,
              4. -
              5. required String? period}
              6. -
              ) - -
              override
              - -
              - -
              -

              Returns true if this instance's subject field -matches the subject parameter.

              -
              - - - -
              -

              Implementation

              -
              @override
              -bool doesApply({
              -	required String? dayName,
              -	required String? subject,
              -	required String? period,
              -}) => subject == name;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SubjectReminderTime/hash.html b/docs/data/SubjectReminderTime/hash.html deleted file mode 100644 index 2bb80281e..000000000 --- a/docs/data/SubjectReminderTime/hash.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - hash property - SubjectReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hash
              - -
              - -
              - - - - -
              -
              - -

              hash property - Null safety -

              - - - -
              - -
              - String - hash -
              override
              - -
              - - - - -
              -

              Implementation

              -
              @override
              -String get hash => "$name-$repeats";
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SubjectReminderTime/name.html b/docs/data/SubjectReminderTime/name.html deleted file mode 100644 index ce2ee45e0..000000000 --- a/docs/data/SubjectReminderTime/name.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - name property - SubjectReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              name
              - -
              - -
              - - - - -
              -
              - -

              name property - Null safety -

              - -
              - String - name -
              final
              - -
              - -
              -

              The name of the subject this ReminderTime depends on.

              -
              - - -
              -

              Implementation

              -
              final String name;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SubjectReminderTime/toJson.html b/docs/data/SubjectReminderTime/toJson.html deleted file mode 100644 index b46ea814b..000000000 --- a/docs/data/SubjectReminderTime/toJson.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - toJson method - SubjectReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -Map -toJson() - -
              override
              - -
              - -
              -

              Returns this ReminderTime as JSON.

              -
              - - - -
              -

              Implementation

              -
              @override
              -Map toJson() => {
              -	"name": name,
              -	"repeats": repeats,
              -	"type": reminderTimeToString [type],
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/SubjectReminderTime/toString.html b/docs/data/SubjectReminderTime/toString.html deleted file mode 100644 index 80a7579eb..000000000 --- a/docs/data/SubjectReminderTime/toString.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - toString method - SubjectReminderTime class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - -
              override
              - -
              - -
              -

              Returns a String representation of this ReminderTime.

              -

              Used for debugging and throughout the UI.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() => (repeats ? "Repeats every " : "") + name;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time-class.html b/docs/data/Time-class.html deleted file mode 100644 index adee3dbc7..000000000 --- a/docs/data/Time-class.html +++ /dev/null @@ -1,399 +0,0 @@ - - - - - - - - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Time
              - -
              - -
              - - - - -
              -
              - -

              Time class - Null safety - -

              - - -
              -

              The hour and minute representation of a time.

              -

              This is used instead of Flutter's TimeOfDay -to provide the > and < operators.

              -
              - - -
              -
              - - - - -
              Available Extensions
              -
              - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - Time(int hour, int minutes) -
              -
              - A const constructor. -
              const
              -
              -
              - Time.fromDateTime(DateTime date) -
              -
              - Simplifies a DateTime object to a Time. -
              -
              - Time.fromJson(Map json) -
              -
              - Returns a new Time object from JSON data. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only
              - -
              - -
              - hour - → int - -
              -
              - The hour in 24-hour format. -
              final
              - -
              - -
              - minutes - → int - -
              -
              - The minutes. -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toJson() - → Map - - - -
              -
              - Returns this obect in JSON form - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator <(Time other) - → bool - - - -
              -
              - Returns whether this Time is before another Time. - - -
              - -
              - operator <=(Time other) - → bool - - - -
              -
              - Returns whether this Time is at or before another Time. - - -
              - -
              - operator ==(dynamic other) - → bool - - - -
              -
              - The equality operator. [...] - - -
              - -
              - operator >(Time other) - → bool - - - -
              -
              - Returns whether this Time is after another Time. - - -
              - -
              - operator >=(Time other) - → bool - - - -
              -
              - Returns whether this Time is at or after another Time. - - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/Time.fromDateTime.html b/docs/data/Time/Time.fromDateTime.html deleted file mode 100644 index 6381245d3..000000000 --- a/docs/data/Time/Time.fromDateTime.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - Time.fromDateTime constructor - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Time.fromDateTime
              - -
              - -
              - - - - -
              -
              - -

              Time.fromDateTime constructor - Null safety -

              - -
              - Time.fromDateTime(
              1. DateTime date
              2. -
              ) -
              - - -
              -

              Simplifies a DateTime object to a Time.

              -
              - - - -
              -

              Implementation

              -
              Time.fromDateTime (DateTime date) :
              -	hour = date.hour,
              -	minutes = date.minute;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/Time.fromJson.html b/docs/data/Time/Time.fromJson.html deleted file mode 100644 index 10f258df5..000000000 --- a/docs/data/Time/Time.fromJson.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - Time.fromJson constructor - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Time.fromJson
              - -
              - -
              - - - - -
              -
              - -

              Time.fromJson constructor - Null safety -

              - -
              - Time.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Returns a new Time object from JSON data.

              -

              The json must have hour and minutes fields that map to integers.

              -
              - - - -
              -

              Implementation

              -
              Time.fromJson(Map json) :
              -	hour = json ["hour"],
              -	minutes = json ["minutes"];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/Time.html b/docs/data/Time/Time.html deleted file mode 100644 index b4fcd89de..000000000 --- a/docs/data/Time/Time.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - Time constructor - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Time
              - -
              - -
              - - - - -
              -
              - -

              Time constructor - Null safety -

              - -
              const - Time(
              1. int hour,
              2. -
              3. int minutes
              4. -
              ) -
              - - -
              -

              A const constructor.

              -
              - - - -
              -

              Implementation

              -
              const Time(this.hour, this.minutes);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/hashCode.html b/docs/data/Time/hashCode.html deleted file mode 100644 index e922e7f50..000000000 --- a/docs/data/Time/hashCode.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - hashCode property - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              - -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode - - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              @override
              -int get hashCode => toString().hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/hour.html b/docs/data/Time/hour.html deleted file mode 100644 index 09b1ae571..000000000 --- a/docs/data/Time/hour.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - hour property - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hour
              - -
              - -
              - - - - -
              -
              - -

              hour property - Null safety -

              - -
              - int - hour -
              final
              - -
              - -
              -

              The hour in 24-hour format.

              -
              - - -
              -

              Implementation

              -
              final int hour;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/minutes.html b/docs/data/Time/minutes.html deleted file mode 100644 index cee99d2af..000000000 --- a/docs/data/Time/minutes.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - minutes property - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              minutes
              - -
              - -
              - - - - -
              -
              - -

              minutes property - Null safety -

              - -
              - int - minutes -
              final
              - -
              - -
              -

              The minutes.

              -
              - - -
              -

              Implementation

              -
              final int minutes;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/noSuchMethod.html b/docs/data/Time/noSuchMethod.html deleted file mode 100644 index d864a02af..000000000 --- a/docs/data/Time/noSuchMethod.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - noSuchMethod method - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/operator_equals.html b/docs/data/Time/operator_equals.html deleted file mode 100644 index 9fbe6b6f3..000000000 --- a/docs/data/Time/operator_equals.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - operator == method - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              - -

              operator == method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -bool -operator ==(
              1. dynamic other
              2. -
              ) - - - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              @override
              -bool operator == (dynamic other) => other.runtimeType == Time &&
              -	other.hour == hour &&
              -	other.minutes == minutes;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/operator_greater.html b/docs/data/Time/operator_greater.html deleted file mode 100644 index fb34a8d22..000000000 --- a/docs/data/Time/operator_greater.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - operator > method - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator >
              - -
              - -
              - - - - -
              -
              - -

              operator > method - Null safety -

              - -
              - - -bool -operator >(
              1. Time other
              2. -
              ) - - - -
              - -
              -

              Returns whether this Time is after another Time.

              -
              - - - -
              -

              Implementation

              -
              bool operator > (Time other) => hour > other.hour ||
              -	(hour == other.hour && minutes > other.minutes);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/operator_greater_equal.html b/docs/data/Time/operator_greater_equal.html deleted file mode 100644 index d786f7cc3..000000000 --- a/docs/data/Time/operator_greater_equal.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - operator >= method - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator >=
              - -
              - -
              - - - - -
              -
              - -

              operator >= method - Null safety -

              - -
              - - -bool -operator >=(
              1. Time other
              2. -
              ) - - - -
              - -
              -

              Returns whether this Time is at or after another Time.

              -
              - - - -
              -

              Implementation

              -
              bool operator >= (Time other) => this > other || this == other;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/operator_less.html b/docs/data/Time/operator_less.html deleted file mode 100644 index 71bc549e1..000000000 --- a/docs/data/Time/operator_less.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - operator < method - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator <
              - -
              - -
              - - - - -
              -
              - -

              operator < method - Null safety -

              - -
              - - -bool -operator <(
              1. Time other
              2. -
              ) - - - -
              - -
              -

              Returns whether this Time is before another Time.

              -
              - - - -
              -

              Implementation

              -
              bool operator < (Time other) => hour < other.hour ||
              -	(hour == other.hour && minutes < other.minutes);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/operator_less_equal.html b/docs/data/Time/operator_less_equal.html deleted file mode 100644 index 8505c418d..000000000 --- a/docs/data/Time/operator_less_equal.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - operator <= method - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator <=
              - -
              - -
              - - - - -
              -
              - -

              operator <= method - Null safety -

              - -
              - - -bool -operator <=(
              1. Time other
              2. -
              ) - - - -
              - -
              -

              Returns whether this Time is at or before another Time.

              -
              - - - -
              -

              Implementation

              -
              bool operator <= (Time other) => this < other || this == other;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/runtimeType.html b/docs/data/Time/runtimeType.html deleted file mode 100644 index 630e51cf3..000000000 --- a/docs/data/Time/runtimeType.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - runtimeType property - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/toJson.html b/docs/data/Time/toJson.html deleted file mode 100644 index 019452af2..000000000 --- a/docs/data/Time/toJson.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - toJson method - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toJson
              - -
              - -
              - - - - -
              -
              - -

              toJson method - Null safety -

              - -
              - - -Map -toJson() - - - -
              - -
              -

              Returns this obect in JSON form

              -
              - - - -
              -

              Implementation

              -
              Map toJson() => {
              -	"hour": hour,
              -	"minutes": minutes,
              -};
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/Time/toString.html b/docs/data/Time/toString.html deleted file mode 100644 index 2f8d7cbbf..000000000 --- a/docs/data/Time/toString.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - toString method - Time class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              - -

              toString method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -String -toString() - - - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              @override
              -String toString() =>
              -	"${hour > 12 ? hour - 12 : hour}:${minutes.toString().padLeft(2, '0')}";
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User-class.html b/docs/data/User-class.html deleted file mode 100644 index 0ea9a2bc1..000000000 --- a/docs/data/User-class.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - - - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              User
              - -
              - -
              - - - - -
              -
              - -

              User class - Null safety - -

              - - -
              -

              Represents a user and all their data.

              -

              This objects includes data like the user's schedule, grade, list of clubs, -and more.

              -
              - - -
              -
              - - - - - -
              Annotations
              -
              -
              -
              - -
              -

              Constructors

              - -
              -
              - User({required Map<String, List<PeriodData?>> schedule, required ContactInfo contactInfo, required List<String> registeredClubs, required Iterable<String> dayNames, Grade? grade, Advisory? advisory}) -
              -
              - Creates a new user. -
              const
              -
              -
              - User.fromJson(Map json) -
              -
              - Creates a new user from JSON. -
              -
              -
              - -
              -

              Properties

              - -
              -
              - advisory - Advisory? - -
              -
              - The advisory for this user. -
              final
              - -
              - -
              - contactInfo - → ContactInfo - -
              -
              - This user's contact information. -
              final
              - -
              - -
              - dayNames - → Iterable<String> - -
              -
              - The possible day names for this user's schedule. [...] -
              final
              - -
              - -
              - grade - Grade? - -
              -
              - The grade this user is in. [...] -
              final
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - registeredClubs - → List<String> - -
              -
              - The IDs of the clubs this user attends. [...] -
              final
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - schedule - → Map<String, List<PeriodData?>> - -
              -
              - The user's schedule. [...] -
              final
              - -
              - -
              - sectionIDs - → Set<String> - -
              -
              - Gets the unique section IDs for the courses this user is enrolled in. [...] -
              read-only
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - getPeriods(Day day) - → List<Period> - - - -
              -
              - Computes the periods, in order, for a given day. [...] - - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - -
              -

              Static Methods

              -
              -
              - safeJson(Map json, String key) - → dynamic - - - -
              -
              - Gets a value from JSON, throwing if null. [...] - - -
              - -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/User.fromJson.html b/docs/data/User/User.fromJson.html deleted file mode 100644 index 6e2fb5b37..000000000 --- a/docs/data/User/User.fromJson.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - User.fromJson constructor - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              User.fromJson
              - -
              - -
              - - - - -
              -
              - -

              User.fromJson constructor - Null safety -

              - -
              - User.fromJson(
              1. Map json
              2. -
              ) -
              - - -
              -

              Creates a new user from JSON.

              -
              - - - -
              -

              Implementation

              -
              User.fromJson(Map json) :
              -	dayNames = List<String>.from(safeJson(json, "dayNames")),
              -	schedule = {
              -		for (final String dayName in safeJson(json, "dayNames"))
              -			dayName: PeriodData.getList(json [dayName])
              -	},
              -	advisory = json ["advisory"] == null ? null : Advisory.fromJson(
              -		Map.from(safeJson(json, "advisory"))
              -	),
              -	contactInfo = ContactInfo.fromJson(
              -		Map.from(safeJson(json, "contactInfo"))
              -	),
              -	grade = json ["grade"] == null ? null : intToGrade [safeJson(json, "grade")],
              -	registeredClubs = List<String>.from(json ["registeredClubs"] ?? []);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/User.html b/docs/data/User/User.html deleted file mode 100644 index 109389ebc..000000000 --- a/docs/data/User/User.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - User constructor - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              User
              - -
              - -
              - - - - -
              -
              - -

              User constructor - Null safety -

              - -
              const - User(
              1. {required Map<String, List<PeriodData?>> schedule,
              2. -
              3. required ContactInfo contactInfo,
              4. -
              5. required List<String> registeredClubs,
              6. -
              7. required Iterable<String> dayNames,
              8. -
              9. Grade? grade,
              10. -
              11. Advisory? advisory}
              12. -
              ) -
              - - -
              -

              Creates a new user.

              -
              - - - -
              -

              Implementation

              -
              const User({
              -	required this.schedule,
              -	required this.contactInfo,
              -	required this.registeredClubs,
              -	required this.dayNames,
              -	this.grade,
              -	this.advisory,
              -});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/advisory.html b/docs/data/User/advisory.html deleted file mode 100644 index 1896982e6..000000000 --- a/docs/data/User/advisory.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - advisory property - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              advisory
              - -
              - -
              - - - - -
              -
              - -

              advisory property - Null safety -

              - -
              - Advisory? - advisory -
              final
              - -
              - -
              -

              The advisory for this user.

              -
              - - -
              -

              Implementation

              -
              final Advisory? advisory;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/contactInfo.html b/docs/data/User/contactInfo.html deleted file mode 100644 index 80217f02c..000000000 --- a/docs/data/User/contactInfo.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - contactInfo property - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              contactInfo
              - -
              - -
              - - - - -
              -
              - -

              contactInfo property - Null safety -

              - -
              - ContactInfo - contactInfo -
              final
              - -
              - -
              -

              This user's contact information.

              -
              - - -
              -

              Implementation

              -
              final ContactInfo contactInfo;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/dayNames.html b/docs/data/User/dayNames.html deleted file mode 100644 index 255307098..000000000 --- a/docs/data/User/dayNames.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - dayNames property - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              dayNames
              - -
              - -
              - - - - -
              -
              - -

              dayNames property - Null safety -

              - -
              - Iterable<String> - dayNames -
              final
              - -
              - -
              -

              The possible day names for this user's schedule.

              -

              These will be used as the keys for schedule.

              -
              - - -
              -

              Implementation

              -
              final Iterable<String> dayNames;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/getPeriods.html b/docs/data/User/getPeriods.html deleted file mode 100644 index a12875cf9..000000000 --- a/docs/data/User/getPeriods.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - getPeriods method - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getPeriods
              - -
              - -
              - - - - -
              -
              - -

              getPeriods method - Null safety -

              - -
              - - -List<Period> -getPeriods(
              1. Day day
              2. -
              ) - - - -
              - -
              -

              Computes the periods, in order, for a given day.

              -

              This method converts the PeriodDatas in schedule into Periods using -Day.schedule. PeriodData objects are specific to the user's schedule, -whereas the times of the day Ranges are specific to the calendar.

              -
              - - - -
              -

              Implementation

              -
              List<Period> getPeriods(Day day) => [
              -	for (final Period period in day.schedule.periods) period.copyWith(
              -		int.tryParse(period.name) == null ? null
              -			: schedule [day.name]! [int.parse(period.name) - 1]
              -	)
              -];
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/grade.html b/docs/data/User/grade.html deleted file mode 100644 index 787d17f9d..000000000 --- a/docs/data/User/grade.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - grade property - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              grade
              - -
              - -
              - - - - -
              -
              - -

              grade property - Null safety -

              - -
              - Grade? - grade -
              final
              - -
              - -
              -

              The grade this user is in.

              -

              This property is null for faculty.

              -
              - - -
              -

              Implementation

              -
              final Grade? grade;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/hashCode.html b/docs/data/User/hashCode.html deleted file mode 100644 index ff57058cc..000000000 --- a/docs/data/User/hashCode.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - hashCode property - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/noSuchMethod.html b/docs/data/User/noSuchMethod.html deleted file mode 100644 index b84ed60bd..000000000 --- a/docs/data/User/noSuchMethod.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - noSuchMethod method - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/operator_equals.html b/docs/data/User/operator_equals.html deleted file mode 100644 index 38807f1fe..000000000 --- a/docs/data/User/operator_equals.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - operator == method - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/registeredClubs.html b/docs/data/User/registeredClubs.html deleted file mode 100644 index 76622e36d..000000000 --- a/docs/data/User/registeredClubs.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - registeredClubs property - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              registeredClubs
              - -
              - -
              - - - - -
              -
              - -

              registeredClubs property - Null safety -

              - -
              - List<String> - registeredClubs -
              final
              - -
              - -
              -

              The IDs of the clubs this user attends.

              -

              TODO: decide if this is relevant for captains.

              -
              - - -
              -

              Implementation

              -
              final List<String> registeredClubs;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/runtimeType.html b/docs/data/User/runtimeType.html deleted file mode 100644 index edd921803..000000000 --- a/docs/data/User/runtimeType.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - runtimeType property - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/safeJson.html b/docs/data/User/safeJson.html deleted file mode 100644 index 33803a1e8..000000000 --- a/docs/data/User/safeJson.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - safeJson method - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              safeJson
              - -
              - -
              - - - - -
              -
              - -

              safeJson method - Null safety -

              - -
              - - -dynamic -safeJson(
              1. Map json,
              2. -
              3. String key
              4. -
              ) - - - -
              - -
              -

              Gets a value from JSON, throwing if null.

              -

              This function is needed since null checks don't run on dynamic values.

              -
              - - - -
              -

              Implementation

              -
              static dynamic safeJson(Map json, String key) {
              -	final dynamic value = json [key];
              -	if (value == null) {
              -		throw ArgumentError.notNull(key);
              -	} else {
              -		return value;
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/schedule.html b/docs/data/User/schedule.html deleted file mode 100644 index e511eb07e..000000000 --- a/docs/data/User/schedule.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - schedule property - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schedule
              - -
              - -
              - - - - -
              -
              - -

              schedule property - Null safety -

              - -
              - Map<String, List<PeriodData?>> - schedule -
              final
              - -
              - -
              -

              The user's schedule.

              -

              Each key is a different day, and the values are list of periods in that
              -day. Possible key values are defined by dayNames.

              -

              Periods may be null to indicate free periods (or, in the case of faculty, -periods where they don't teach).

              -
              - - -
              -

              Implementation

              -
              final Map<String, List<PeriodData?>> schedule;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/sectionIDs.html b/docs/data/User/sectionIDs.html deleted file mode 100644 index 13f3fa47b..000000000 --- a/docs/data/User/sectionIDs.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - sectionIDs property - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              sectionIDs
              - -
              - -
              - - - - -
              -
              - -

              sectionIDs property - Null safety -

              - - - -
              - -
              - Set<String> - sectionIDs - - -
              - - -
              -

              Gets the unique section IDs for the courses this user is enrolled in.

              -

              For teachers, these will be the courses they teach.

              -
              - - -
              -

              Implementation

              -
              Set<String> get sectionIDs => {
              -	for (final List<PeriodData?> daySchedule in schedule.values)
              -		for (final PeriodData? period in daySchedule)
              -			if (period != null)
              -				period.id
              -};
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/User/toString.html b/docs/data/User/toString.html deleted file mode 100644 index 6cf83c704..000000000 --- a/docs/data/User/toString.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - toString method - User class - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              -

              toString method - Null safety -

              - -
              - - -String -toString() - -
              inherited
              - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              external String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/activityTypeToString.html b/docs/data/activityTypeToString.html deleted file mode 100644 index 92f10a17c..000000000 --- a/docs/data/activityTypeToString.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - activityTypeToString function - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              activityTypeToString
              - -
              - -
              - - - - -
              -
              - -

              activityTypeToString function - Null safety - -

              - -
              - - -String -activityTypeToString(
              1. ActivityType type
              2. -
              ) - -
              - -
              -

              Maps ActivityType values to their string counterparts.

              -
              - - - -
              -

              Implementation

              -
              String activityTypeToString(ActivityType type) {
              -	switch (type) {
              -		case ActivityType.advisory: return "advisory";
              -		case ActivityType.room: return "room";
              -		case ActivityType.grade: return "grade";
              -		case ActivityType.misc: return "misc";
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/adminScopeToString.html b/docs/data/adminScopeToString.html deleted file mode 100644 index 2e62cdde4..000000000 --- a/docs/data/adminScopeToString.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - adminScopeToString function - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              adminScopeToString
              - -
              - -
              - - - - -
              -
              - -

              adminScopeToString function - Null safety - -

              - -
              - - -String -adminScopeToString(
              1. AdminScope scope
              2. -
              ) - -
              - -
              -

              Maps AdminScopes to Strings.

              -
              - - - -
              -

              Implementation

              -
              String adminScopeToString(AdminScope scope) {
              -	switch (scope) {
              -		case AdminScope.calendar: return "calendar";
              -		case AdminScope.schedule: return "schedule";
              -		case AdminScope.sports: return "sports";
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/data-library.html b/docs/data/data-library.html deleted file mode 100644 index 1a6848d0b..000000000 --- a/docs/data/data-library.html +++ /dev/null @@ -1,525 +0,0 @@ - - - - - - - - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              data
              - -
              - -
              - - - - -
              -
              - -

              data library - Null safety - -

              - - -
              -

              This library handles storing all the data in the app.

              -

              This library contains dataclasses to store and serialize data. -The dataclasses have logical properties and methods in order -to abstract business logic from the rest of the application.

              -

              In other words, any logic that separates this app from any -other app should be implemented in this library.

              -
              - - -
              -

              Classes

              - -
              -
              - Activity - -
              -
              - An activity during a period. [...] -
              - -
              - Advisory - -
              -
              - Bundles data relevant to advisory. [...] -
              - -
              - Club - -
              -
              - -
              - -
              - Day - -
              -
              - A day at Ramaz. [...] -
              - -
              - Feedback - -
              -
              - Feedback from the user. -
              - -
              - GradeActivity - -
              -
              - An activity for each grade. -
              - -
              - Message - -
              -
              - -
              - -
              - Period - -
              -
              - A representation of a period, including the time it takes place. [...] -
              - -
              - PeriodData - -
              -
              - A representation of a period, independent of the time. [...] -
              - -
              - PeriodReminderTime - -
              -
              - A ReminderTime that depends on a name and period. -
              - -
              - Range - -
              -
              - A range of times. -
              - -
              - Reminder - -
              -
              - A user-generated reminder. -
              - -
              - ReminderTime - -
              -
              - A time that a reminder should show. -
              - -
              - Schedule - -
              -
              - A description of the time allotment for a day. [...] -
              - -
              - Scores - -
              -
              - The scores for a SportsGame. [...] -
              - -
              - SportsGame - -
              -
              - A sports game. -
              - -
              - Subject - -
              -
              - A subject, or class, that a student can take. [...] -
              - -
              - SubjectReminderTime - -
              -
              - A ReminderTime that depends on a subject. -
              - -
              - Time - -
              -
              - The hour and minute representation of a time. [...] -
              - -
              - User - -
              -
              - Represents a user and all their data. [...] -
              - -
              -
              - - - -
              -

              Constants

              - -
              -
              - reminderTimeToString - → const Map<ReminderTimeType, String> - - -
              -
              - Used to convert ReminderTimeType to JSON. - - -
              - {ReminderTimeType.period : "period", ReminderTimeType.subject : "subject"} -
              -
              - -
              - stringToReminderTime - → const Map<String, ReminderTimeType> - - -
              -
              - Used to convert JSON to ReminderTimeType. - - -
              - {"period" : ReminderTimeType.period, "subject" : ReminderTimeType.subject} -
              -
              - -
              - stringToSport - → const Map<String, Sport> - - -
              -
              - Converts Strings to Sport values. [...] - - -
              - {"baseball" : Sport.baseball, "basketball" : Sport.basketball, "hockey" : Sport.hockey, "tennis" : Sport.tennis, "volleyball" : Sport.volleyball, &quo… -
              -
              - -
              -
              - -
              -

              Properties

              - -
              -
              - intToGrade - ↔ Map<int, Grade> - -
              -
              - Maps grade numbers to a Grade type. -
              read / write
              - -
              - -
              - sportToString - → Map<Sport, String> - -
              -
              - Converts Sport values to Strings. [...] -
              final
              - -
              - -
              -
              - -
              -

              Functions

              - -
              -
              - activityTypeToString(ActivityType type) - → String - - - -
              -
              - Maps ActivityType values to their string counterparts. - - -
              - -
              - adminScopeToString(AdminScope scope) - → String - - - -
              -
              - Maps AdminScopes to Strings. - - -
              - -
              - parseActivityType(String type) - ActivityType - - - -
              -
              - Maps JSON string values to ActivityTypes. - - -
              - -
              - parseAdminScope(String scope) - AdminScope - - - -
              -
              - Maps Strings to AdminScopes. - - -
              - -
              -
              - -
              -

              Enums

              - -
              -
              - ActivityType - -
              -
              - A type of activity during the day. -
              - -
              - AdminScope - -
              -
              - Scopes for administrative privileges. [...] -
              - -
              - Grade - -
              -
              - What grade the user is in. [...] -
              - -
              - ReminderTimeType - -
              -
              - An enum to decide when the reminder should appear. [...] -
              - -
              - Sport - -
              -
              - All the different sports that can be played. -
              - -
              -
              - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/intToGrade.html b/docs/data/intToGrade.html deleted file mode 100644 index 9ba11b070..000000000 --- a/docs/data/intToGrade.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - intToGrade property - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              intToGrade
              - -
              - -
              - - - - -
              -
              - -

              intToGrade top-level property - Null safety - -

              - -
              - Map<int, Grade> - intToGrade -
              read / write
              - -
              - -
              -

              Maps grade numbers to a Grade type.

              -
              - - -
              -

              Implementation

              -
              Map<int, Grade> intToGrade = {
              -	9: Grade.freshman,
              -	10: Grade.sophomore,
              -	11: Grade.junior,
              -	12: Grade.senior,
              -};
              -
              - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/parseActivityType.html b/docs/data/parseActivityType.html deleted file mode 100644 index bbd64224a..000000000 --- a/docs/data/parseActivityType.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - parseActivityType function - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              parseActivityType
              - -
              - -
              - - - - -
              -
              - -

              parseActivityType function - Null safety - -

              - -
              - - -ActivityType -parseActivityType(
              1. String type
              2. -
              ) - -
              - -
              -

              Maps JSON string values to ActivityTypes.

              -
              - - - -
              -

              Implementation

              -
              ActivityType parseActivityType(String type) {
              -	switch (type) {
              -		case "advisory": return ActivityType.advisory;
              -		case "room": return ActivityType.room;
              -		case "grade": return ActivityType.grade;
              -		case "misc": return ActivityType.misc;
              -		default: throw ArgumentError("Invalid activity type: $type");
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/parseAdminScope.html b/docs/data/parseAdminScope.html deleted file mode 100644 index 2c5df24aa..000000000 --- a/docs/data/parseAdminScope.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - parseAdminScope function - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              parseAdminScope
              - -
              - -
              - - - - -
              -
              - -

              parseAdminScope function - Null safety - -

              - -
              - - -AdminScope -parseAdminScope(
              1. String scope
              2. -
              ) - -
              - -
              -

              Maps Strings to AdminScopes.

              -
              - - - -
              -

              Implementation

              -
              AdminScope parseAdminScope(String scope) {
              -	switch (scope) {
              -		case "calendar": return AdminScope.calendar;
              -		case "schedule": return AdminScope.schedule;
              -		case "sports": return AdminScope.sports;
              -		default: throw ArgumentError("Invalid admin scope: $scope");
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/reminderTimeToString-constant.html b/docs/data/reminderTimeToString-constant.html deleted file mode 100644 index 20e3e4c3a..000000000 --- a/docs/data/reminderTimeToString-constant.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - reminderTimeToString constant - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              reminderTimeToString
              - -
              - -
              - - - - -
              -
              - -

              reminderTimeToString top-level constant - Null safety - -

              - -
              - Map<ReminderTimeType, String> - const reminderTimeToString - - -
              - -
              -

              Used to convert ReminderTimeType to JSON.

              -
              - - -
              -

              Implementation

              -
              const Map<ReminderTimeType, String> reminderTimeToString = {
              -	ReminderTimeType.period: "period",
              -	ReminderTimeType.subject: "subject",
              -};
              -
              - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/sportToString.html b/docs/data/sportToString.html deleted file mode 100644 index 867498c9f..000000000 --- a/docs/data/sportToString.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - sportToString property - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              sportToString
              - -
              - -
              - - - - -
              -
              - -

              sportToString top-level property - Null safety - -

              - -
              - Map<Sport, String> - sportToString -
              final
              - -
              - -
              -

              Converts Sport values to Strings.

              -

              Use this to convert to JSON, since they can only use Strings.

              -
              - - -
              -

              Implementation

              -
              final Map<Sport, String> sportToString = Map.fromEntries(
              -	stringToSport.entries.map(
              -		(MapEntry<String, Sport> entry) => MapEntry(entry.value, entry.key)
              -	)
              -);
              -
              - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/stringToReminderTime-constant.html b/docs/data/stringToReminderTime-constant.html deleted file mode 100644 index 891d04910..000000000 --- a/docs/data/stringToReminderTime-constant.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - stringToReminderTime constant - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              stringToReminderTime
              - -
              - -
              - - - - -
              -
              - -

              stringToReminderTime top-level constant - Null safety - -

              - -
              - Map<String, ReminderTimeType> - const stringToReminderTime - - -
              - -
              -

              Used to convert JSON to ReminderTimeType.

              -
              - - -
              -

              Implementation

              -
              const Map<String, ReminderTimeType> stringToReminderTime = {
              -	"period": ReminderTimeType.period,
              -	"subject": ReminderTimeType.subject,
              -};
              -
              - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/data/stringToSport-constant.html b/docs/data/stringToSport-constant.html deleted file mode 100644 index 842dc8b0a..000000000 --- a/docs/data/stringToSport-constant.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - stringToSport constant - data library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              stringToSport
              - -
              - -
              - - - - -
              -
              - -

              stringToSport top-level constant - Null safety - -

              - -
              - Map<String, Sport> - const stringToSport - - -
              - -
              -

              Converts Strings to Sport values.

              -

              Use this on JSON values, since they can only use Strings.

              -
              - - -
              -

              Implementation

              -
              const Map<String, Sport> stringToSport = {
              -	"baseball": Sport.baseball,
              -	"basketball": Sport.basketball,
              -	"hockey": Sport.hockey,
              -	"tennis": Sport.tennis,
              -	"volleyball": Sport.volleyball,
              -	"soccer": Sport.soccer,
              -};
              -
              - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/generated_plugin_registrant/generated_plugin_registrant-library.html b/docs/generated_plugin_registrant/generated_plugin_registrant-library.html deleted file mode 100644 index ef9fee752..000000000 --- a/docs/generated_plugin_registrant/generated_plugin_registrant-library.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - generated_plugin_registrant library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              generated_plugin_registrant
              - -
              - -
              - - - - -
              -
              - -

              generated_plugin_registrant library - Null safety - -

              - - - - - - - - - -
              -

              Functions

              - -
              -
              - registerPlugins(Registrar registrar) - → void - - - -
              -
              - - - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/generated_plugin_registrant/registerPlugins.html b/docs/generated_plugin_registrant/registerPlugins.html deleted file mode 100644 index 984067196..000000000 --- a/docs/generated_plugin_registrant/registerPlugins.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - registerPlugins function - generated_plugin_registrant library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              registerPlugins
              - -
              - -
              - - - - -
              -
              - -

              registerPlugins function - Null safety - -

              - -
              - - -void -registerPlugins(
              1. Registrar registrar
              2. -
              ) - -
              - - - - -
              -

              Implementation

              -
              void registerPlugins(Registrar registrar) {
              -  FirebaseFirestoreWeb.registerWith(registrar);
              -  FirebaseAuthWeb.registerWith(registrar);
              -  FirebaseCoreWeb.registerWith(registrar);
              -  FirebaseMessagingWeb.registerWith(registrar);
              -  GoogleSignInPlugin.registerWith(registrar);
              -  SharedPreferencesPlugin.registerWith(registrar);
              -  UrlLauncherPlugin.registerWith(registrar);
              -  registrar.registerMessageHandler();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index bbf6408ae..000000000 --- a/docs/index.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - - ramaz - Dart API docs - - - - - - - - - - - - - - - - -
              - -
              - - -
              ramaz
              - -
              - -
              - - - - -
              - -
              -

              Ramaz Student Life

              -

              This is an app to help Ramaz students navigate their student life. -It tells you what classes you have when, the latest sports news, lost and found information, and more.

              -

              Complete list of features:

              -
                -
              • -

                Ramaz login

                You can login with your Ramaz email to get your schedule sent directly to the app!
              • -
              • -

                Schedule explorer

                A complete schedule built-in to your phone. It can tell you what you have now, later, or you can specify a letter and schedule (eg, Rosh Chodesh) to explore your schedule.
              • -
              • -

                Notes

                You can now schedule reminders for individual classes or periods, such as every B-4 or a reminder to bring your textbook to history class.
              • -
              -

              Your feedback is appreciated

              -

              We want to hear what you have to say, so please use the "Send Feedback" button in the app to tell us what you do -- or don't -- like, and we'll work on it.

              -

              Contributing

              -

              This repo is to be modified only by the Ramaz Coding Club. It follows a simple yet sophisticated structure, in addition to the standard Flutter folders. Here is a rundown of everything you need to know:

              -
                -
              • -

                The android folder:

                -

                This folder contains Android-specific implementation details. The only notable files in it are the gradle configurations: gradle.properties, build.gradle, and app\build.gradle (which have been changed to configured Firebase). An adjustment was made to gradle\wrapper\gradle-wrapper.properties to upgrade to the latest version of Gradle. Android-specific assets are stored under app\src\main\res, and modifications have been made to AndroidManifest.xml accordingly.

                -
              • -
              • -

                The data folder:

                -

                This folder is not meant to be public. It is basically a collection of .csv versions of the Ramaz database. The naming convention here is simple: make everything lowercase, remove RG_, and make abbreviations into the full word. For example, RG_SECT_SCHED should be saved as data\section_schedule.csv. This is essential for the data processing (in the firebase folder) to work. Also included is the calendar.csv file needed for calendar parsing.

                -
              • -
              • -

                The doc folder:

                -

                OK, so this folder is also absent from GitHub. But it's super simple to generate. Just run dartdoc in this repo and the full documentation will be saved here.

                -
              • -
              • -

                The firebase folder:

                -

                This folder contains scripts whose sole purpose is to configure Google Firebase. This basically means configuring the database and authentication services based on data from the Ramaz database. It contains two more folders, data and database whose jobs are to handle data modeling and database configuration, respectively. Another notable file here is auth.py, which manages the FirebaseAuth API.

                -
              • -
              • -

                The images folder:

                -

                This folder contains image assets for the project. They are imported in the pubspec.yaml file. There are two child folders:

                -
                  -
                • -

                  The icons folder:

                  -

                  This folder contains basic icons used throughout the app

                  -
                • -
                • -

                  The logos folder:

                  -

                  This folder contains logos used for various services throughout the app. Note that despite the use of this iconography, excluding Ramaz, we do not claim any ownership whatsoever of these brands. The ramaz folder contains Ramaz-specific branding.

                  -
                • -
                -
              • -
              • -

                The ios folder:

                -

                This folder contains iOS-specific modifications, including Firebase configuration and asset bundling.

                -
              • -
              • -

                The lib folder:

                -

                This is, where the main Dart code lies. This will be discussed in detail next section.

                -
              • -
              - -

              Inside lib\, there are five libraries, each of which define a different part of the structure of the app. Each library two sections -- a folder under lib\src, containing all the code, and a file under lib\, which declares the library (sort of like a header file).

              -
                -
              • -

                The data library:

                -

                This library contains data models for everything in the app, separated into files by topic. Here, all the business logic is implemented either as complex factories or methods.

                -
              • -
              • -

                The services library:

                -

                This library contains abstractions over many different APIs (data sources), separated into files by API.

                -
              • -
              • -

                The services_collection library:

                -

                This library contains logic for initializing the services. It can act as a wrapper around all the services, so function and constructor signatures can remain the same even after services are added or removed.

                -
              • -
              • -

                The models library:

                -

                This library contains two types of models:

                -
                  -
                1. Data models. Data models control the state of the data across the lifespan of the app. The user profile is a good example of a data model, since it needs to be accessible to all code.
                2. -
                3. View models. view models control the state of data in an element of UI, such as a page. View models can interact with data models to get their data, and should generally have a field for every label, and a method for every input action in the UI.
                4. -
                -
              • -
              • -

                The widgets library:

                -

                This folder contains UI elements ("widgets") that are independent enough from the rest of the screen to be able to be imported and used reliably anywhere in the app (even if they in reality aren't). There are a few categories of widgets:

                -
                  -
                1. Ambient widgets are widgets that are exposed to the whole app (usually via InheritedWidgets).
                2. -
                3. Atomic widgets are widgets that represent individual pieces of data. They should be used throughout the app exclusively to represent those data types.
                4. -
                5. Generic widgets are miscellaneous widgets that help compose the UI.
                6. -
                7. Other helper widgets to display images and iconography throughout the UI.
                8. -
                -
              • -
              • -

                The pages library:

                -

                This library contains all the screens of the app, separated into files. These files may import data templates (from data), APIs (from services), page states (from models), or other UI elements (from widgets).

                -
              • -
              -

              Running the app:

              -

              To run the app, make sure you have Flutter installed, and run these commands: -

              		git clone https://github.com/Levi-Lesches/Ramaz-Student-Life.git
              -		cd ramaz
              -	

              -

              To be able to run and debug the app, run flutter run. To simply download it, run flutter build apk or flutter build ios, plug in your phone and run flutter install.

              -
              - - -
              -

              Libraries

              -
              -
              - app - -
              -
              -
              - -
              - constants - -
              -
              -
              - -
              - data - -
              -
              This library handles storing all the data in the app. [...] -
              - -
              - generated_plugin_registrant - -
              -
              -
              - -
              - main - -
              -
              -
              - -
              - models - -
              -
              An abstraction over data handling. [...] -
              - -
              - pages - -
              -
              -
              - -
              - ramaz_services - -
              -
              An abstraction over device services and data sources. [...] -
              - -
              - widgets - -
              -
              A collection of widgets to use. [...] -
              - -
              -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/index.json b/docs/index.json deleted file mode 100644 index 3aad33884..000000000 --- a/docs/index.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"app","qualifiedName":"app","href":"app/app-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"RamLife","qualifiedName":"app.RamLife","href":"app/RamLife-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"app","type":"library"}},{"name":"RamLife","qualifiedName":"app.RamLife.RamLife","href":"app/RamLife/RamLife.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamLife","type":"class"}},{"name":"build","qualifiedName":"app.RamLife.build","href":"app/RamLife/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"RamLife","type":"class"}},{"name":"hasAdminScope","qualifiedName":"app.RamLife.hasAdminScope","href":"app/RamLife/hasAdminScope.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamLife","type":"class"}},{"name":"routes","qualifiedName":"app.RamLife.routes","href":"app/RamLife/routes.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamLife","type":"class"}},{"name":"constants","qualifiedName":"constants","href":"constants/constants-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"DayComparison","qualifiedName":"constants.DayComparison","href":"constants/DayComparison.html","type":"extension","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"isSameDay","qualifiedName":"constants.DayComparison.isSameDay","href":"constants/DayComparison/isSameDay.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayComparison","type":"extension"}},{"name":"RamazColors","qualifiedName":"constants.RamazColors","href":"constants/RamazColors-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"operator ==","qualifiedName":"constants.RamazColors.==","href":"constants/RamazColors/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"RamazColors","qualifiedName":"constants.RamazColors.RamazColors","href":"constants/RamazColors/RamazColors.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"blue","qualifiedName":"constants.RamazColors.blue","href":"constants/RamazColors/blue-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"blueDark","qualifiedName":"constants.RamazColors.blueDark","href":"constants/RamazColors/blueDark-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"blueLight","qualifiedName":"constants.RamazColors.blueLight","href":"constants/RamazColors/blueLight-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"gold","qualifiedName":"constants.RamazColors.gold","href":"constants/RamazColors/gold-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"goldDark","qualifiedName":"constants.RamazColors.goldDark","href":"constants/RamazColors/goldDark-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"goldLight","qualifiedName":"constants.RamazColors.goldLight","href":"constants/RamazColors/goldLight-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"hashCode","qualifiedName":"constants.RamazColors.hashCode","href":"constants/RamazColors/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"noSuchMethod","qualifiedName":"constants.RamazColors.noSuchMethod","href":"constants/RamazColors/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"runtimeType","qualifiedName":"constants.RamazColors.runtimeType","href":"constants/RamazColors/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"toString","qualifiedName":"constants.RamazColors.toString","href":"constants/RamazColors/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazColors","type":"class"}},{"name":"TimeConverter","qualifiedName":"constants.TimeConverter","href":"constants/TimeConverter.html","type":"extension","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"asTime","qualifiedName":"constants.TimeConverter.asTime","href":"constants/TimeConverter/asTime.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"TimeConverter","type":"extension"}},{"name":"TimeOfDayConverter","qualifiedName":"constants.TimeOfDayConverter","href":"constants/TimeOfDayConverter.html","type":"extension","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"asTimeOfDay","qualifiedName":"constants.TimeOfDayConverter.asTimeOfDay","href":"constants/TimeOfDayConverter/asTimeOfDay.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"TimeOfDayConverter","type":"extension"}},{"name":"Times","qualifiedName":"constants.Times","href":"constants/Times-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"operator ==","qualifiedName":"constants.Times.==","href":"constants/Times/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"Times","qualifiedName":"constants.Times.Times","href":"constants/Times/Times.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"hashCode","qualifiedName":"constants.Times.hashCode","href":"constants/Times/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"noSuchMethod","qualifiedName":"constants.Times.noSuchMethod","href":"constants/Times/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"runtimeType","qualifiedName":"constants.Times.runtimeType","href":"constants/Times/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"schoolEnd","qualifiedName":"constants.Times.schoolEnd","href":"constants/Times/schoolEnd-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"schoolStart","qualifiedName":"constants.Times.schoolStart","href":"constants/Times/schoolStart-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"toString","qualifiedName":"constants.Times.toString","href":"constants/Times/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"winterFridayDayEnd","qualifiedName":"constants.Times.winterFridayDayEnd","href":"constants/Times/winterFridayDayEnd-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"winterFridayDayStart","qualifiedName":"constants.Times.winterFridayDayStart","href":"constants/Times/winterFridayDayStart-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"winterFridayMonthEnd","qualifiedName":"constants.Times.winterFridayMonthEnd","href":"constants/Times/winterFridayMonthEnd-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"winterFridayMonthStart","qualifiedName":"constants.Times.winterFridayMonthStart","href":"constants/Times/winterFridayMonthStart-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Times","type":"class"}},{"name":"Urls","qualifiedName":"constants.Urls","href":"constants/Urls-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"constants","type":"library"}},{"name":"operator ==","qualifiedName":"constants.Urls.==","href":"constants/Urls/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"Urls","qualifiedName":"constants.Urls.Urls","href":"constants/Urls/Urls.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"email","qualifiedName":"constants.Urls.email","href":"constants/Urls/email-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"googleDrive","qualifiedName":"constants.Urls.googleDrive","href":"constants/Urls/googleDrive-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"hashCode","qualifiedName":"constants.Urls.hashCode","href":"constants/Urls/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"noSuchMethod","qualifiedName":"constants.Urls.noSuchMethod","href":"constants/Urls/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"ramaz","qualifiedName":"constants.Urls.ramaz","href":"constants/Urls/ramaz-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"runtimeType","qualifiedName":"constants.Urls.runtimeType","href":"constants/Urls/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"schoology","qualifiedName":"constants.Urls.schoology","href":"constants/Urls/schoology-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"seniorSystems","qualifiedName":"constants.Urls.seniorSystems","href":"constants/Urls/seniorSystems-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"sportsLivestream","qualifiedName":"constants.Urls.sportsLivestream","href":"constants/Urls/sportsLivestream-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"toString","qualifiedName":"constants.Urls.toString","href":"constants/Urls/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Urls","type":"class"}},{"name":"data","qualifiedName":"data","href":"data/data-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"Activity","qualifiedName":"data.Activity","href":"data/Activity-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Activity.==","href":"data/Activity/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"Activity","qualifiedName":"data.Activity.Activity","href":"data/Activity/Activity.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"Activity.fromJson","qualifiedName":"data.Activity.fromJson","href":"data/Activity/Activity.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"getActivities","qualifiedName":"data.Activity.getActivities","href":"data/Activity/getActivities.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"Activity.grade","qualifiedName":"data.Activity.grade","href":"data/Activity/Activity.grade.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"hashCode","qualifiedName":"data.Activity.hashCode","href":"data/Activity/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"message","qualifiedName":"data.Activity.message","href":"data/Activity/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Activity.noSuchMethod","href":"data/Activity/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Activity.runtimeType","href":"data/Activity/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"toJson","qualifiedName":"data.Activity.toJson","href":"data/Activity/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"toString","qualifiedName":"data.Activity.toString","href":"data/Activity/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"type","qualifiedName":"data.Activity.type","href":"data/Activity/type.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Activity","type":"class"}},{"name":"ActivityType","qualifiedName":"data.ActivityType","href":"data/ActivityType-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.ActivityType.==","href":"data/ActivityType/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityType","type":"enum"}},{"name":"hashCode","qualifiedName":"data.ActivityType.hashCode","href":"data/ActivityType/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityType","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"data.ActivityType.noSuchMethod","href":"data/ActivityType/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityType","type":"enum"}},{"name":"runtimeType","qualifiedName":"data.ActivityType.runtimeType","href":"data/ActivityType/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityType","type":"enum"}},{"name":"toString","qualifiedName":"data.ActivityType.toString","href":"data/ActivityType/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ActivityType","type":"enum"}},{"name":"AdminScope","qualifiedName":"data.AdminScope","href":"data/AdminScope-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.AdminScope.==","href":"data/AdminScope/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScope","type":"enum"}},{"name":"hashCode","qualifiedName":"data.AdminScope.hashCode","href":"data/AdminScope/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScope","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"data.AdminScope.noSuchMethod","href":"data/AdminScope/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScope","type":"enum"}},{"name":"runtimeType","qualifiedName":"data.AdminScope.runtimeType","href":"data/AdminScope/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScope","type":"enum"}},{"name":"toString","qualifiedName":"data.AdminScope.toString","href":"data/AdminScope/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminScope","type":"enum"}},{"name":"Advisory","qualifiedName":"data.Advisory","href":"data/Advisory-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Advisory.==","href":"data/Advisory/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"Advisory","qualifiedName":"data.Advisory.Advisory","href":"data/Advisory/Advisory.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"Advisory.fromJson","qualifiedName":"data.Advisory.fromJson","href":"data/Advisory/Advisory.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"hashCode","qualifiedName":"data.Advisory.hashCode","href":"data/Advisory/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"id","qualifiedName":"data.Advisory.id","href":"data/Advisory/id.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Advisory.noSuchMethod","href":"data/Advisory/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"room","qualifiedName":"data.Advisory.room","href":"data/Advisory/room.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Advisory.runtimeType","href":"data/Advisory/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"toString","qualifiedName":"data.Advisory.toString","href":"data/Advisory/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Advisory","type":"class"}},{"name":"Club","qualifiedName":"data.Club","href":"data/Club-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Club.==","href":"data/Club/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"Club","qualifiedName":"data.Club.Club","href":"data/Club/Club.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"attendance","qualifiedName":"data.Club.attendance","href":"data/Club/attendance.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"captains","qualifiedName":"data.Club.captains","href":"data/Club/captains.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"description","qualifiedName":"data.Club.description","href":"data/Club/description.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"facultyAdvisor","qualifiedName":"data.Club.facultyAdvisor","href":"data/Club/facultyAdvisor.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"formUrl","qualifiedName":"data.Club.formUrl","href":"data/Club/formUrl.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"hashCode","qualifiedName":"data.Club.hashCode","href":"data/Club/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"image","qualifiedName":"data.Club.image","href":"data/Club/image.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"members","qualifiedName":"data.Club.members","href":"data/Club/members.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"messages","qualifiedName":"data.Club.messages","href":"data/Club/messages.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"name","qualifiedName":"data.Club.name","href":"data/Club/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Club.noSuchMethod","href":"data/Club/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"phoneNumberRequested","qualifiedName":"data.Club.phoneNumberRequested","href":"data/Club/phoneNumberRequested.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Club.runtimeType","href":"data/Club/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"shortDescription","qualifiedName":"data.Club.shortDescription","href":"data/Club/shortDescription.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"toString","qualifiedName":"data.Club.toString","href":"data/Club/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Club","type":"class"}},{"name":"Day","qualifiedName":"data.Day","href":"data/Day-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Day.==","href":"data/Day/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"Day","qualifiedName":"data.Day.Day","href":"data/Day/Day.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"displayName","qualifiedName":"data.Day.displayName","href":"data/Day/displayName.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"Day.fromJson","qualifiedName":"data.Day.fromJson","href":"data/Day/Day.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"getCalendar","qualifiedName":"data.Day.getCalendar","href":"data/Day/getCalendar.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"getCurrentPeriod","qualifiedName":"data.Day.getCurrentPeriod","href":"data/Day/getCurrentPeriod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"getDate","qualifiedName":"data.Day.getDate","href":"data/Day/getDate.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"hashCode","qualifiedName":"data.Day.hashCode","href":"data/Day/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"n","qualifiedName":"data.Day.n","href":"data/Day/n.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"name","qualifiedName":"data.Day.name","href":"data/Day/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Day.noSuchMethod","href":"data/Day/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Day.runtimeType","href":"data/Day/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"schedule","qualifiedName":"data.Day.schedule","href":"data/Day/schedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"toJson","qualifiedName":"data.Day.toJson","href":"data/Day/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"toString","qualifiedName":"data.Day.toString","href":"data/Day/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Day","type":"class"}},{"name":"Feedback","qualifiedName":"data.Feedback","href":"data/Feedback-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Feedback.==","href":"data/Feedback/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"Feedback","qualifiedName":"data.Feedback.Feedback","href":"data/Feedback/Feedback.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"anonymous","qualifiedName":"data.Feedback.anonymous","href":"data/Feedback/anonymous.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"email","qualifiedName":"data.Feedback.email","href":"data/Feedback/email.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"hashCode","qualifiedName":"data.Feedback.hashCode","href":"data/Feedback/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"message","qualifiedName":"data.Feedback.message","href":"data/Feedback/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"name","qualifiedName":"data.Feedback.name","href":"data/Feedback/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Feedback.noSuchMethod","href":"data/Feedback/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Feedback.runtimeType","href":"data/Feedback/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"timestamp","qualifiedName":"data.Feedback.timestamp","href":"data/Feedback/timestamp.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"toJson","qualifiedName":"data.Feedback.toJson","href":"data/Feedback/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"toString","qualifiedName":"data.Feedback.toString","href":"data/Feedback/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Feedback","type":"class"}},{"name":"Grade","qualifiedName":"data.Grade","href":"data/Grade-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Grade.==","href":"data/Grade/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Grade","type":"enum"}},{"name":"hashCode","qualifiedName":"data.Grade.hashCode","href":"data/Grade/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Grade","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"data.Grade.noSuchMethod","href":"data/Grade/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Grade","type":"enum"}},{"name":"runtimeType","qualifiedName":"data.Grade.runtimeType","href":"data/Grade/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Grade","type":"enum"}},{"name":"toString","qualifiedName":"data.Grade.toString","href":"data/Grade/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Grade","type":"enum"}},{"name":"GradeActivity","qualifiedName":"data.GradeActivity","href":"data/GradeActivity-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.GradeActivity.==","href":"data/GradeActivity/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"GradeActivity","qualifiedName":"data.GradeActivity.GradeActivity","href":"data/GradeActivity/GradeActivity.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"freshmen","qualifiedName":"data.GradeActivity.freshmen","href":"data/GradeActivity/freshmen.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"GradeActivity.fromJson","qualifiedName":"data.GradeActivity.fromJson","href":"data/GradeActivity/GradeActivity.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"hashCode","qualifiedName":"data.GradeActivity.hashCode","href":"data/GradeActivity/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"juniors","qualifiedName":"data.GradeActivity.juniors","href":"data/GradeActivity/juniors.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.GradeActivity.noSuchMethod","href":"data/GradeActivity/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"runtimeType","qualifiedName":"data.GradeActivity.runtimeType","href":"data/GradeActivity/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"seniors","qualifiedName":"data.GradeActivity.seniors","href":"data/GradeActivity/seniors.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"sophomores","qualifiedName":"data.GradeActivity.sophomores","href":"data/GradeActivity/sophomores.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"toString","qualifiedName":"data.GradeActivity.toString","href":"data/GradeActivity/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"GradeActivity","type":"class"}},{"name":"Message","qualifiedName":"data.Message","href":"data/Message-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Message.==","href":"data/Message/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"Message","qualifiedName":"data.Message.Message","href":"data/Message/Message.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"body","qualifiedName":"data.Message.body","href":"data/Message/body.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"hashCode","qualifiedName":"data.Message.hashCode","href":"data/Message/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Message.noSuchMethod","href":"data/Message/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Message.runtimeType","href":"data/Message/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"sender","qualifiedName":"data.Message.sender","href":"data/Message/sender.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"timestamp","qualifiedName":"data.Message.timestamp","href":"data/Message/timestamp.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"toString","qualifiedName":"data.Message.toString","href":"data/Message/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Message","type":"class"}},{"name":"Period","qualifiedName":"data.Period","href":"data/Period-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Period.==","href":"data/Period/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"Period","qualifiedName":"data.Period.Period","href":"data/Period/Period.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"activity","qualifiedName":"data.Period.activity","href":"data/Period/activity.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"copyWith","qualifiedName":"data.Period.copyWith","href":"data/Period/copyWith.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"data","qualifiedName":"data.Period.data","href":"data/Period/data.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"Period.fromJson","qualifiedName":"data.Period.fromJson","href":"data/Period/Period.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"getInfo","qualifiedName":"data.Period.getInfo","href":"data/Period/getInfo.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"getName","qualifiedName":"data.Period.getName","href":"data/Period/getName.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"hashCode","qualifiedName":"data.Period.hashCode","href":"data/Period/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"id","qualifiedName":"data.Period.id","href":"data/Period/id.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"isFree","qualifiedName":"data.Period.isFree","href":"data/Period/isFree.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"name","qualifiedName":"data.Period.name","href":"data/Period/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Period.noSuchMethod","href":"data/Period/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"Period.raw","qualifiedName":"data.Period.raw","href":"data/Period/Period.raw.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Period.runtimeType","href":"data/Period/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"time","qualifiedName":"data.Period.time","href":"data/Period/time.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"toJson","qualifiedName":"data.Period.toJson","href":"data/Period/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"toString","qualifiedName":"data.Period.toString","href":"data/Period/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Period","type":"class"}},{"name":"PeriodData","qualifiedName":"data.PeriodData","href":"data/PeriodData-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.PeriodData.==","href":"data/PeriodData/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"PeriodData","qualifiedName":"data.PeriodData.PeriodData","href":"data/PeriodData/PeriodData.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"PeriodData.fromJson","qualifiedName":"data.PeriodData.fromJson","href":"data/PeriodData/PeriodData.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"getList","qualifiedName":"data.PeriodData.getList","href":"data/PeriodData/getList.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"hashCode","qualifiedName":"data.PeriodData.hashCode","href":"data/PeriodData/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"id","qualifiedName":"data.PeriodData.id","href":"data/PeriodData/id.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.PeriodData.noSuchMethod","href":"data/PeriodData/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"room","qualifiedName":"data.PeriodData.room","href":"data/PeriodData/room.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"runtimeType","qualifiedName":"data.PeriodData.runtimeType","href":"data/PeriodData/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"toString","qualifiedName":"data.PeriodData.toString","href":"data/PeriodData/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"PeriodData","type":"class"}},{"name":"PeriodReminderTime","qualifiedName":"data.PeriodReminderTime","href":"data/PeriodReminderTime-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"PeriodReminderTime","qualifiedName":"data.PeriodReminderTime.PeriodReminderTime","href":"data/PeriodReminderTime/PeriodReminderTime.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"dayName","qualifiedName":"data.PeriodReminderTime.dayName","href":"data/PeriodReminderTime/dayName.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"doesApply","qualifiedName":"data.PeriodReminderTime.doesApply","href":"data/PeriodReminderTime/doesApply.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"PeriodReminderTime.fromJson","qualifiedName":"data.PeriodReminderTime.fromJson","href":"data/PeriodReminderTime/PeriodReminderTime.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"hash","qualifiedName":"data.PeriodReminderTime.hash","href":"data/PeriodReminderTime/hash.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"period","qualifiedName":"data.PeriodReminderTime.period","href":"data/PeriodReminderTime/period.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"toJson","qualifiedName":"data.PeriodReminderTime.toJson","href":"data/PeriodReminderTime/toJson.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"toString","qualifiedName":"data.PeriodReminderTime.toString","href":"data/PeriodReminderTime/toString.html","type":"method","overriddenDepth":2,"packageName":"ramaz","enclosedBy":{"name":"PeriodReminderTime","type":"class"}},{"name":"Range","qualifiedName":"data.Range","href":"data/Range-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator <","qualifiedName":"data.Range.<","href":"data/Range/operator_less.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"operator ==","qualifiedName":"data.Range.==","href":"data/Range/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"operator >","qualifiedName":"data.Range.>","href":"data/Range/operator_greater.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"Range","qualifiedName":"data.Range.Range","href":"data/Range/Range.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"contains","qualifiedName":"data.Range.contains","href":"data/Range/contains.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"end","qualifiedName":"data.Range.end","href":"data/Range/end.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"Range.fromJson","qualifiedName":"data.Range.fromJson","href":"data/Range/Range.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"hashCode","qualifiedName":"data.Range.hashCode","href":"data/Range/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Range.noSuchMethod","href":"data/Range/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"Range.nums","qualifiedName":"data.Range.nums","href":"data/Range/Range.nums.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Range.runtimeType","href":"data/Range/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"start","qualifiedName":"data.Range.start","href":"data/Range/start.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"toJson","qualifiedName":"data.Range.toJson","href":"data/Range/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"toString","qualifiedName":"data.Range.toString","href":"data/Range/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Range","type":"class"}},{"name":"Reminder","qualifiedName":"data.Reminder","href":"data/Reminder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Reminder.==","href":"data/Reminder/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"Reminder","qualifiedName":"data.Reminder.Reminder","href":"data/Reminder/Reminder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"Reminder.fromJson","qualifiedName":"data.Reminder.fromJson","href":"data/Reminder/Reminder.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"fromList","qualifiedName":"data.Reminder.fromList","href":"data/Reminder/fromList.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"getReminders","qualifiedName":"data.Reminder.getReminders","href":"data/Reminder/getReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"hash","qualifiedName":"data.Reminder.hash","href":"data/Reminder/hash.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"hashCode","qualifiedName":"data.Reminder.hashCode","href":"data/Reminder/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"message","qualifiedName":"data.Reminder.message","href":"data/Reminder/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Reminder.noSuchMethod","href":"data/Reminder/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Reminder.runtimeType","href":"data/Reminder/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"time","qualifiedName":"data.Reminder.time","href":"data/Reminder/time.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"toJson","qualifiedName":"data.Reminder.toJson","href":"data/Reminder/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"toString","qualifiedName":"data.Reminder.toString","href":"data/Reminder/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Reminder","type":"class"}},{"name":"ReminderTime","qualifiedName":"data.ReminderTime","href":"data/ReminderTime-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.ReminderTime.==","href":"data/ReminderTime/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"ReminderTime","qualifiedName":"data.ReminderTime.ReminderTime","href":"data/ReminderTime/ReminderTime.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"doesApply","qualifiedName":"data.ReminderTime.doesApply","href":"data/ReminderTime/doesApply.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"ReminderTime.fromJson","qualifiedName":"data.ReminderTime.fromJson","href":"data/ReminderTime/ReminderTime.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"ReminderTime.fromType","qualifiedName":"data.ReminderTime.fromType","href":"data/ReminderTime/ReminderTime.fromType.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"hash","qualifiedName":"data.ReminderTime.hash","href":"data/ReminderTime/hash.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"hashCode","qualifiedName":"data.ReminderTime.hashCode","href":"data/ReminderTime/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.ReminderTime.noSuchMethod","href":"data/ReminderTime/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"repeats","qualifiedName":"data.ReminderTime.repeats","href":"data/ReminderTime/repeats.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"runtimeType","qualifiedName":"data.ReminderTime.runtimeType","href":"data/ReminderTime/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"toJson","qualifiedName":"data.ReminderTime.toJson","href":"data/ReminderTime/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"toString","qualifiedName":"data.ReminderTime.toString","href":"data/ReminderTime/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"type","qualifiedName":"data.ReminderTime.type","href":"data/ReminderTime/type.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTime","type":"class"}},{"name":"ReminderTimeType","qualifiedName":"data.ReminderTimeType","href":"data/ReminderTimeType-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.ReminderTimeType.==","href":"data/ReminderTimeType/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTimeType","type":"enum"}},{"name":"hashCode","qualifiedName":"data.ReminderTimeType.hashCode","href":"data/ReminderTimeType/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTimeType","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"data.ReminderTimeType.noSuchMethod","href":"data/ReminderTimeType/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTimeType","type":"enum"}},{"name":"runtimeType","qualifiedName":"data.ReminderTimeType.runtimeType","href":"data/ReminderTimeType/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTimeType","type":"enum"}},{"name":"toString","qualifiedName":"data.ReminderTimeType.toString","href":"data/ReminderTimeType/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderTimeType","type":"enum"}},{"name":"Schedule","qualifiedName":"data.Schedule","href":"data/Schedule-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Schedule.==","href":"data/Schedule/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"Schedule","qualifiedName":"data.Schedule.Schedule","href":"data/Schedule/Schedule.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"amAssembly","qualifiedName":"data.Schedule.amAssembly","href":"data/Schedule/amAssembly-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"covid","qualifiedName":"data.Schedule.covid","href":"data/Schedule/covid-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"early","qualifiedName":"data.Schedule.early","href":"data/Schedule/early-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"fastDay","qualifiedName":"data.Schedule.fastDay","href":"data/Schedule/fastDay-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"friday","qualifiedName":"data.Schedule.friday","href":"data/Schedule/friday-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"fridayRoshChodesh","qualifiedName":"data.Schedule.fridayRoshChodesh","href":"data/Schedule/fridayRoshChodesh-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"Schedule.fromJson","qualifiedName":"data.Schedule.fromJson","href":"data/Schedule/Schedule.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"getWinterFriday","qualifiedName":"data.Schedule.getWinterFriday","href":"data/Schedule/getWinterFriday.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"hashCode","qualifiedName":"data.Schedule.hashCode","href":"data/Schedule/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"name","qualifiedName":"data.Schedule.name","href":"data/Schedule/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Schedule.noSuchMethod","href":"data/Schedule/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"periods","qualifiedName":"data.Schedule.periods","href":"data/Schedule/periods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"pmAssembly","qualifiedName":"data.Schedule.pmAssembly","href":"data/Schedule/pmAssembly-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"roshChodesh","qualifiedName":"data.Schedule.roshChodesh","href":"data/Schedule/roshChodesh-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Schedule.runtimeType","href":"data/Schedule/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"schedules","qualifiedName":"data.Schedule.schedules","href":"data/Schedule/schedules.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"toJson","qualifiedName":"data.Schedule.toJson","href":"data/Schedule/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"toString","qualifiedName":"data.Schedule.toString","href":"data/Schedule/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"winterFriday","qualifiedName":"data.Schedule.winterFriday","href":"data/Schedule/winterFriday-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"winterFridayRoshChodesh","qualifiedName":"data.Schedule.winterFridayRoshChodesh","href":"data/Schedule/winterFridayRoshChodesh-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Schedule","type":"class"}},{"name":"Scores","qualifiedName":"data.Scores","href":"data/Scores-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Scores.==","href":"data/Scores/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"Scores","qualifiedName":"data.Scores.Scores","href":"data/Scores/Scores.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"didDraw","qualifiedName":"data.Scores.didDraw","href":"data/Scores/didDraw.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"didWin","qualifiedName":"data.Scores.didWin","href":"data/Scores/didWin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"Scores.fromJson","qualifiedName":"data.Scores.fromJson","href":"data/Scores/Scores.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"getScore","qualifiedName":"data.Scores.getScore","href":"data/Scores/getScore.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"hashCode","qualifiedName":"data.Scores.hashCode","href":"data/Scores/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"isHome","qualifiedName":"data.Scores.isHome","href":"data/Scores/isHome.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Scores.noSuchMethod","href":"data/Scores/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"otherScore","qualifiedName":"data.Scores.otherScore","href":"data/Scores/otherScore.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"ramazScore","qualifiedName":"data.Scores.ramazScore","href":"data/Scores/ramazScore.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Scores.runtimeType","href":"data/Scores/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"toJson","qualifiedName":"data.Scores.toJson","href":"data/Scores/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"toString","qualifiedName":"data.Scores.toString","href":"data/Scores/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Scores","type":"class"}},{"name":"Sport","qualifiedName":"data.Sport","href":"data/Sport-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Sport.==","href":"data/Sport/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sport","type":"enum"}},{"name":"hashCode","qualifiedName":"data.Sport.hashCode","href":"data/Sport/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sport","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"data.Sport.noSuchMethod","href":"data/Sport/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sport","type":"enum"}},{"name":"runtimeType","qualifiedName":"data.Sport.runtimeType","href":"data/Sport/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sport","type":"enum"}},{"name":"toString","qualifiedName":"data.Sport.toString","href":"data/Sport/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Sport","type":"enum"}},{"name":"SportsGame","qualifiedName":"data.SportsGame","href":"data/SportsGame-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.SportsGame.==","href":"data/SportsGame/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"SportsGame","qualifiedName":"data.SportsGame.SportsGame","href":"data/SportsGame/SportsGame.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"awayTeam","qualifiedName":"data.SportsGame.awayTeam","href":"data/SportsGame/awayTeam.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"capitalize","qualifiedName":"data.SportsGame.capitalize","href":"data/SportsGame/capitalize.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"date","qualifiedName":"data.SportsGame.date","href":"data/SportsGame/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"dateTime","qualifiedName":"data.SportsGame.dateTime","href":"data/SportsGame/dateTime.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"description","qualifiedName":"data.SportsGame.description","href":"data/SportsGame/description.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"SportsGame.fromJson","qualifiedName":"data.SportsGame.fromJson","href":"data/SportsGame/SportsGame.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"fromList","qualifiedName":"data.SportsGame.fromList","href":"data/SportsGame/fromList.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"getJsonList","qualifiedName":"data.SportsGame.getJsonList","href":"data/SportsGame/getJsonList.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"hashCode","qualifiedName":"data.SportsGame.hashCode","href":"data/SportsGame/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"homeTeam","qualifiedName":"data.SportsGame.homeTeam","href":"data/SportsGame/homeTeam.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"isHome","qualifiedName":"data.SportsGame.isHome","href":"data/SportsGame/isHome.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.SportsGame.noSuchMethod","href":"data/SportsGame/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"opponent","qualifiedName":"data.SportsGame.opponent","href":"data/SportsGame/opponent.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"replaceScores","qualifiedName":"data.SportsGame.replaceScores","href":"data/SportsGame/replaceScores.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"runtimeType","qualifiedName":"data.SportsGame.runtimeType","href":"data/SportsGame/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"scores","qualifiedName":"data.SportsGame.scores","href":"data/SportsGame/scores.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"sport","qualifiedName":"data.SportsGame.sport","href":"data/SportsGame/sport.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"team","qualifiedName":"data.SportsGame.team","href":"data/SportsGame/team.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"times","qualifiedName":"data.SportsGame.times","href":"data/SportsGame/times.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"toJson","qualifiedName":"data.SportsGame.toJson","href":"data/SportsGame/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"toString","qualifiedName":"data.SportsGame.toString","href":"data/SportsGame/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsGame","type":"class"}},{"name":"Subject","qualifiedName":"data.Subject","href":"data/Subject-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.Subject.==","href":"data/Subject/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"Subject","qualifiedName":"data.Subject.Subject","href":"data/Subject/Subject.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"Subject.fromJson","qualifiedName":"data.Subject.fromJson","href":"data/Subject/Subject.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"getSubjects","qualifiedName":"data.Subject.getSubjects","href":"data/Subject/getSubjects.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"hashCode","qualifiedName":"data.Subject.hashCode","href":"data/Subject/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"name","qualifiedName":"data.Subject.name","href":"data/Subject/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Subject.noSuchMethod","href":"data/Subject/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Subject.runtimeType","href":"data/Subject/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"teacher","qualifiedName":"data.Subject.teacher","href":"data/Subject/teacher.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"toString","qualifiedName":"data.Subject.toString","href":"data/Subject/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"virtualLink","qualifiedName":"data.Subject.virtualLink","href":"data/Subject/virtualLink.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Subject","type":"class"}},{"name":"SubjectReminderTime","qualifiedName":"data.SubjectReminderTime","href":"data/SubjectReminderTime-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"SubjectReminderTime","qualifiedName":"data.SubjectReminderTime.SubjectReminderTime","href":"data/SubjectReminderTime/SubjectReminderTime.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"doesApply","qualifiedName":"data.SubjectReminderTime.doesApply","href":"data/SubjectReminderTime/doesApply.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"SubjectReminderTime.fromJson","qualifiedName":"data.SubjectReminderTime.fromJson","href":"data/SubjectReminderTime/SubjectReminderTime.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"hash","qualifiedName":"data.SubjectReminderTime.hash","href":"data/SubjectReminderTime/hash.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"name","qualifiedName":"data.SubjectReminderTime.name","href":"data/SubjectReminderTime/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"toJson","qualifiedName":"data.SubjectReminderTime.toJson","href":"data/SubjectReminderTime/toJson.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"toString","qualifiedName":"data.SubjectReminderTime.toString","href":"data/SubjectReminderTime/toString.html","type":"method","overriddenDepth":2,"packageName":"ramaz","enclosedBy":{"name":"SubjectReminderTime","type":"class"}},{"name":"Time","qualifiedName":"data.Time","href":"data/Time-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator <","qualifiedName":"data.Time.<","href":"data/Time/operator_less.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"operator <=","qualifiedName":"data.Time.<=","href":"data/Time/operator_less_equal.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"operator ==","qualifiedName":"data.Time.==","href":"data/Time/operator_equals.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"operator >","qualifiedName":"data.Time.>","href":"data/Time/operator_greater.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"operator >=","qualifiedName":"data.Time.>=","href":"data/Time/operator_greater_equal.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"Time","qualifiedName":"data.Time.Time","href":"data/Time/Time.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"Time.fromDateTime","qualifiedName":"data.Time.fromDateTime","href":"data/Time/Time.fromDateTime.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"Time.fromJson","qualifiedName":"data.Time.fromJson","href":"data/Time/Time.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"hashCode","qualifiedName":"data.Time.hashCode","href":"data/Time/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"hour","qualifiedName":"data.Time.hour","href":"data/Time/hour.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"minutes","qualifiedName":"data.Time.minutes","href":"data/Time/minutes.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.Time.noSuchMethod","href":"data/Time/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"runtimeType","qualifiedName":"data.Time.runtimeType","href":"data/Time/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"toJson","qualifiedName":"data.Time.toJson","href":"data/Time/toJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"toString","qualifiedName":"data.Time.toString","href":"data/Time/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Time","type":"class"}},{"name":"User","qualifiedName":"data.User","href":"data/User-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"operator ==","qualifiedName":"data.User.==","href":"data/User/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"User","qualifiedName":"data.User.User","href":"data/User/User.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"advisory","qualifiedName":"data.User.advisory","href":"data/User/advisory.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"contactInfo","qualifiedName":"data.User.contactInfo","href":"data/User/contactInfo.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"dayNames","qualifiedName":"data.User.dayNames","href":"data/User/dayNames.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"User.fromJson","qualifiedName":"data.User.fromJson","href":"data/User/User.fromJson.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"getPeriods","qualifiedName":"data.User.getPeriods","href":"data/User/getPeriods.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"grade","qualifiedName":"data.User.grade","href":"data/User/grade.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"hashCode","qualifiedName":"data.User.hashCode","href":"data/User/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"noSuchMethod","qualifiedName":"data.User.noSuchMethod","href":"data/User/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"registeredClubs","qualifiedName":"data.User.registeredClubs","href":"data/User/registeredClubs.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"runtimeType","qualifiedName":"data.User.runtimeType","href":"data/User/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"safeJson","qualifiedName":"data.User.safeJson","href":"data/User/safeJson.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"schedule","qualifiedName":"data.User.schedule","href":"data/User/schedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"sectionIDs","qualifiedName":"data.User.sectionIDs","href":"data/User/sectionIDs.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"toString","qualifiedName":"data.User.toString","href":"data/User/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"User","type":"class"}},{"name":"activityTypeToString","qualifiedName":"data.activityTypeToString","href":"data/activityTypeToString.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"adminScopeToString","qualifiedName":"data.adminScopeToString","href":"data/adminScopeToString.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"intToGrade","qualifiedName":"data.intToGrade","href":"data/intToGrade.html","type":"top-level property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"parseActivityType","qualifiedName":"data.parseActivityType","href":"data/parseActivityType.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"parseAdminScope","qualifiedName":"data.parseAdminScope","href":"data/parseAdminScope.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"reminderTimeToString","qualifiedName":"data.reminderTimeToString","href":"data/reminderTimeToString-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"sportToString","qualifiedName":"data.sportToString","href":"data/sportToString.html","type":"top-level property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"stringToReminderTime","qualifiedName":"data.stringToReminderTime","href":"data/stringToReminderTime-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"stringToSport","qualifiedName":"data.stringToSport","href":"data/stringToSport-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"data","type":"library"}},{"name":"generated_plugin_registrant","qualifiedName":"generated_plugin_registrant","href":"generated_plugin_registrant/generated_plugin_registrant-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"registerPlugins","qualifiedName":"generated_plugin_registrant.registerPlugins","href":"generated_plugin_registrant/registerPlugins.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"generated_plugin_registrant","type":"library"}},{"name":"main","qualifiedName":"main","href":"main/main-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"main","qualifiedName":"main.main","href":"main/main.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"main","type":"library"}},{"name":"models","qualifiedName":"models","href":"models/models-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"AdminScheduleModel","qualifiedName":"models.AdminScheduleModel","href":"models/AdminScheduleModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"AdminScheduleModel","qualifiedName":"models.AdminScheduleModel.AdminScheduleModel","href":"models/AdminScheduleModel/AdminScheduleModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"createSchedule","qualifiedName":"models.AdminScheduleModel.createSchedule","href":"models/AdminScheduleModel/createSchedule.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"deleteSchedule","qualifiedName":"models.AdminScheduleModel.deleteSchedule","href":"models/AdminScheduleModel/deleteSchedule.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"jsonSchedules","qualifiedName":"models.AdminScheduleModel.jsonSchedules","href":"models/AdminScheduleModel/jsonSchedules.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"saveSchedules","qualifiedName":"models.AdminScheduleModel.saveSchedules","href":"models/AdminScheduleModel/saveSchedules.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"schedules","qualifiedName":"models.AdminScheduleModel.schedules","href":"models/AdminScheduleModel/schedules.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminScheduleModel","type":"class"}},{"name":"CalendarDay","qualifiedName":"models.CalendarDay","href":"models/CalendarDay-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"operator ==","qualifiedName":"models.CalendarDay.==","href":"models/CalendarDay/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"CalendarDay","qualifiedName":"models.CalendarDay.CalendarDay","href":"models/CalendarDay/CalendarDay.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"date","qualifiedName":"models.CalendarDay.date","href":"models/CalendarDay/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"hashCode","qualifiedName":"models.CalendarDay.hashCode","href":"models/CalendarDay/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"noSuchMethod","qualifiedName":"models.CalendarDay.noSuchMethod","href":"models/CalendarDay/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"runtimeType","qualifiedName":"models.CalendarDay.runtimeType","href":"models/CalendarDay/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"schoolDay","qualifiedName":"models.CalendarDay.schoolDay","href":"models/CalendarDay/schoolDay.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"toString","qualifiedName":"models.CalendarDay.toString","href":"models/CalendarDay/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarDay","type":"class"}},{"name":"CalendarEditor","qualifiedName":"models.CalendarEditor","href":"models/CalendarEditor-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"CalendarEditor","qualifiedName":"models.CalendarEditor.CalendarEditor","href":"models/CalendarEditor/CalendarEditor.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"calendar","qualifiedName":"models.CalendarEditor.calendar","href":"models/CalendarEditor/calendar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"currentMonth","qualifiedName":"models.CalendarEditor.currentMonth","href":"models/CalendarEditor/currentMonth.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"currentYear","qualifiedName":"models.CalendarEditor.currentYear","href":"models/CalendarEditor/currentYear.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"daysInMonth","qualifiedName":"models.CalendarEditor.daysInMonth","href":"models/CalendarEditor/daysInMonth.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"dispose","qualifiedName":"models.CalendarEditor.dispose","href":"models/CalendarEditor/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"layoutMonth","qualifiedName":"models.CalendarEditor.layoutMonth","href":"models/CalendarEditor/layoutMonth.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"loadMonth","qualifiedName":"models.CalendarEditor.loadMonth","href":"models/CalendarEditor/loadMonth.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"now","qualifiedName":"models.CalendarEditor.now","href":"models/CalendarEditor/now.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"subscriptions","qualifiedName":"models.CalendarEditor.subscriptions","href":"models/CalendarEditor/subscriptions.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"updateDay","qualifiedName":"models.CalendarEditor.updateDay","href":"models/CalendarEditor/updateDay.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"years","qualifiedName":"models.CalendarEditor.years","href":"models/CalendarEditor/years.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarEditor","type":"class"}},{"name":"DayBuilderModel","qualifiedName":"models.DayBuilderModel","href":"models/DayBuilderModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"DayBuilderModel","qualifiedName":"models.DayBuilderModel.DayBuilderModel","href":"models/DayBuilderModel/DayBuilderModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"date","qualifiedName":"models.DayBuilderModel.date","href":"models/DayBuilderModel/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"day","qualifiedName":"models.DayBuilderModel.day","href":"models/DayBuilderModel/day.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"hasSchool","qualifiedName":"models.DayBuilderModel.hasSchool","href":"models/DayBuilderModel/hasSchool.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"name","qualifiedName":"models.DayBuilderModel.name","href":"models/DayBuilderModel/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"ready","qualifiedName":"models.DayBuilderModel.ready","href":"models/DayBuilderModel/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"schedule","qualifiedName":"models.DayBuilderModel.schedule","href":"models/DayBuilderModel/schedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilderModel","type":"class"}},{"name":"FeedbackModel","qualifiedName":"models.FeedbackModel","href":"models/FeedbackModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"FeedbackModel","qualifiedName":"models.FeedbackModel.FeedbackModel","href":"models/FeedbackModel/FeedbackModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackModel","type":"class"}},{"name":"anonymous","qualifiedName":"models.FeedbackModel.anonymous","href":"models/FeedbackModel/anonymous.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackModel","type":"class"}},{"name":"message","qualifiedName":"models.FeedbackModel.message","href":"models/FeedbackModel/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackModel","type":"class"}},{"name":"ready","qualifiedName":"models.FeedbackModel.ready","href":"models/FeedbackModel/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackModel","type":"class"}},{"name":"send","qualifiedName":"models.FeedbackModel.send","href":"models/FeedbackModel/send.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackModel","type":"class"}},{"name":"HomeModel","qualifiedName":"models.HomeModel","href":"models/HomeModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"HomeModel","qualifiedName":"models.HomeModel.HomeModel","href":"models/HomeModel/HomeModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomeModel","type":"class"}},{"name":"dispose","qualifiedName":"models.HomeModel.dispose","href":"models/HomeModel/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"HomeModel","type":"class"}},{"name":"refresh","qualifiedName":"models.HomeModel.refresh","href":"models/HomeModel/refresh.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomeModel","type":"class"}},{"name":"Models","qualifiedName":"models.Models","href":"models/Models-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"Models","qualifiedName":"models.Models.Models","href":"models/Models/Models.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"dispose","qualifiedName":"models.Models.dispose","href":"models/Models/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"init","qualifiedName":"models.Models.init","href":"models/Models/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"instance","qualifiedName":"models.Models.instance","href":"models/Models/instance.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"isReady","qualifiedName":"models.Models.isReady","href":"models/Models/isReady.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"reminders","qualifiedName":"models.Models.reminders","href":"models/Models/reminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"schedule","qualifiedName":"models.Models.schedule","href":"models/Models/schedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"sports","qualifiedName":"models.Models.sports","href":"models/Models/sports.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"user","qualifiedName":"models.Models.user","href":"models/Models/user.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Models","type":"class"}},{"name":"Reminders","qualifiedName":"models.Reminders","href":"models/Reminders-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"Reminders","qualifiedName":"models.Reminders.Reminders","href":"models/Reminders/Reminders.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"addReminder","qualifiedName":"models.Reminders.addReminder","href":"models/Reminders/addReminder.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"cleanReminders","qualifiedName":"models.Reminders.cleanReminders","href":"models/Reminders/cleanReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"currentReminders","qualifiedName":"models.Reminders.currentReminders","href":"models/Reminders/currentReminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"deleteReminder","qualifiedName":"models.Reminders.deleteReminder","href":"models/Reminders/deleteReminder.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"getReminders","qualifiedName":"models.Reminders.getReminders","href":"models/Reminders/getReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"hasNextReminder","qualifiedName":"models.Reminders.hasNextReminder","href":"models/Reminders/hasNextReminder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"hasReminder","qualifiedName":"models.Reminders.hasReminder","href":"models/Reminders/hasReminder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"init","qualifiedName":"models.Reminders.init","href":"models/Reminders/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"markShown","qualifiedName":"models.Reminders.markShown","href":"models/Reminders/markShown.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"nextReminders","qualifiedName":"models.Reminders.nextReminders","href":"models/Reminders/nextReminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"readReminders","qualifiedName":"models.Reminders.readReminders","href":"models/Reminders/readReminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"reminders","qualifiedName":"models.Reminders.reminders","href":"models/Reminders/reminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"replaceReminder","qualifiedName":"models.Reminders.replaceReminder","href":"models/Reminders/replaceReminder.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"verifyReminders","qualifiedName":"models.Reminders.verifyReminders","href":"models/Reminders/verifyReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Reminders","type":"class"}},{"name":"RemindersBuilderModel","qualifiedName":"models.RemindersBuilderModel","href":"models/RemindersBuilderModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"RemindersBuilderModel","qualifiedName":"models.RemindersBuilderModel.RemindersBuilderModel","href":"models/RemindersBuilderModel/RemindersBuilderModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"build","qualifiedName":"models.RemindersBuilderModel.build","href":"models/RemindersBuilderModel/build.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"changeCourse","qualifiedName":"models.RemindersBuilderModel.changeCourse","href":"models/RemindersBuilderModel/changeCourse.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"changeDay","qualifiedName":"models.RemindersBuilderModel.changeDay","href":"models/RemindersBuilderModel/changeDay.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"changePeriod","qualifiedName":"models.RemindersBuilderModel.changePeriod","href":"models/RemindersBuilderModel/changePeriod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"course","qualifiedName":"models.RemindersBuilderModel.course","href":"models/RemindersBuilderModel/course.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"courses","qualifiedName":"models.RemindersBuilderModel.courses","href":"models/RemindersBuilderModel/courses.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"dayName","qualifiedName":"models.RemindersBuilderModel.dayName","href":"models/RemindersBuilderModel/dayName.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"message","qualifiedName":"models.RemindersBuilderModel.message","href":"models/RemindersBuilderModel/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"onMessageChanged","qualifiedName":"models.RemindersBuilderModel.onMessageChanged","href":"models/RemindersBuilderModel/onMessageChanged.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"period","qualifiedName":"models.RemindersBuilderModel.period","href":"models/RemindersBuilderModel/period.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"periods","qualifiedName":"models.RemindersBuilderModel.periods","href":"models/RemindersBuilderModel/periods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"ready","qualifiedName":"models.RemindersBuilderModel.ready","href":"models/RemindersBuilderModel/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"shouldRepeat","qualifiedName":"models.RemindersBuilderModel.shouldRepeat","href":"models/RemindersBuilderModel/shouldRepeat.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"time","qualifiedName":"models.RemindersBuilderModel.time","href":"models/RemindersBuilderModel/time.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"toggleRepeat","qualifiedName":"models.RemindersBuilderModel.toggleRepeat","href":"models/RemindersBuilderModel/toggleRepeat.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"toggleRepeatType","qualifiedName":"models.RemindersBuilderModel.toggleRepeatType","href":"models/RemindersBuilderModel/toggleRepeatType.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"type","qualifiedName":"models.RemindersBuilderModel.type","href":"models/RemindersBuilderModel/type.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RemindersBuilderModel","type":"class"}},{"name":"ScheduleBuilderModel","qualifiedName":"models.ScheduleBuilderModel","href":"models/ScheduleBuilderModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"ScheduleBuilderModel","qualifiedName":"models.ScheduleBuilderModel.ScheduleBuilderModel","href":"models/ScheduleBuilderModel/ScheduleBuilderModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"name","qualifiedName":"models.ScheduleBuilderModel.name","href":"models/ScheduleBuilderModel/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"numPeriods","qualifiedName":"models.ScheduleBuilderModel.numPeriods","href":"models/ScheduleBuilderModel/numPeriods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"periods","qualifiedName":"models.ScheduleBuilderModel.periods","href":"models/ScheduleBuilderModel/periods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"preset","qualifiedName":"models.ScheduleBuilderModel.preset","href":"models/ScheduleBuilderModel/preset.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"ready","qualifiedName":"models.ScheduleBuilderModel.ready","href":"models/ScheduleBuilderModel/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"replaceTime","qualifiedName":"models.ScheduleBuilderModel.replaceTime","href":"models/ScheduleBuilderModel/replaceTime.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"schedule","qualifiedName":"models.ScheduleBuilderModel.schedule","href":"models/ScheduleBuilderModel/schedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"usePreset","qualifiedName":"models.ScheduleBuilderModel.usePreset","href":"models/ScheduleBuilderModel/usePreset.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderModel","type":"class"}},{"name":"ScheduleModel","qualifiedName":"models.ScheduleModel","href":"models/ScheduleModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"ScheduleModel","qualifiedName":"models.ScheduleModel.ScheduleModel","href":"models/ScheduleModel/ScheduleModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"calendar","qualifiedName":"models.ScheduleModel.calendar","href":"models/ScheduleModel/calendar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"dispose","qualifiedName":"models.ScheduleModel.dispose","href":"models/ScheduleModel/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"hasSchool","qualifiedName":"models.ScheduleModel.hasSchool","href":"models/ScheduleModel/hasSchool.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"init","qualifiedName":"models.ScheduleModel.init","href":"models/ScheduleModel/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"initCalendar","qualifiedName":"models.ScheduleModel.initCalendar","href":"models/ScheduleModel/initCalendar.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"isValidReminder","qualifiedName":"models.ScheduleModel.isValidReminder","href":"models/ScheduleModel/isValidReminder.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"nextPeriod","qualifiedName":"models.ScheduleModel.nextPeriod","href":"models/ScheduleModel/nextPeriod.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"nextSubject","qualifiedName":"models.ScheduleModel.nextSubject","href":"models/ScheduleModel/nextSubject.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"now","qualifiedName":"models.ScheduleModel.now","href":"models/ScheduleModel/now.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"onNewPeriod","qualifiedName":"models.ScheduleModel.onNewPeriod","href":"models/ScheduleModel/onNewPeriod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"period","qualifiedName":"models.ScheduleModel.period","href":"models/ScheduleModel/period.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"periodIndex","qualifiedName":"models.ScheduleModel.periodIndex","href":"models/ScheduleModel/periodIndex.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"periods","qualifiedName":"models.ScheduleModel.periods","href":"models/ScheduleModel/periods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"reminders","qualifiedName":"models.ScheduleModel.reminders","href":"models/ScheduleModel/reminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"remindersListener","qualifiedName":"models.ScheduleModel.remindersListener","href":"models/ScheduleModel/remindersListener.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"scheduleReminders","qualifiedName":"models.ScheduleModel.scheduleReminders","href":"models/ScheduleModel/scheduleReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"setToday","qualifiedName":"models.ScheduleModel.setToday","href":"models/ScheduleModel/setToday.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"subject","qualifiedName":"models.ScheduleModel.subject","href":"models/ScheduleModel/subject.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"subjects","qualifiedName":"models.ScheduleModel.subjects","href":"models/ScheduleModel/subjects.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"timer","qualifiedName":"models.ScheduleModel.timer","href":"models/ScheduleModel/timer.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"timerInterval","qualifiedName":"models.ScheduleModel.timerInterval","href":"models/ScheduleModel/timerInterval-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"today","qualifiedName":"models.ScheduleModel.today","href":"models/ScheduleModel/today.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"updateReminders","qualifiedName":"models.ScheduleModel.updateReminders","href":"models/ScheduleModel/updateReminders.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"user","qualifiedName":"models.ScheduleModel.user","href":"models/ScheduleModel/user.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleModel","type":"class"}},{"name":"ScheduleViewModel","qualifiedName":"models.ScheduleViewModel","href":"models/ScheduleViewModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"ScheduleViewModel","qualifiedName":"models.ScheduleViewModel.ScheduleViewModel","href":"models/ScheduleViewModel/ScheduleViewModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"dataModel","qualifiedName":"models.ScheduleViewModel.dataModel","href":"models/ScheduleViewModel/dataModel.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"date","qualifiedName":"models.ScheduleViewModel.date","href":"models/ScheduleViewModel/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"day","qualifiedName":"models.ScheduleViewModel.day","href":"models/ScheduleViewModel/day.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"defatulSchedule","qualifiedName":"models.ScheduleViewModel.defatulSchedule","href":"models/ScheduleViewModel/defatulSchedule.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"defaultDay","qualifiedName":"models.ScheduleViewModel.defaultDay","href":"models/ScheduleViewModel/defaultDay.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"update","qualifiedName":"models.ScheduleViewModel.update","href":"models/ScheduleViewModel/update.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleViewModel","type":"class"}},{"name":"SortOption","qualifiedName":"models.SortOption","href":"models/SortOption-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"operator ==","qualifiedName":"models.SortOption.==","href":"models/SortOption/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SortOption","type":"enum"}},{"name":"hashCode","qualifiedName":"models.SortOption.hashCode","href":"models/SortOption/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SortOption","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"models.SortOption.noSuchMethod","href":"models/SortOption/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SortOption","type":"enum"}},{"name":"runtimeType","qualifiedName":"models.SortOption.runtimeType","href":"models/SortOption/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SortOption","type":"enum"}},{"name":"toString","qualifiedName":"models.SortOption.toString","href":"models/SortOption/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SortOption","type":"enum"}},{"name":"Sports","qualifiedName":"models.Sports","href":"models/Sports-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"Sports","qualifiedName":"models.Sports.Sports","href":"models/Sports/Sports.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"addGame","qualifiedName":"models.Sports.addGame","href":"models/Sports/addGame.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"delete","qualifiedName":"models.Sports.delete","href":"models/Sports/delete.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"games","qualifiedName":"models.Sports.games","href":"models/Sports/games.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"getTodayGames","qualifiedName":"models.Sports.getTodayGames","href":"models/Sports/getTodayGames.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"init","qualifiedName":"models.Sports.init","href":"models/Sports/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"now","qualifiedName":"models.Sports.now","href":"models/Sports/now.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"replace","qualifiedName":"models.Sports.replace","href":"models/Sports/replace.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"saveGames","qualifiedName":"models.Sports.saveGames","href":"models/Sports/saveGames.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"timer","qualifiedName":"models.Sports.timer","href":"models/Sports/timer.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"todayGames","qualifiedName":"models.Sports.todayGames","href":"models/Sports/todayGames.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Sports","type":"class"}},{"name":"SportsBuilderModel","qualifiedName":"models.SportsBuilderModel","href":"models/SportsBuilderModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"SportsBuilderModel","qualifiedName":"models.SportsBuilderModel.SportsBuilderModel","href":"models/SportsBuilderModel/SportsBuilderModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"away","qualifiedName":"models.SportsBuilderModel.away","href":"models/SportsBuilderModel/away.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"date","qualifiedName":"models.SportsBuilderModel.date","href":"models/SportsBuilderModel/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"end","qualifiedName":"models.SportsBuilderModel.end","href":"models/SportsBuilderModel/end.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"game","qualifiedName":"models.SportsBuilderModel.game","href":"models/SportsBuilderModel/game.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"loading","qualifiedName":"models.SportsBuilderModel.loading","href":"models/SportsBuilderModel/loading.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"opponent","qualifiedName":"models.SportsBuilderModel.opponent","href":"models/SportsBuilderModel/opponent.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"ready","qualifiedName":"models.SportsBuilderModel.ready","href":"models/SportsBuilderModel/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"scores","qualifiedName":"models.SportsBuilderModel.scores","href":"models/SportsBuilderModel/scores.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"sport","qualifiedName":"models.SportsBuilderModel.sport","href":"models/SportsBuilderModel/sport.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"start","qualifiedName":"models.SportsBuilderModel.start","href":"models/SportsBuilderModel/start.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"team","qualifiedName":"models.SportsBuilderModel.team","href":"models/SportsBuilderModel/team.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilderModel","type":"class"}},{"name":"SportsModel","qualifiedName":"models.SportsModel","href":"models/SportsModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"SportsModel","qualifiedName":"models.SportsModel.SportsModel","href":"models/SportsModel/SportsModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"adminFunc","qualifiedName":"models.SportsModel.adminFunc","href":"models/SportsModel/adminFunc.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"data","qualifiedName":"models.SportsModel.data","href":"models/SportsModel/data.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"dispose","qualifiedName":"models.SportsModel.dispose","href":"models/SportsModel/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"divideGames","qualifiedName":"models.SportsModel.divideGames","href":"models/SportsModel/divideGames.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"isAdmin","qualifiedName":"models.SportsModel.isAdmin","href":"models/SportsModel/isAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"loading","qualifiedName":"models.SportsModel.loading","href":"models/SportsModel/loading.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"recentBySport","qualifiedName":"models.SportsModel.recentBySport","href":"models/SportsModel/recentBySport.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"recents","qualifiedName":"models.SportsModel.recents","href":"models/SportsModel/recents.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"setup","qualifiedName":"models.SportsModel.setup","href":"models/SportsModel/setup.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"sortByDate","qualifiedName":"models.SportsModel.sortByDate","href":"models/SportsModel/sortByDate.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"sortBySport","qualifiedName":"models.SportsModel.sortBySport","href":"models/SportsModel/sortBySport.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"sortGames","qualifiedName":"models.SportsModel.sortGames","href":"models/SportsModel/sortGames.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"sortOption","qualifiedName":"models.SportsModel.sortOption","href":"models/SportsModel/sortOption.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"upcoming","qualifiedName":"models.SportsModel.upcoming","href":"models/SportsModel/upcoming.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"upcomingBySport","qualifiedName":"models.SportsModel.upcomingBySport","href":"models/SportsModel/upcomingBySport.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsModel","type":"class"}},{"name":"UserModel","qualifiedName":"models.UserModel","href":"models/UserModel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"models","type":"library"}},{"name":"UserModel","qualifiedName":"models.UserModel.UserModel","href":"models/UserModel/UserModel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"adminScopes","qualifiedName":"models.UserModel.adminScopes","href":"models/UserModel/adminScopes.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"data","qualifiedName":"models.UserModel.data","href":"models/UserModel/data.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"init","qualifiedName":"models.UserModel.init","href":"models/UserModel/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"isAdmin","qualifiedName":"models.UserModel.isAdmin","href":"models/UserModel/isAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"subjects","qualifiedName":"models.UserModel.subjects","href":"models/UserModel/subjects.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"UserModel","type":"class"}},{"name":"pages","qualifiedName":"pages","href":"pages/pages-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"AdminCalendarPage","qualifiedName":"pages.AdminCalendarPage","href":"pages/AdminCalendarPage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"AdminCalendarPage","qualifiedName":"pages.AdminCalendarPage.AdminCalendarPage","href":"pages/AdminCalendarPage/AdminCalendarPage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarPage","type":"class"}},{"name":"createState","qualifiedName":"pages.AdminCalendarPage.createState","href":"pages/AdminCalendarPage/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarPage","type":"class"}},{"name":"AdminCalendarState","qualifiedName":"pages.AdminCalendarState","href":"pages/AdminCalendarState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"AdminCalendarState","qualifiedName":"pages.AdminCalendarState.AdminCalendarState","href":"pages/AdminCalendarState/AdminCalendarState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"build","qualifiedName":"pages.AdminCalendarState.build","href":"pages/AdminCalendarState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"currentMonth","qualifiedName":"pages.AdminCalendarState.currentMonth","href":"pages/AdminCalendarState/currentMonth.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"dispose","qualifiedName":"pages.AdminCalendarState.dispose","href":"pages/AdminCalendarState/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"initState","qualifiedName":"pages.AdminCalendarState.initState","href":"pages/AdminCalendarState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"listener","qualifiedName":"pages.AdminCalendarState.listener","href":"pages/AdminCalendarState/listener.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"loopMonth","qualifiedName":"pages.AdminCalendarState.loopMonth","href":"pages/AdminCalendarState/loopMonth.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"model","qualifiedName":"pages.AdminCalendarState.model","href":"pages/AdminCalendarState/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"months","qualifiedName":"pages.AdminCalendarState.months","href":"pages/AdminCalendarState/months-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"weekdays","qualifiedName":"pages.AdminCalendarState.weekdays","href":"pages/AdminCalendarState/weekdays-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminCalendarState","type":"class"}},{"name":"AdminSchedulesPage","qualifiedName":"pages.AdminSchedulesPage","href":"pages/AdminSchedulesPage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"AdminSchedulesPage","qualifiedName":"pages.AdminSchedulesPage.AdminSchedulesPage","href":"pages/AdminSchedulesPage/AdminSchedulesPage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"AdminSchedulesPage","type":"class"}},{"name":"build","qualifiedName":"pages.AdminSchedulesPage.build","href":"pages/AdminSchedulesPage/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"AdminSchedulesPage","type":"class"}},{"name":"DayBuilder","qualifiedName":"pages.DayBuilder","href":"pages/DayBuilder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"DayBuilder","qualifiedName":"pages.DayBuilder.DayBuilder","href":"pages/DayBuilder/DayBuilder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilder","type":"class"}},{"name":"build","qualifiedName":"pages.DayBuilder.build","href":"pages/DayBuilder/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"DayBuilder","type":"class"}},{"name":"date","qualifiedName":"pages.DayBuilder.date","href":"pages/DayBuilder/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilder","type":"class"}},{"name":"day","qualifiedName":"pages.DayBuilder.day","href":"pages/DayBuilder/day.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilder","type":"class"}},{"name":"upload","qualifiedName":"pages.DayBuilder.upload","href":"pages/DayBuilder/upload.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"DayBuilder","type":"class"}},{"name":"FeedbackPage","qualifiedName":"pages.FeedbackPage","href":"pages/FeedbackPage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"FeedbackPage","qualifiedName":"pages.FeedbackPage.FeedbackPage","href":"pages/FeedbackPage/FeedbackPage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FeedbackPage","type":"class"}},{"name":"build","qualifiedName":"pages.FeedbackPage.build","href":"pages/FeedbackPage/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"FeedbackPage","type":"class"}},{"name":"FormRow","qualifiedName":"pages.FormRow","href":"pages/FormRow-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"FormRow","qualifiedName":"pages.FormRow.FormRow","href":"pages/FormRow/FormRow.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"build","qualifiedName":"pages.FormRow.build","href":"pages/FormRow/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"FormRow.editable","qualifiedName":"pages.FormRow.editable","href":"pages/FormRow/FormRow.editable.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"moreSpace","qualifiedName":"pages.FormRow.moreSpace","href":"pages/FormRow/moreSpace.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"picker","qualifiedName":"pages.FormRow.picker","href":"pages/FormRow/picker.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"sized","qualifiedName":"pages.FormRow.sized","href":"pages/FormRow/sized.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"title","qualifiedName":"pages.FormRow.title","href":"pages/FormRow/title.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"FormRow","type":"class"}},{"name":"GenericSportsView","qualifiedName":"pages.GenericSportsView","href":"pages/GenericSportsView-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"GenericSportsView","qualifiedName":"pages.GenericSportsView.GenericSportsView","href":"pages/GenericSportsView/GenericSportsView.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"build","qualifiedName":"pages.GenericSportsView.build","href":"pages/GenericSportsView/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"builder","qualifiedName":"pages.GenericSportsView.builder","href":"pages/GenericSportsView/builder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"loading","qualifiedName":"pages.GenericSportsView.loading","href":"pages/GenericSportsView/loading.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"onRefresh","qualifiedName":"pages.GenericSportsView.onRefresh","href":"pages/GenericSportsView/onRefresh.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"recents","qualifiedName":"pages.GenericSportsView.recents","href":"pages/GenericSportsView/recents.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"upcoming","qualifiedName":"pages.GenericSportsView.upcoming","href":"pages/GenericSportsView/upcoming.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"GenericSportsView","type":"class"}},{"name":"HomePage","qualifiedName":"pages.HomePage","href":"pages/HomePage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"HomePage","qualifiedName":"pages.HomePage.HomePage","href":"pages/HomePage/HomePage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomePage","type":"class"}},{"name":"createState","qualifiedName":"pages.HomePage.createState","href":"pages/HomePage/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"HomePage","type":"class"}},{"name":"pageIndex","qualifiedName":"pages.HomePage.pageIndex","href":"pages/HomePage/pageIndex.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomePage","type":"class"}},{"name":"HomePageState","qualifiedName":"pages.HomePageState","href":"pages/HomePageState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"HomePageState","qualifiedName":"pages.HomePageState.HomePageState","href":"pages/HomePageState/HomePageState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomePageState","type":"class"}},{"name":"build","qualifiedName":"pages.HomePageState.build","href":"pages/HomePageState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"HomePageState","type":"class"}},{"name":"index","qualifiedName":"pages.HomePageState.index","href":"pages/HomePageState/index.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomePageState","type":"class"}},{"name":"initState","qualifiedName":"pages.HomePageState.initState","href":"pages/HomePageState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"HomePageState","type":"class"}},{"name":"navItems","qualifiedName":"pages.HomePageState.navItems","href":"pages/HomePageState/navItems.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"HomePageState","type":"class"}},{"name":"Login","qualifiedName":"pages.Login","href":"pages/Login-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"Login","qualifiedName":"pages.Login.Login","href":"pages/Login/Login.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Login","type":"class"}},{"name":"createState","qualifiedName":"pages.Login.createState","href":"pages/Login/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Login","type":"class"}},{"name":"destination","qualifiedName":"pages.Login.destination","href":"pages/Login/destination.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Login","type":"class"}},{"name":"LoginState","qualifiedName":"pages.LoginState","href":"pages/LoginState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"LoginState","qualifiedName":"pages.LoginState.LoginState","href":"pages/LoginState/LoginState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"build","qualifiedName":"pages.LoginState.build","href":"pages/LoginState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"initState","qualifiedName":"pages.LoginState.initState","href":"pages/LoginState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"isLoading","qualifiedName":"pages.LoginState.isLoading","href":"pages/LoginState/isLoading.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"onError","qualifiedName":"pages.LoginState.onError","href":"pages/LoginState/onError.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"safely","qualifiedName":"pages.LoginState.safely","href":"pages/LoginState/safely.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"signIn","qualifiedName":"pages.LoginState.signIn","href":"pages/LoginState/signIn.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoginState","type":"class"}},{"name":"NavigationDrawer","qualifiedName":"pages.NavigationDrawer","href":"pages/NavigationDrawer-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"NavigationDrawer","qualifiedName":"pages.NavigationDrawer.NavigationDrawer","href":"pages/NavigationDrawer/NavigationDrawer.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"build","qualifiedName":"pages.NavigationDrawer.build","href":"pages/NavigationDrawer/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"getRouteName","qualifiedName":"pages.NavigationDrawer.getRouteName","href":"pages/NavigationDrawer/getRouteName.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"isScheduleAdmin","qualifiedName":"pages.NavigationDrawer.isScheduleAdmin","href":"pages/NavigationDrawer/isScheduleAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"isSportsAdmin","qualifiedName":"pages.NavigationDrawer.isSportsAdmin","href":"pages/NavigationDrawer/isSportsAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"pushRoute","qualifiedName":"pages.NavigationDrawer.pushRoute","href":"pages/NavigationDrawer/pushRoute.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationDrawer","type":"class"}},{"name":"OldCalendarWidget","qualifiedName":"pages.OldCalendarWidget","href":"pages/OldCalendarWidget-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"OldCalendarWidget","qualifiedName":"pages.OldCalendarWidget.OldCalendarWidget","href":"pages/OldCalendarWidget/OldCalendarWidget.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"OldCalendarWidget","type":"class"}},{"name":"build","qualifiedName":"pages.OldCalendarWidget.build","href":"pages/OldCalendarWidget/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"OldCalendarWidget","type":"class"}},{"name":"ReminderBuilder","qualifiedName":"pages.ReminderBuilder","href":"pages/ReminderBuilder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ReminderBuilder","qualifiedName":"pages.ReminderBuilder.ReminderBuilder","href":"pages/ReminderBuilder/ReminderBuilder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilder","type":"class"}},{"name":"buildReminder","qualifiedName":"pages.ReminderBuilder.buildReminder","href":"pages/ReminderBuilder/buildReminder.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilder","type":"class"}},{"name":"createState","qualifiedName":"pages.ReminderBuilder.createState","href":"pages/ReminderBuilder/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilder","type":"class"}},{"name":"reminder","qualifiedName":"pages.ReminderBuilder.reminder","href":"pages/ReminderBuilder/reminder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilder","type":"class"}},{"name":"trimString","qualifiedName":"pages.ReminderBuilder.trimString","href":"pages/ReminderBuilder/trimString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilder","type":"class"}},{"name":"ReminderBuilderState","qualifiedName":"pages.ReminderBuilderState","href":"pages/ReminderBuilderState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ReminderBuilderState","qualifiedName":"pages.ReminderBuilderState.ReminderBuilderState","href":"pages/ReminderBuilderState/ReminderBuilderState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilderState","type":"class"}},{"name":"build","qualifiedName":"pages.ReminderBuilderState.build","href":"pages/ReminderBuilderState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilderState","type":"class"}},{"name":"controller","qualifiedName":"pages.ReminderBuilderState.controller","href":"pages/ReminderBuilderState/controller.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilderState","type":"class"}},{"name":"initState","qualifiedName":"pages.ReminderBuilderState.initState","href":"pages/ReminderBuilderState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderBuilderState","type":"class"}},{"name":"ResponsiveReminders","qualifiedName":"pages.ResponsiveReminders","href":"pages/ResponsiveReminders-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ResponsiveReminders","qualifiedName":"pages.ResponsiveReminders.ResponsiveReminders","href":"pages/ResponsiveReminders/ResponsiveReminders.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveReminders","type":"class"}},{"name":"appBar","qualifiedName":"pages.ResponsiveReminders.appBar","href":"pages/ResponsiveReminders/appBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveReminders","type":"class"}},{"name":"build","qualifiedName":"pages.ResponsiveReminders.build","href":"pages/ResponsiveReminders/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveReminders","type":"class"}},{"name":"floatingActionButton","qualifiedName":"pages.ResponsiveReminders.floatingActionButton","href":"pages/ResponsiveReminders/floatingActionButton.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveReminders","type":"class"}},{"name":"model","qualifiedName":"pages.ResponsiveReminders.model","href":"pages/ResponsiveReminders/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveReminders","type":"class"}},{"name":"ResponsiveSchedule","qualifiedName":"pages.ResponsiveSchedule","href":"pages/ResponsiveSchedule-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ResponsiveSchedule","qualifiedName":"pages.ResponsiveSchedule.ResponsiveSchedule","href":"pages/ResponsiveSchedule/ResponsiveSchedule.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"appBar","qualifiedName":"pages.ResponsiveSchedule.appBar","href":"pages/ResponsiveSchedule/appBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"build","qualifiedName":"pages.ResponsiveSchedule.build","href":"pages/ResponsiveSchedule/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"floatingActionButton","qualifiedName":"pages.ResponsiveSchedule.floatingActionButton","href":"pages/ResponsiveSchedule/floatingActionButton.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"handleInvalidSchedule","qualifiedName":"pages.ResponsiveSchedule.handleInvalidSchedule","href":"pages/ResponsiveSchedule/handleInvalidSchedule.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"model","qualifiedName":"pages.ResponsiveSchedule.model","href":"pages/ResponsiveSchedule/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"viewDay","qualifiedName":"pages.ResponsiveSchedule.viewDay","href":"pages/ResponsiveSchedule/viewDay.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveSchedule","type":"class"}},{"name":"RouteInitializer","qualifiedName":"pages.RouteInitializer","href":"pages/RouteInitializer-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"RouteInitializer","qualifiedName":"pages.RouteInitializer.RouteInitializer","href":"pages/RouteInitializer/RouteInitializer.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"child","qualifiedName":"pages.RouteInitializer.child","href":"pages/RouteInitializer/child.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"createState","qualifiedName":"pages.RouteInitializer.createState","href":"pages/RouteInitializer/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"isAllowed","qualifiedName":"pages.RouteInitializer.isAllowed","href":"pages/RouteInitializer/isAllowed.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"isSignedIn","qualifiedName":"pages.RouteInitializer.isSignedIn","href":"pages/RouteInitializer/isSignedIn.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"onError","qualifiedName":"pages.RouteInitializer.onError","href":"pages/RouteInitializer/onError.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"onFailure","qualifiedName":"pages.RouteInitializer.onFailure","href":"pages/RouteInitializer/onFailure.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializer","type":"class"}},{"name":"RouteInitializerState","qualifiedName":"pages.RouteInitializerState","href":"pages/RouteInitializerState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"RouteInitializerState","qualifiedName":"pages.RouteInitializerState.RouteInitializerState","href":"pages/RouteInitializerState/RouteInitializerState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializerState","type":"class"}},{"name":"build","qualifiedName":"pages.RouteInitializerState.build","href":"pages/RouteInitializerState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializerState","type":"class"}},{"name":"init","qualifiedName":"pages.RouteInitializerState.init","href":"pages/RouteInitializerState/init.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializerState","type":"class"}},{"name":"initFuture","qualifiedName":"pages.RouteInitializerState.initFuture","href":"pages/RouteInitializerState/initFuture.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializerState","type":"class"}},{"name":"initState","qualifiedName":"pages.RouteInitializerState.initState","href":"pages/RouteInitializerState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"RouteInitializerState","type":"class"}},{"name":"Routes","qualifiedName":"pages.Routes","href":"pages/Routes-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"operator ==","qualifiedName":"pages.Routes.==","href":"pages/Routes/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"Routes","qualifiedName":"pages.Routes.Routes","href":"pages/Routes/Routes.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"calendar","qualifiedName":"pages.Routes.calendar","href":"pages/Routes/calendar-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"feedback","qualifiedName":"pages.Routes.feedback","href":"pages/Routes/feedback-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"hashCode","qualifiedName":"pages.Routes.hashCode","href":"pages/Routes/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"home","qualifiedName":"pages.Routes.home","href":"pages/Routes/home-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"login","qualifiedName":"pages.Routes.login","href":"pages/Routes/login-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"noSuchMethod","qualifiedName":"pages.Routes.noSuchMethod","href":"pages/Routes/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"reminders","qualifiedName":"pages.Routes.reminders","href":"pages/Routes/reminders-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"runtimeType","qualifiedName":"pages.Routes.runtimeType","href":"pages/Routes/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"schedule","qualifiedName":"pages.Routes.schedule","href":"pages/Routes/schedule-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"schedules","qualifiedName":"pages.Routes.schedules","href":"pages/Routes/schedules-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"sports","qualifiedName":"pages.Routes.sports","href":"pages/Routes/sports-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"toString","qualifiedName":"pages.Routes.toString","href":"pages/Routes/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Routes","type":"class"}},{"name":"ScheduleBuilder","qualifiedName":"pages.ScheduleBuilder","href":"pages/ScheduleBuilder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ScheduleBuilder","qualifiedName":"pages.ScheduleBuilder.ScheduleBuilder","href":"pages/ScheduleBuilder/ScheduleBuilder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilder","type":"class"}},{"name":"buildSchedule","qualifiedName":"pages.ScheduleBuilder.buildSchedule","href":"pages/ScheduleBuilder/buildSchedule.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilder","type":"class"}},{"name":"createState","qualifiedName":"pages.ScheduleBuilder.createState","href":"pages/ScheduleBuilder/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilder","type":"class"}},{"name":"preset","qualifiedName":"pages.ScheduleBuilder.preset","href":"pages/ScheduleBuilder/preset.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilder","type":"class"}},{"name":"ScheduleBuilderState","qualifiedName":"pages.ScheduleBuilderState","href":"pages/ScheduleBuilderState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ScheduleBuilderState","qualifiedName":"pages.ScheduleBuilderState.ScheduleBuilderState","href":"pages/ScheduleBuilderState/ScheduleBuilderState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderState","type":"class"}},{"name":"build","qualifiedName":"pages.ScheduleBuilderState.build","href":"pages/ScheduleBuilderState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderState","type":"class"}},{"name":"conflicting","qualifiedName":"pages.ScheduleBuilderState.conflicting","href":"pages/ScheduleBuilderState/conflicting.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderState","type":"class"}},{"name":"controller","qualifiedName":"pages.ScheduleBuilderState.controller","href":"pages/ScheduleBuilderState/controller.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderState","type":"class"}},{"name":"initState","qualifiedName":"pages.ScheduleBuilderState.initState","href":"pages/ScheduleBuilderState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScheduleBuilderState","type":"class"}},{"name":"SportBuilderState","qualifiedName":"pages.SportBuilderState","href":"pages/SportBuilderState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"SportBuilderState","qualifiedName":"pages.SportBuilderState.SportBuilderState","href":"pages/SportBuilderState/SportBuilderState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportBuilderState","type":"class"}},{"name":"build","qualifiedName":"pages.SportBuilderState.build","href":"pages/SportBuilderState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportBuilderState","type":"class"}},{"name":"initState","qualifiedName":"pages.SportBuilderState.initState","href":"pages/SportBuilderState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportBuilderState","type":"class"}},{"name":"opponentController","qualifiedName":"pages.SportBuilderState.opponentController","href":"pages/SportBuilderState/opponentController.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportBuilderState","type":"class"}},{"name":"teamController","qualifiedName":"pages.SportBuilderState.teamController","href":"pages/SportBuilderState/teamController.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportBuilderState","type":"class"}},{"name":"SportsBuilder","qualifiedName":"pages.SportsBuilder","href":"pages/SportsBuilder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"SportsBuilder","qualifiedName":"pages.SportsBuilder.SportsBuilder","href":"pages/SportsBuilder/SportsBuilder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilder","type":"class"}},{"name":"createGame","qualifiedName":"pages.SportsBuilder.createGame","href":"pages/SportsBuilder/createGame.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilder","type":"class"}},{"name":"createState","qualifiedName":"pages.SportsBuilder.createState","href":"pages/SportsBuilder/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilder","type":"class"}},{"name":"parent","qualifiedName":"pages.SportsBuilder.parent","href":"pages/SportsBuilder/parent.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsBuilder","type":"class"}},{"name":"SportsPage","qualifiedName":"pages.SportsPage","href":"pages/SportsPage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"SportsPage","qualifiedName":"pages.SportsPage.SportsPage","href":"pages/SportsPage/SportsPage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsPage","type":"class"}},{"name":"build","qualifiedName":"pages.SportsPage.build","href":"pages/SportsPage/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsPage","type":"class"}},{"name":"buildAppBar","qualifiedName":"pages.buildAppBar","href":"pages/buildAppBar.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"getLayout","qualifiedName":"pages.getLayout","href":"pages/getLayout.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"openMenu","qualifiedName":"pages.openMenu","href":"pages/openMenu.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"pages","type":"library"}},{"name":"ramaz_services","qualifiedName":"ramaz_services","href":"ramaz_services/ramaz_services-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"Auth","qualifiedName":"ramaz_services.Auth","href":"ramaz_services/Auth-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Auth.==","href":"ramaz_services/Auth/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"Auth","qualifiedName":"ramaz_services.Auth.Auth","href":"ramaz_services/Auth/Auth.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"adminScopes","qualifiedName":"ramaz_services.Auth.adminScopes","href":"ramaz_services/Auth/adminScopes.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"auth","qualifiedName":"ramaz_services.Auth.auth","href":"ramaz_services/Auth/auth.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"calendarScope","qualifiedName":"ramaz_services.Auth.calendarScope","href":"ramaz_services/Auth/calendarScope-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"claims","qualifiedName":"ramaz_services.Auth.claims","href":"ramaz_services/Auth/claims.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"email","qualifiedName":"ramaz_services.Auth.email","href":"ramaz_services/Auth/email.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"google","qualifiedName":"ramaz_services.Auth.google","href":"ramaz_services/Auth/google.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Auth.hashCode","href":"ramaz_services/Auth/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"isAdmin","qualifiedName":"ramaz_services.Auth.isAdmin","href":"ramaz_services/Auth/isAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"isCalendarAdmin","qualifiedName":"ramaz_services.Auth.isCalendarAdmin","href":"ramaz_services/Auth/isCalendarAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"isSignedIn","qualifiedName":"ramaz_services.Auth.isSignedIn","href":"ramaz_services/Auth/isSignedIn.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"isSportsAdmin","qualifiedName":"ramaz_services.Auth.isSportsAdmin","href":"ramaz_services/Auth/isSportsAdmin.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"name","qualifiedName":"ramaz_services.Auth.name","href":"ramaz_services/Auth/name.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Auth.noSuchMethod","href":"ramaz_services/Auth/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Auth.runtimeType","href":"ramaz_services/Auth/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"signIn","qualifiedName":"ramaz_services.Auth.signIn","href":"ramaz_services/Auth/signIn.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"signOut","qualifiedName":"ramaz_services.Auth.signOut","href":"ramaz_services/Auth/signOut.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"sportsScope","qualifiedName":"ramaz_services.Auth.sportsScope","href":"ramaz_services/Auth/sportsScope-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Auth.toString","href":"ramaz_services/Auth/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Auth","type":"class"}},{"name":"Crashlytics","qualifiedName":"ramaz_services.Crashlytics","href":"ramaz_services/Crashlytics-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Crashlytics.==","href":"ramaz_services/Crashlytics/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"Crashlytics","qualifiedName":"ramaz_services.Crashlytics.Crashlytics","href":"ramaz_services/Crashlytics/Crashlytics.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"didCrashLastTime","qualifiedName":"ramaz_services.Crashlytics.didCrashLastTime","href":"ramaz_services/Crashlytics/didCrashLastTime.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Crashlytics.hashCode","href":"ramaz_services/Crashlytics/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"init","qualifiedName":"ramaz_services.Crashlytics.init","href":"ramaz_services/Crashlytics/init.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"instance","qualifiedName":"ramaz_services.Crashlytics.instance","href":"ramaz_services/Crashlytics/instance.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"log","qualifiedName":"ramaz_services.Crashlytics.log","href":"ramaz_services/Crashlytics/log.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Crashlytics.noSuchMethod","href":"ramaz_services/Crashlytics/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"recordError","qualifiedName":"ramaz_services.Crashlytics.recordError","href":"ramaz_services/Crashlytics/recordError.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"recordFlutterError","qualifiedName":"ramaz_services.Crashlytics.recordFlutterError","href":"ramaz_services/Crashlytics/recordFlutterError.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Crashlytics.runtimeType","href":"ramaz_services/Crashlytics/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"setEmail","qualifiedName":"ramaz_services.Crashlytics.setEmail","href":"ramaz_services/Crashlytics/setEmail.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"signIn","qualifiedName":"ramaz_services.Crashlytics.signIn","href":"ramaz_services/Crashlytics/signIn.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Crashlytics.toString","href":"ramaz_services/Crashlytics/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"toggle","qualifiedName":"ramaz_services.Crashlytics.toggle","href":"ramaz_services/Crashlytics/toggle.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Crashlytics","type":"class"}},{"name":"NoAccountException","qualifiedName":"ramaz_services.NoAccountException","href":"ramaz_services/NoAccountException-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.NoAccountException.==","href":"ramaz_services/NoAccountException/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"NoAccountException","qualifiedName":"ramaz_services.NoAccountException.NoAccountException","href":"ramaz_services/NoAccountException/NoAccountException.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.NoAccountException.hashCode","href":"ramaz_services/NoAccountException/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.NoAccountException.noSuchMethod","href":"ramaz_services/NoAccountException/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.NoAccountException.runtimeType","href":"ramaz_services/NoAccountException/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.NoAccountException.toString","href":"ramaz_services/NoAccountException/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NoAccountException","type":"class"}},{"name":"Notification","qualifiedName":"ramaz_services.Notification","href":"ramaz_services/Notification-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Notification.==","href":"ramaz_services/Notification/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"Notification","qualifiedName":"ramaz_services.Notification.Notification","href":"ramaz_services/Notification/Notification.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Notification.hashCode","href":"ramaz_services/Notification/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"id","qualifiedName":"ramaz_services.Notification.id","href":"ramaz_services/Notification/id-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"message","qualifiedName":"ramaz_services.Notification.message","href":"ramaz_services/Notification/message.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Notification.noSuchMethod","href":"ramaz_services/Notification/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"Notification.reminder","qualifiedName":"ramaz_services.Notification.reminder","href":"ramaz_services/Notification/Notification.reminder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Notification.runtimeType","href":"ramaz_services/Notification/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"title","qualifiedName":"ramaz_services.Notification.title","href":"ramaz_services/Notification/title.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Notification.toString","href":"ramaz_services/Notification/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notification","type":"class"}},{"name":"Notifications","qualifiedName":"ramaz_services.Notifications","href":"ramaz_services/Notifications-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Notifications.==","href":"ramaz_services/Notifications/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"Notifications","qualifiedName":"ramaz_services.Notifications.Notifications","href":"ramaz_services/Notifications/Notifications.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"cancelAll","qualifiedName":"ramaz_services.Notifications.cancelAll","href":"ramaz_services/Notifications/cancelAll.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Notifications.hashCode","href":"ramaz_services/Notifications/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"init","qualifiedName":"ramaz_services.Notifications.init","href":"ramaz_services/Notifications/init.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"instance","qualifiedName":"ramaz_services.Notifications.instance","href":"ramaz_services/Notifications/instance.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Notifications.noSuchMethod","href":"ramaz_services/Notifications/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"pendingNotifications","qualifiedName":"ramaz_services.Notifications.pendingNotifications","href":"ramaz_services/Notifications/pendingNotifications.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Notifications.runtimeType","href":"ramaz_services/Notifications/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"scheduleNotification","qualifiedName":"ramaz_services.Notifications.scheduleNotification","href":"ramaz_services/Notifications/scheduleNotification.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"sendNotification","qualifiedName":"ramaz_services.Notifications.sendNotification","href":"ramaz_services/Notifications/sendNotification.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"signIn","qualifiedName":"ramaz_services.Notifications.signIn","href":"ramaz_services/Notifications/signIn.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Notifications.toString","href":"ramaz_services/Notifications/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Notifications","type":"class"}},{"name":"Preferences","qualifiedName":"ramaz_services.Preferences","href":"ramaz_services/Preferences-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Preferences.==","href":"ramaz_services/Preferences/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"Preferences","qualifiedName":"ramaz_services.Preferences.Preferences","href":"ramaz_services/Preferences/Preferences.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"brightness","qualifiedName":"ramaz_services.Preferences.brightness","href":"ramaz_services/Preferences/brightness.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"firstTime","qualifiedName":"ramaz_services.Preferences.firstTime","href":"ramaz_services/Preferences/firstTime.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"firstTimeKey","qualifiedName":"ramaz_services.Preferences.firstTimeKey","href":"ramaz_services/Preferences/firstTimeKey-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Preferences.hashCode","href":"ramaz_services/Preferences/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"init","qualifiedName":"ramaz_services.Preferences.init","href":"ramaz_services/Preferences/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"lightMode","qualifiedName":"ramaz_services.Preferences.lightMode","href":"ramaz_services/Preferences/lightMode-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Preferences.noSuchMethod","href":"ramaz_services/Preferences/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Preferences.runtimeType","href":"ramaz_services/Preferences/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"signIn","qualifiedName":"ramaz_services.Preferences.signIn","href":"ramaz_services/Preferences/signIn.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Preferences.toString","href":"ramaz_services/Preferences/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Preferences","type":"class"}},{"name":"Services","qualifiedName":"ramaz_services.Services","href":"ramaz_services/Services-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ramaz_services","type":"library"}},{"name":"operator ==","qualifiedName":"ramaz_services.Services.==","href":"ramaz_services/Services/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"Services","qualifiedName":"ramaz_services.Services.Services","href":"ramaz_services/Services/Services.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"crashlytics","qualifiedName":"ramaz_services.Services.crashlytics","href":"ramaz_services/Services/crashlytics.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"database","qualifiedName":"ramaz_services.Services.database","href":"ramaz_services/Services/database.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"hashCode","qualifiedName":"ramaz_services.Services.hashCode","href":"ramaz_services/Services/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"init","qualifiedName":"ramaz_services.Services.init","href":"ramaz_services/Services/init.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"instance","qualifiedName":"ramaz_services.Services.instance","href":"ramaz_services/Services/instance.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"isReady","qualifiedName":"ramaz_services.Services.isReady","href":"ramaz_services/Services/isReady.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"noSuchMethod","qualifiedName":"ramaz_services.Services.noSuchMethod","href":"ramaz_services/Services/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"notifications","qualifiedName":"ramaz_services.Services.notifications","href":"ramaz_services/Services/notifications.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"prefs","qualifiedName":"ramaz_services.Services.prefs","href":"ramaz_services/Services/prefs.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"pushNotifications","qualifiedName":"ramaz_services.Services.pushNotifications","href":"ramaz_services/Services/pushNotifications.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"runtimeType","qualifiedName":"ramaz_services.Services.runtimeType","href":"ramaz_services/Services/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"services","qualifiedName":"ramaz_services.Services.services","href":"ramaz_services/Services/services.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"signIn","qualifiedName":"ramaz_services.Services.signIn","href":"ramaz_services/Services/signIn.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"toString","qualifiedName":"ramaz_services.Services.toString","href":"ramaz_services/Services/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Services","type":"class"}},{"name":"widgets","qualifiedName":"widgets","href":"widgets/widgets-library.html","type":"library","overriddenDepth":0,"packageName":"ramaz"},{"name":"ActivityTile","qualifiedName":"widgets.ActivityTile","href":"widgets/ActivityTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ActivityTile","qualifiedName":"widgets.ActivityTile.ActivityTile","href":"widgets/ActivityTile/ActivityTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityTile","type":"class"}},{"name":"activity","qualifiedName":"widgets.ActivityTile.activity","href":"widgets/ActivityTile/activity.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityTile","type":"class"}},{"name":"build","qualifiedName":"widgets.ActivityTile.build","href":"widgets/ActivityTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ActivityTile","type":"class"}},{"name":"detailedActivities","qualifiedName":"widgets.ActivityTile.detailedActivities","href":"widgets/ActivityTile/detailedActivities-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ActivityTile","type":"class"}},{"name":"BrightnessChanger","qualifiedName":"widgets.BrightnessChanger","href":"widgets/BrightnessChanger-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"BrightnessChanger","qualifiedName":"widgets.BrightnessChanger.BrightnessChanger","href":"widgets/BrightnessChanger/BrightnessChanger.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChanger","type":"class"}},{"name":"createState","qualifiedName":"widgets.BrightnessChanger.createState","href":"widgets/BrightnessChanger/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChanger","type":"class"}},{"name":"BrightnessChanger.dropdown","qualifiedName":"widgets.BrightnessChanger.dropdown","href":"widgets/BrightnessChanger/BrightnessChanger.dropdown.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChanger","type":"class"}},{"name":"form","qualifiedName":"widgets.BrightnessChanger.form","href":"widgets/BrightnessChanger/form.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChanger","type":"class"}},{"name":"BrightnessChanger.iconButton","qualifiedName":"widgets.BrightnessChanger.iconButton","href":"widgets/BrightnessChanger/BrightnessChanger.iconButton.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChanger","type":"class"}},{"name":"BrightnessChangerForm","qualifiedName":"widgets.BrightnessChangerForm","href":"widgets/BrightnessChangerForm-class.html","type":"enum","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"operator ==","qualifiedName":"widgets.BrightnessChangerForm.==","href":"widgets/BrightnessChangerForm/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerForm","type":"enum"}},{"name":"hashCode","qualifiedName":"widgets.BrightnessChangerForm.hashCode","href":"widgets/BrightnessChangerForm/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerForm","type":"enum"}},{"name":"noSuchMethod","qualifiedName":"widgets.BrightnessChangerForm.noSuchMethod","href":"widgets/BrightnessChangerForm/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerForm","type":"enum"}},{"name":"runtimeType","qualifiedName":"widgets.BrightnessChangerForm.runtimeType","href":"widgets/BrightnessChangerForm/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerForm","type":"enum"}},{"name":"toString","qualifiedName":"widgets.BrightnessChangerForm.toString","href":"widgets/BrightnessChangerForm/toString.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerForm","type":"enum"}},{"name":"BrightnessChangerState","qualifiedName":"widgets.BrightnessChangerState","href":"widgets/BrightnessChangerState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"BrightnessChangerState","qualifiedName":"widgets.BrightnessChangerState.BrightnessChangerState","href":"widgets/BrightnessChangerState/BrightnessChangerState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerState","type":"class"}},{"name":"build","qualifiedName":"widgets.BrightnessChangerState.build","href":"widgets/BrightnessChangerState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerState","type":"class"}},{"name":"buttonToggle","qualifiedName":"widgets.BrightnessChangerState.buttonToggle","href":"widgets/BrightnessChangerState/buttonToggle.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerState","type":"class"}},{"name":"icon","qualifiedName":"widgets.BrightnessChangerState.icon","href":"widgets/BrightnessChangerState/icon.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerState","type":"class"}},{"name":"setBrightness","qualifiedName":"widgets.BrightnessChangerState.setBrightness","href":"widgets/BrightnessChangerState/setBrightness.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"BrightnessChangerState","type":"class"}},{"name":"CalendarTile","qualifiedName":"widgets.CalendarTile","href":"widgets/CalendarTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"CalendarTile","qualifiedName":"widgets.CalendarTile.CalendarTile","href":"widgets/CalendarTile/CalendarTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarTile","type":"class"}},{"name":"blank","qualifiedName":"widgets.CalendarTile.blank","href":"widgets/CalendarTile/blank-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarTile","type":"class"}},{"name":"build","qualifiedName":"widgets.CalendarTile.build","href":"widgets/CalendarTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"CalendarTile","type":"class"}},{"name":"date","qualifiedName":"widgets.CalendarTile.date","href":"widgets/CalendarTile/date.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarTile","type":"class"}},{"name":"day","qualifiedName":"widgets.CalendarTile.day","href":"widgets/CalendarTile/day.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"CalendarTile","type":"class"}},{"name":"ClassList","qualifiedName":"widgets.ClassList","href":"widgets/ClassList-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ClassList","qualifiedName":"widgets.ClassList.ClassList","href":"widgets/ClassList/ClassList.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"build","qualifiedName":"widgets.ClassList.build","href":"widgets/ClassList/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"day","qualifiedName":"widgets.ClassList.day","href":"widgets/ClassList/day.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"getPanel","qualifiedName":"widgets.ClassList.getPanel","href":"widgets/ClassList/getPanel.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"headerText","qualifiedName":"widgets.ClassList.headerText","href":"widgets/ClassList/headerText.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"periods","qualifiedName":"widgets.ClassList.periods","href":"widgets/ClassList/periods.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassList","type":"class"}},{"name":"ClassPanel","qualifiedName":"widgets.ClassPanel","href":"widgets/ClassPanel-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ClassPanel","qualifiedName":"widgets.ClassPanel.ClassPanel","href":"widgets/ClassPanel/ClassPanel.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"activity","qualifiedName":"widgets.ClassPanel.activity","href":"widgets/ClassPanel/activity.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"build","qualifiedName":"widgets.ClassPanel.build","href":"widgets/ClassPanel/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"children","qualifiedName":"widgets.ClassPanel.children","href":"widgets/ClassPanel/children.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"reminders","qualifiedName":"widgets.ClassPanel.reminders","href":"widgets/ClassPanel/reminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"title","qualifiedName":"widgets.ClassPanel.title","href":"widgets/ClassPanel/title.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ClassPanel","type":"class"}},{"name":"Footer","qualifiedName":"widgets.Footer","href":"widgets/Footer-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"Footer","qualifiedName":"widgets.Footer.Footer","href":"widgets/Footer/Footer.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Footer","type":"class"}},{"name":"build","qualifiedName":"widgets.Footer.build","href":"widgets/Footer/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"Footer","type":"class"}},{"name":"textScale","qualifiedName":"widgets.Footer.textScale","href":"widgets/Footer/textScale-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Footer","type":"class"}},{"name":"LayoutInfo","qualifiedName":"widgets.LayoutInfo","href":"widgets/LayoutInfo-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"operator ==","qualifiedName":"widgets.LayoutInfo.==","href":"widgets/LayoutInfo/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"LayoutInfo","qualifiedName":"widgets.LayoutInfo.LayoutInfo","href":"widgets/LayoutInfo/LayoutInfo.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"hasBottomNavBar","qualifiedName":"widgets.LayoutInfo.hasBottomNavBar","href":"widgets/LayoutInfo/hasBottomNavBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"hasNavRail","qualifiedName":"widgets.LayoutInfo.hasNavRail","href":"widgets/LayoutInfo/hasNavRail.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"hasStandardDrawer","qualifiedName":"widgets.LayoutInfo.hasStandardDrawer","href":"widgets/LayoutInfo/hasStandardDrawer.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"hasStandardSideSheet","qualifiedName":"widgets.LayoutInfo.hasStandardSideSheet","href":"widgets/LayoutInfo/hasStandardSideSheet.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"hashCode","qualifiedName":"widgets.LayoutInfo.hashCode","href":"widgets/LayoutInfo/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"isDesktop","qualifiedName":"widgets.LayoutInfo.isDesktop","href":"widgets/LayoutInfo/isDesktop.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"isMobile","qualifiedName":"widgets.LayoutInfo.isMobile","href":"widgets/LayoutInfo/isMobile.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"isTabletLandscape","qualifiedName":"widgets.LayoutInfo.isTabletLandscape","href":"widgets/LayoutInfo/isTabletLandscape.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"isTabletPortrait","qualifiedName":"widgets.LayoutInfo.isTabletPortrait","href":"widgets/LayoutInfo/isTabletPortrait.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"noSuchMethod","qualifiedName":"widgets.LayoutInfo.noSuchMethod","href":"widgets/LayoutInfo/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"runtimeType","qualifiedName":"widgets.LayoutInfo.runtimeType","href":"widgets/LayoutInfo/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"toString","qualifiedName":"widgets.LayoutInfo.toString","href":"widgets/LayoutInfo/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"windowType","qualifiedName":"widgets.LayoutInfo.windowType","href":"widgets/LayoutInfo/windowType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LayoutInfo","type":"class"}},{"name":"LinkIcon","qualifiedName":"widgets.LinkIcon","href":"widgets/LinkIcon-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"LinkIcon","qualifiedName":"widgets.LinkIcon.LinkIcon","href":"widgets/LinkIcon/LinkIcon.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LinkIcon","type":"class"}},{"name":"build","qualifiedName":"widgets.LinkIcon.build","href":"widgets/LinkIcon/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LinkIcon","type":"class"}},{"name":"path","qualifiedName":"widgets.LinkIcon.path","href":"widgets/LinkIcon/path.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LinkIcon","type":"class"}},{"name":"url","qualifiedName":"widgets.LinkIcon.url","href":"widgets/LinkIcon/url.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LinkIcon","type":"class"}},{"name":"LoadingImage","qualifiedName":"widgets.LoadingImage","href":"widgets/LoadingImage-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"LoadingImage","qualifiedName":"widgets.LoadingImage.LoadingImage","href":"widgets/LoadingImage/LoadingImage.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImage","type":"class"}},{"name":"aspectRatio","qualifiedName":"widgets.LoadingImage.aspectRatio","href":"widgets/LoadingImage/aspectRatio.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImage","type":"class"}},{"name":"createState","qualifiedName":"widgets.LoadingImage.createState","href":"widgets/LoadingImage/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoadingImage","type":"class"}},{"name":"image","qualifiedName":"widgets.LoadingImage.image","href":"widgets/LoadingImage/image.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImage","type":"class"}},{"name":"LoadingImageState","qualifiedName":"widgets.LoadingImageState","href":"widgets/LoadingImageState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"LoadingImageState","qualifiedName":"widgets.LoadingImageState.LoadingImageState","href":"widgets/LoadingImageState/LoadingImageState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"aspectRatio","qualifiedName":"widgets.LoadingImageState.aspectRatio","href":"widgets/LoadingImageState/aspectRatio.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"build","qualifiedName":"widgets.LoadingImageState.build","href":"widgets/LoadingImageState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"dispose","qualifiedName":"widgets.LoadingImageState.dispose","href":"widgets/LoadingImageState/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"initState","qualifiedName":"widgets.LoadingImageState.initState","href":"widgets/LoadingImageState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"listener","qualifiedName":"widgets.LoadingImageState.listener","href":"widgets/LoadingImageState/listener.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"loading","qualifiedName":"widgets.LoadingImageState.loading","href":"widgets/LoadingImageState/loading.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"onLoad","qualifiedName":"widgets.LoadingImageState.onLoad","href":"widgets/LoadingImageState/onLoad.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"stream","qualifiedName":"widgets.LoadingImageState.stream","href":"widgets/LoadingImageState/stream.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"LoadingImageState","type":"class"}},{"name":"Logos","qualifiedName":"widgets.Logos","href":"widgets/Logos-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"operator ==","qualifiedName":"widgets.Logos.==","href":"widgets/Logos/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"Logos","qualifiedName":"widgets.Logos.Logos","href":"widgets/Logos/Logos.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"drive","qualifiedName":"widgets.Logos.drive","href":"widgets/Logos/drive-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"google","qualifiedName":"widgets.Logos.google","href":"widgets/Logos/google-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"hashCode","qualifiedName":"widgets.Logos.hashCode","href":"widgets/Logos/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"noSuchMethod","qualifiedName":"widgets.Logos.noSuchMethod","href":"widgets/Logos/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"outlook","qualifiedName":"widgets.Logos.outlook","href":"widgets/Logos/outlook-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"ramazIcon","qualifiedName":"widgets.Logos.ramazIcon","href":"widgets/Logos/ramazIcon-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"runtimeType","qualifiedName":"widgets.Logos.runtimeType","href":"widgets/Logos/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"schoology","qualifiedName":"widgets.Logos.schoology","href":"widgets/Logos/schoology-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"seniorSystems","qualifiedName":"widgets.Logos.seniorSystems","href":"widgets/Logos/seniorSystems-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"toString","qualifiedName":"widgets.Logos.toString","href":"widgets/Logos/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"Logos","type":"class"}},{"name":"ModelBuilder","qualifiedName":"widgets.ModelBuilder","href":"widgets/ModelBuilder.html","type":"typedef","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ModelListener","qualifiedName":"widgets.ModelListener","href":"widgets/ModelListener-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ModelListener","qualifiedName":"widgets.ModelListener.ModelListener","href":"widgets/ModelListener/ModelListener.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"builder","qualifiedName":"widgets.ModelListener.builder","href":"widgets/ModelListener/builder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"child","qualifiedName":"widgets.ModelListener.child","href":"widgets/ModelListener/child.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"createState","qualifiedName":"widgets.ModelListener.createState","href":"widgets/ModelListener/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"dispose","qualifiedName":"widgets.ModelListener.dispose","href":"widgets/ModelListener/dispose.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"model","qualifiedName":"widgets.ModelListener.model","href":"widgets/ModelListener/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListener","type":"class"}},{"name":"ModelListenerState","qualifiedName":"widgets.ModelListenerState","href":"widgets/ModelListenerState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ModelListenerState","qualifiedName":"widgets.ModelListenerState.ModelListenerState","href":"widgets/ModelListenerState/ModelListenerState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"build","qualifiedName":"widgets.ModelListenerState.build","href":"widgets/ModelListenerState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"dispose","qualifiedName":"widgets.ModelListenerState.dispose","href":"widgets/ModelListenerState/dispose.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"initState","qualifiedName":"widgets.ModelListenerState.initState","href":"widgets/ModelListenerState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"listener","qualifiedName":"widgets.ModelListenerState.listener","href":"widgets/ModelListenerState/listener.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"model","qualifiedName":"widgets.ModelListenerState.model","href":"widgets/ModelListenerState/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ModelListenerState","type":"class"}},{"name":"NavigationItem","qualifiedName":"widgets.NavigationItem","href":"widgets/NavigationItem-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"NavigationItem","qualifiedName":"widgets.NavigationItem.NavigationItem","href":"widgets/NavigationItem/NavigationItem.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"appBar","qualifiedName":"widgets.NavigationItem.appBar","href":"widgets/NavigationItem/appBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"bottomNavBar","qualifiedName":"widgets.NavigationItem.bottomNavBar","href":"widgets/NavigationItem/bottomNavBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"floatingActionButton","qualifiedName":"widgets.NavigationItem.floatingActionButton","href":"widgets/NavigationItem/floatingActionButton.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"floatingActionButtonLocation","qualifiedName":"widgets.NavigationItem.floatingActionButtonLocation","href":"widgets/NavigationItem/floatingActionButtonLocation.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"icon","qualifiedName":"widgets.NavigationItem.icon","href":"widgets/NavigationItem/icon.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"label","qualifiedName":"widgets.NavigationItem.label","href":"widgets/NavigationItem/label.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"navRail","qualifiedName":"widgets.NavigationItem.navRail","href":"widgets/NavigationItem/navRail.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"sideSheet","qualifiedName":"widgets.NavigationItem.sideSheet","href":"widgets/NavigationItem/sideSheet.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NavigationItem","type":"class"}},{"name":"NextClass","qualifiedName":"widgets.NextClass","href":"widgets/NextClass-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"NextClass","qualifiedName":"widgets.NextClass.NextClass","href":"widgets/NextClass/NextClass.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"build","qualifiedName":"widgets.NextClass.build","href":"widgets/NextClass/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"next","qualifiedName":"widgets.NextClass.next","href":"widgets/NextClass/next.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"period","qualifiedName":"widgets.NextClass.period","href":"widgets/NextClass/period.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"reminders","qualifiedName":"widgets.NextClass.reminders","href":"widgets/NextClass/reminders.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"subject","qualifiedName":"widgets.NextClass.subject","href":"widgets/NextClass/subject.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"NextClass","type":"class"}},{"name":"PeriodTile","qualifiedName":"widgets.PeriodTile","href":"widgets/PeriodTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"PeriodTile","qualifiedName":"widgets.PeriodTile.PeriodTile","href":"widgets/PeriodTile/PeriodTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"activity","qualifiedName":"widgets.PeriodTile.activity","href":"widgets/PeriodTile/activity.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"build","qualifiedName":"widgets.PeriodTile.build","href":"widgets/PeriodTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"end","qualifiedName":"widgets.PeriodTile.end","href":"widgets/PeriodTile/end.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"getRange","qualifiedName":"widgets.PeriodTile.getRange","href":"widgets/PeriodTile/getRange.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"index","qualifiedName":"widgets.PeriodTile.index","href":"widgets/PeriodTile/index.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"model","qualifiedName":"widgets.PeriodTile.model","href":"widgets/PeriodTile/model.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"range","qualifiedName":"widgets.PeriodTile.range","href":"widgets/PeriodTile/range.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"start","qualifiedName":"widgets.PeriodTile.start","href":"widgets/PeriodTile/start.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"PeriodTile","type":"class"}},{"name":"RamazLogos","qualifiedName":"widgets.RamazLogos","href":"widgets/RamazLogos-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"operator ==","qualifiedName":"widgets.RamazLogos.==","href":"widgets/RamazLogos/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"RamazLogos","qualifiedName":"widgets.RamazLogos.RamazLogos","href":"widgets/RamazLogos/RamazLogos.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"hashCode","qualifiedName":"widgets.RamazLogos.hashCode","href":"widgets/RamazLogos/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"noSuchMethod","qualifiedName":"widgets.RamazLogos.noSuchMethod","href":"widgets/RamazLogos/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"ramRectangle","qualifiedName":"widgets.RamazLogos.ramRectangle","href":"widgets/RamazLogos/ramRectangle-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"ramSquare","qualifiedName":"widgets.RamazLogos.ramSquare","href":"widgets/RamazLogos/ramSquare-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"ramSquareWords","qualifiedName":"widgets.RamazLogos.ramSquareWords","href":"widgets/RamazLogos/ramSquareWords-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"runtimeType","qualifiedName":"widgets.RamazLogos.runtimeType","href":"widgets/RamazLogos/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"teal","qualifiedName":"widgets.RamazLogos.teal","href":"widgets/RamazLogos/teal-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"toString","qualifiedName":"widgets.RamazLogos.toString","href":"widgets/RamazLogos/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"RamazLogos","type":"class"}},{"name":"ReminderTile","qualifiedName":"widgets.ReminderTile","href":"widgets/ReminderTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ReminderTile","qualifiedName":"widgets.ReminderTile.ReminderTile","href":"widgets/ReminderTile/ReminderTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTile","type":"class"}},{"name":"build","qualifiedName":"widgets.ReminderTile.build","href":"widgets/ReminderTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ReminderTile","type":"class"}},{"name":"height","qualifiedName":"widgets.ReminderTile.height","href":"widgets/ReminderTile/height.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTile","type":"class"}},{"name":"index","qualifiedName":"widgets.ReminderTile.index","href":"widgets/ReminderTile/index.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ReminderTile","type":"class"}},{"name":"ResponsiveBuilder","qualifiedName":"widgets.ResponsiveBuilder","href":"widgets/ResponsiveBuilder-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ResponsiveBuilder","qualifiedName":"widgets.ResponsiveBuilder.ResponsiveBuilder","href":"widgets/ResponsiveBuilder/ResponsiveBuilder.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveBuilder","type":"class"}},{"name":"build","qualifiedName":"widgets.ResponsiveBuilder.build","href":"widgets/ResponsiveBuilder/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveBuilder","type":"class"}},{"name":"builder","qualifiedName":"widgets.ResponsiveBuilder.builder","href":"widgets/ResponsiveBuilder/builder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveBuilder","type":"class"}},{"name":"child","qualifiedName":"widgets.ResponsiveBuilder.child","href":"widgets/ResponsiveBuilder/child.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveBuilder","type":"class"}},{"name":"ResponsiveScaffold","qualifiedName":"widgets.ResponsiveScaffold","href":"widgets/ResponsiveScaffold-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ResponsiveScaffold","qualifiedName":"widgets.ResponsiveScaffold.ResponsiveScaffold","href":"widgets/ResponsiveScaffold/ResponsiveScaffold.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"appBar","qualifiedName":"widgets.ResponsiveScaffold.appBar","href":"widgets/ResponsiveScaffold/appBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"bodyBuilder","qualifiedName":"widgets.ResponsiveScaffold.bodyBuilder","href":"widgets/ResponsiveScaffold/bodyBuilder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"build","qualifiedName":"widgets.ResponsiveScaffold.build","href":"widgets/ResponsiveScaffold/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"drawer","qualifiedName":"widgets.ResponsiveScaffold.drawer","href":"widgets/ResponsiveScaffold/drawer.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"floatingActionButton","qualifiedName":"widgets.ResponsiveScaffold.floatingActionButton","href":"widgets/ResponsiveScaffold/floatingActionButton.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"floatingActionButtonLocation","qualifiedName":"widgets.ResponsiveScaffold.floatingActionButtonLocation","href":"widgets/ResponsiveScaffold/floatingActionButtonLocation.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"hasNavBar","qualifiedName":"widgets.ResponsiveScaffold.hasNavBar","href":"widgets/ResponsiveScaffold/hasNavBar.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"ResponsiveScaffold.navBar","qualifiedName":"widgets.ResponsiveScaffold.navBar","href":"widgets/ResponsiveScaffold/ResponsiveScaffold.navBar.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"navIndex","qualifiedName":"widgets.ResponsiveScaffold.navIndex","href":"widgets/ResponsiveScaffold/navIndex.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"navItems","qualifiedName":"widgets.ResponsiveScaffold.navItems","href":"widgets/ResponsiveScaffold/navItems.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"onNavIndexChanged","qualifiedName":"widgets.ResponsiveScaffold.onNavIndexChanged","href":"widgets/ResponsiveScaffold/onNavIndexChanged.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"secondaryDrawer","qualifiedName":"widgets.ResponsiveScaffold.secondaryDrawer","href":"widgets/ResponsiveScaffold/secondaryDrawer.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"sideSheet","qualifiedName":"widgets.ResponsiveScaffold.sideSheet","href":"widgets/ResponsiveScaffold/sideSheet.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ResponsiveScaffold","type":"class"}},{"name":"ResponsiveWidgetBuilder","qualifiedName":"widgets.ResponsiveWidgetBuilder","href":"widgets/ResponsiveWidgetBuilder.html","type":"typedef","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ScoreUpdaterState","qualifiedName":"widgets.ScoreUpdaterState","href":"widgets/ScoreUpdaterState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ScoreUpdaterState","qualifiedName":"widgets.ScoreUpdaterState.ScoreUpdaterState","href":"widgets/ScoreUpdaterState/ScoreUpdaterState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"build","qualifiedName":"widgets.ScoreUpdaterState.build","href":"widgets/ScoreUpdaterState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"initState","qualifiedName":"widgets.ScoreUpdaterState.initState","href":"widgets/ScoreUpdaterState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"otherController","qualifiedName":"widgets.ScoreUpdaterState.otherController","href":"widgets/ScoreUpdaterState/otherController.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"otherScore","qualifiedName":"widgets.ScoreUpdaterState.otherScore","href":"widgets/ScoreUpdaterState/otherScore.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"ramazController","qualifiedName":"widgets.ScoreUpdaterState.ramazController","href":"widgets/ScoreUpdaterState/ramazController.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"ramazScore","qualifiedName":"widgets.ScoreUpdaterState.ramazScore","href":"widgets/ScoreUpdaterState/ramazScore.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"ready","qualifiedName":"widgets.ScoreUpdaterState.ready","href":"widgets/ScoreUpdaterState/ready.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"scores","qualifiedName":"widgets.ScoreUpdaterState.scores","href":"widgets/ScoreUpdaterState/scores.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ScoreUpdaterState","type":"class"}},{"name":"SpecialTile","qualifiedName":"widgets.SpecialTile","href":"widgets/SpecialTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"SpecialTile","qualifiedName":"widgets.SpecialTile.SpecialTile","href":"widgets/SpecialTile/SpecialTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SpecialTile","type":"class"}},{"name":"build","qualifiedName":"widgets.SpecialTile.build","href":"widgets/SpecialTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SpecialTile","type":"class"}},{"name":"child","qualifiedName":"widgets.SpecialTile.child","href":"widgets/SpecialTile/child.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SpecialTile","type":"class"}},{"name":"SportsIcons","qualifiedName":"widgets.SportsIcons","href":"widgets/SportsIcons-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"operator ==","qualifiedName":"widgets.SportsIcons.==","href":"widgets/SportsIcons/operator_equals.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"SportsIcons","qualifiedName":"widgets.SportsIcons.SportsIcons","href":"widgets/SportsIcons/SportsIcons.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"baseball","qualifiedName":"widgets.SportsIcons.baseball","href":"widgets/SportsIcons/baseball-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"basketball","qualifiedName":"widgets.SportsIcons.basketball","href":"widgets/SportsIcons/basketball-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"hashCode","qualifiedName":"widgets.SportsIcons.hashCode","href":"widgets/SportsIcons/hashCode.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"hockey","qualifiedName":"widgets.SportsIcons.hockey","href":"widgets/SportsIcons/hockey-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"noSuchMethod","qualifiedName":"widgets.SportsIcons.noSuchMethod","href":"widgets/SportsIcons/noSuchMethod.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"runtimeType","qualifiedName":"widgets.SportsIcons.runtimeType","href":"widgets/SportsIcons/runtimeType.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"soccer","qualifiedName":"widgets.SportsIcons.soccer","href":"widgets/SportsIcons/soccer-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"tennis","qualifiedName":"widgets.SportsIcons.tennis","href":"widgets/SportsIcons/tennis-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"toString","qualifiedName":"widgets.SportsIcons.toString","href":"widgets/SportsIcons/toString.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"volleyball","qualifiedName":"widgets.SportsIcons.volleyball","href":"widgets/SportsIcons/volleyball-constant.html","type":"constant","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsIcons","type":"class"}},{"name":"SportsScoreUpdater","qualifiedName":"widgets.SportsScoreUpdater","href":"widgets/SportsScoreUpdater-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"SportsScoreUpdater","qualifiedName":"widgets.SportsScoreUpdater.SportsScoreUpdater","href":"widgets/SportsScoreUpdater/SportsScoreUpdater.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsScoreUpdater","type":"class"}},{"name":"createState","qualifiedName":"widgets.SportsScoreUpdater.createState","href":"widgets/SportsScoreUpdater/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsScoreUpdater","type":"class"}},{"name":"game","qualifiedName":"widgets.SportsScoreUpdater.game","href":"widgets/SportsScoreUpdater/game.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsScoreUpdater","type":"class"}},{"name":"updateScores","qualifiedName":"widgets.SportsScoreUpdater.updateScores","href":"widgets/SportsScoreUpdater/updateScores.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsScoreUpdater","type":"class"}},{"name":"SportsStats","qualifiedName":"widgets.SportsStats","href":"widgets/SportsStats-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"SportsStats","qualifiedName":"widgets.SportsStats.SportsStats","href":"widgets/SportsStats/SportsStats.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsStats","type":"class"}},{"name":"build","qualifiedName":"widgets.SportsStats.build","href":"widgets/SportsStats/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsStats","type":"class"}},{"name":"dateTime","qualifiedName":"widgets.SportsStats.dateTime","href":"widgets/SportsStats/dateTime.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsStats","type":"class"}},{"name":"score","qualifiedName":"widgets.SportsStats.score","href":"widgets/SportsStats/score.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsStats","type":"class"}},{"name":"team","qualifiedName":"widgets.SportsStats.team","href":"widgets/SportsStats/team.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsStats","type":"class"}},{"name":"SportsTile","qualifiedName":"widgets.SportsTile","href":"widgets/SportsTile-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"SportsTile","qualifiedName":"widgets.SportsTile.SportsTile","href":"widgets/SportsTile/SportsTile.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"build","qualifiedName":"widgets.SportsTile.build","href":"widgets/SportsTile/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"cardColor","qualifiedName":"widgets.SportsTile.cardColor","href":"widgets/SportsTile/cardColor.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"formatDate","qualifiedName":"widgets.SportsTile.formatDate","href":"widgets/SportsTile/formatDate.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"game","qualifiedName":"widgets.SportsTile.game","href":"widgets/SportsTile/game.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"icon","qualifiedName":"widgets.SportsTile.icon","href":"widgets/SportsTile/icon.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"onTap","qualifiedName":"widgets.SportsTile.onTap","href":"widgets/SportsTile/onTap.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"padLength","qualifiedName":"widgets.SportsTile.padLength","href":"widgets/SportsTile/padLength.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"SportsTile","type":"class"}},{"name":"ThemeBuilder","qualifiedName":"widgets.ThemeBuilder","href":"widgets/ThemeBuilder.html","type":"typedef","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ThemeChanger","qualifiedName":"widgets.ThemeChanger","href":"widgets/ThemeChanger-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ThemeChanger","qualifiedName":"widgets.ThemeChanger.ThemeChanger","href":"widgets/ThemeChanger/ThemeChanger.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"builder","qualifiedName":"widgets.ThemeChanger.builder","href":"widgets/ThemeChanger/builder.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"createState","qualifiedName":"widgets.ThemeChanger.createState","href":"widgets/ThemeChanger/createState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"dark","qualifiedName":"widgets.ThemeChanger.dark","href":"widgets/ThemeChanger/dark.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"defaultBrightness","qualifiedName":"widgets.ThemeChanger.defaultBrightness","href":"widgets/ThemeChanger/defaultBrightness.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"light","qualifiedName":"widgets.ThemeChanger.light","href":"widgets/ThemeChanger/light.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"of","qualifiedName":"widgets.ThemeChanger.of","href":"widgets/ThemeChanger/of.html","type":"method","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"themes","qualifiedName":"widgets.ThemeChanger.themes","href":"widgets/ThemeChanger/themes.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChanger","type":"class"}},{"name":"ThemeChangerState","qualifiedName":"widgets.ThemeChangerState","href":"widgets/ThemeChangerState-class.html","type":"class","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"ThemeChangerState","qualifiedName":"widgets.ThemeChangerState.ThemeChangerState","href":"widgets/ThemeChangerState/ThemeChangerState.html","type":"constructor","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"brightness","qualifiedName":"widgets.ThemeChangerState.brightness","href":"widgets/ThemeChangerState/brightness.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"build","qualifiedName":"widgets.ThemeChangerState.build","href":"widgets/ThemeChangerState/build.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"initState","qualifiedName":"widgets.ThemeChangerState.initState","href":"widgets/ThemeChangerState/initState.html","type":"method","overriddenDepth":1,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"theme","qualifiedName":"widgets.ThemeChangerState.theme","href":"widgets/ThemeChangerState/theme.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"themeName","qualifiedName":"widgets.ThemeChangerState.themeName","href":"widgets/ThemeChangerState/themeName.html","type":"property","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"ThemeChangerState","type":"class"}},{"name":"caseConverter","qualifiedName":"widgets.caseConverter","href":"widgets/caseConverter.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}},{"name":"pickDate","qualifiedName":"widgets.pickDate","href":"widgets/pickDate.html","type":"function","overriddenDepth":0,"packageName":"ramaz","enclosedBy":{"name":"widgets","type":"library"}}] diff --git a/docs/main/main-library.html b/docs/main/main-library.html deleted file mode 100644 index 51a646387..000000000 --- a/docs/main/main-library.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - main library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              main
              - -
              - -
              - - - - -
              -
              - -

              main library - Null safety - -

              - - - - - - - - - -
              -

              Functions

              - -
              -
              - main() - → void - - - -
              -
              - - - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/main/main.html b/docs/main/main.html deleted file mode 100644 index e441fd6f0..000000000 --- a/docs/main/main.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - main function - main library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              main
              - -
              - -
              - - - - -
              -
              - -

              main function - Null safety - -

              - -
              - - -void -main() - -
              - - - - -
              -

              Implementation

              -
              void main() => runApp(const RamLife());
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/AdminScheduleModel-class.html b/docs/models/AdminScheduleModel-class.html deleted file mode 100644 index 6c9fbfe22..000000000 --- a/docs/models/AdminScheduleModel-class.html +++ /dev/null @@ -1,399 +0,0 @@ - - - - - - - - AdminScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              AdminScheduleModel
              - -
              - -
              - - - - -
              -
              - -

              AdminScheduleModel class - Null safety - -

              - - - - -
              -
              - - -
              Mixed in types
              -
              - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - AdminScheduleModel() -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - jsonSchedules - → List<Map> - -
              -
              - -
              read-only
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - schedules - → List<Schedule> - -
              -
              - -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - createSchedule(Schedule schedule) - → Future<void> - - - -
              -
              - - - -
              - -
              - deleteSchedule(Schedule schedule) - → Future<void> - - - -
              -
              - - - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              @mustCallSuper, inherited
              - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - saveSchedules() - → Future<void> - - - -
              -
              - - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/AdminScheduleModel/AdminScheduleModel.html b/docs/models/AdminScheduleModel/AdminScheduleModel.html deleted file mode 100644 index 04e18b077..000000000 --- a/docs/models/AdminScheduleModel/AdminScheduleModel.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - AdminScheduleModel constructor - AdminScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              AdminScheduleModel
              - -
              - -
              - - - - -
              -
              - -

              AdminScheduleModel constructor - Null safety -

              - -
              - AdminScheduleModel() -
              - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/AdminScheduleModel/createSchedule.html b/docs/models/AdminScheduleModel/createSchedule.html deleted file mode 100644 index 20bed8c22..000000000 --- a/docs/models/AdminScheduleModel/createSchedule.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - createSchedule method - AdminScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              createSchedule
              - -
              - -
              - - - - -
              -
              - -

              createSchedule method - Null safety -

              - -
              - - -Future<void> -createSchedule(
              1. Schedule schedule
              2. -
              ) - - - -
              - - - - -
              -

              Implementation

              -
              Future<void> createSchedule(Schedule schedule) async {
              -	schedules.add(schedule);
              -	return saveSchedules();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/AdminScheduleModel/deleteSchedule.html b/docs/models/AdminScheduleModel/deleteSchedule.html deleted file mode 100644 index 8d2a732bb..000000000 --- a/docs/models/AdminScheduleModel/deleteSchedule.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - deleteSchedule method - AdminScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              deleteSchedule
              - -
              - -
              - - - - -
              -
              - -

              deleteSchedule method - Null safety -

              - -
              - - -Future<void> -deleteSchedule(
              1. Schedule schedule
              2. -
              ) - - - -
              - - - - -
              -

              Implementation

              -
              Future<void> deleteSchedule(Schedule schedule) async {
              -	schedules.removeWhere(
              -		(Schedule other) => other.name == schedule.name
              -	);
              -	return saveSchedules();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/AdminScheduleModel/jsonSchedules.html b/docs/models/AdminScheduleModel/jsonSchedules.html deleted file mode 100644 index d192eee7c..000000000 --- a/docs/models/AdminScheduleModel/jsonSchedules.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - jsonSchedules property - AdminScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              jsonSchedules
              - -
              - -
              - - - - -
              -
              - -

              jsonSchedules property - Null safety -

              - - - -
              - -
              - List<Map> - jsonSchedules - - -
              - - - - -
              -

              Implementation

              -
              List<Map> get jsonSchedules => [
              -	for (final Schedule schedule in schedules)
              -		schedule.toJson()
              -];
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/AdminScheduleModel/saveSchedules.html b/docs/models/AdminScheduleModel/saveSchedules.html deleted file mode 100644 index b094cc150..000000000 --- a/docs/models/AdminScheduleModel/saveSchedules.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - saveSchedules method - AdminScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              saveSchedules
              - -
              - -
              - - - - -
              -
              - -

              saveSchedules method - Null safety -

              - -
              - - -Future<void> -saveSchedules() - - - -
              - - - - -
              -

              Implementation

              -
              Future<void> saveSchedules() async {
              -	await Services.instance.database.saveSchedules(jsonSchedules);
              -	Schedule.schedules = schedules;
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/AdminScheduleModel/schedules.html b/docs/models/AdminScheduleModel/schedules.html deleted file mode 100644 index 46efdec23..000000000 --- a/docs/models/AdminScheduleModel/schedules.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - schedules property - AdminScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schedules
              - -
              - -
              - - - - -
              -
              - -

              schedules property - Null safety -

              - -
              - List<Schedule> - schedules -
              final
              - -
              - - - -
              -

              Implementation

              -
              final List<Schedule> schedules = Schedule.schedules;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarDay-class.html b/docs/models/CalendarDay-class.html deleted file mode 100644 index f0ce4d7b3..000000000 --- a/docs/models/CalendarDay-class.html +++ /dev/null @@ -1,272 +0,0 @@ - - - - - - - - CalendarDay class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              CalendarDay
              - -
              - -
              - - - - -
              -
              - -

              CalendarDay class - Null safety - -

              - - - - - -
              -

              Constructors

              - -
              -
              - CalendarDay({required DateTime date, required Day? schoolDay}) -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - date - → DateTime - -
              -
              - -
              final
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - schoolDay - Day? - -
              -
              - -
              read / write
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarDay/CalendarDay.html b/docs/models/CalendarDay/CalendarDay.html deleted file mode 100644 index 16fafcccf..000000000 --- a/docs/models/CalendarDay/CalendarDay.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - CalendarDay constructor - CalendarDay class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              CalendarDay
              - -
              - -
              - - - - -
              -
              - -

              CalendarDay constructor - Null safety -

              - -
              - CalendarDay(
              1. {required DateTime date,
              2. -
              3. required Day? schoolDay}
              4. -
              ) -
              - - - - - -
              -

              Implementation

              -
              CalendarDay({required this.date, required this.schoolDay});
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarDay/date.html b/docs/models/CalendarDay/date.html deleted file mode 100644 index 4bb40558c..000000000 --- a/docs/models/CalendarDay/date.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - date property - CalendarDay class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              date
              - -
              - -
              - - - - -
              -
              - -

              date property - Null safety -

              - -
              - DateTime - date -
              final
              - -
              - - - -
              -

              Implementation

              -
              final DateTime date;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarDay/hashCode.html b/docs/models/CalendarDay/hashCode.html deleted file mode 100644 index 5cb1ac73d..000000000 --- a/docs/models/CalendarDay/hashCode.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - hashCode property - CalendarDay class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hashCode
              - -
              - -
              - - - - -
              -
              -

              hashCode property - Null safety -

              - - - -
              - -
              - int - hashCode -
              inherited
              - -
              - - -
              -

              The hash code for this object.

              -

              A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

              -

              All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

              -

              If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

              -

              Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

              -

              Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

              -

              If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

              -
              - - -
              -

              Implementation

              -
              external int get hashCode;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarDay/noSuchMethod.html b/docs/models/CalendarDay/noSuchMethod.html deleted file mode 100644 index 6bceafbdb..000000000 --- a/docs/models/CalendarDay/noSuchMethod.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - noSuchMethod method - CalendarDay class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              noSuchMethod
              - -
              - -
              - - - - -
              -
              -

              noSuchMethod method - Null safety -

              - -
              - - -dynamic -noSuchMethod(
              1. Invocation invocation
              2. -
              ) - -
              inherited
              - -
              - -
              -

              Invoked when a non-existent method or property is accessed.

              -

              A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

              -
              dynamic object = 1;
              -object.add(42); // Statically allowed, run-time error
              -
              -

              This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

              -

              Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

              -

              A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

              -
              class MockList<T> implements List<T> {
              -  noSuchMethod(Invocation invocation) {
              -    log(invocation);
              -    super.noSuchMethod(invocation); // Will throw.
              -  }
              -}
              -void main() {
              -  MockList().add(42);
              -}
              -
              -

              This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

              -

              If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

              -

              The default behavior is to throw a NoSuchMethodError.

              -
              - - - -
              -

              Implementation

              -
              @pragma("vm:entry-point")
              -external dynamic noSuchMethod(Invocation invocation);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarDay/operator_equals.html b/docs/models/CalendarDay/operator_equals.html deleted file mode 100644 index d6c9f2d90..000000000 --- a/docs/models/CalendarDay/operator_equals.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - operator == method - CalendarDay class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              operator ==
              - -
              - -
              - - - - -
              -
              -

              operator == method - Null safety -

              - -
              - - -bool -operator ==(
              1. Object other
              2. -
              ) - -
              inherited
              - -
              - -
              -

              The equality operator.

              -

              The default behavior for all Objects is to return true if and -only if this object and other are the same object.

              -

              Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

              -
                -
              • -

                Total: It must return a boolean for all arguments. It should never throw.

                -
              • -
              • -

                Reflexive: For all objects o, o == o must be true.

                -
              • -
              • -

                Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                -
              • -
              • -

                Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                -
              • -
              -

              The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

              -

              If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

              -
              - - - -
              -

              Implementation

              -
              external bool operator ==(Object other);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarDay/runtimeType.html b/docs/models/CalendarDay/runtimeType.html deleted file mode 100644 index 7575a730e..000000000 --- a/docs/models/CalendarDay/runtimeType.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - runtimeType property - CalendarDay class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              runtimeType
              - -
              - -
              - - - - -
              -
              -

              runtimeType property - Null safety -

              - - - -
              - -
              - Type - runtimeType -
              inherited
              - -
              - - -
              -

              A representation of the runtime type of the object.

              -
              - - -
              -

              Implementation

              -
              external Type get runtimeType;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarDay/schoolDay.html b/docs/models/CalendarDay/schoolDay.html deleted file mode 100644 index d81b36e4e..000000000 --- a/docs/models/CalendarDay/schoolDay.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - schoolDay property - CalendarDay class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schoolDay
              - -
              - -
              - - - - -
              -
              - -

              schoolDay property - Null safety -

              - -
              - Day? - schoolDay -
              read / write
              - -
              - - - -
              -

              Implementation

              -
              Day? schoolDay;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarDay/toString.html b/docs/models/CalendarDay/toString.html deleted file mode 100644 index e7b1318ed..000000000 --- a/docs/models/CalendarDay/toString.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - toString method - CalendarDay class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toString
              - -
              - -
              - - - - -
              -
              -

              toString method - Null safety -

              - -
              - - -String -toString() - -
              inherited
              - -
              - -
              -

              A string representation of this object.

              -

              Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

              -

              Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

              -
              - - - -
              -

              Implementation

              -
              external String toString();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor-class.html b/docs/models/CalendarEditor-class.html deleted file mode 100644 index 59accb86d..000000000 --- a/docs/models/CalendarEditor-class.html +++ /dev/null @@ -1,470 +0,0 @@ - - - - - - - - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              CalendarEditor
              - -
              - -
              - - - - -
              -
              - -

              CalendarEditor class - Null safety - -

              - - -
              -

              A model to manage the calendar.

              -

              This model listens to the calendar and can modify it in the database.

              -
              - - -
              -
              - - -
              Mixed in types
              -
              - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - CalendarEditor() -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - calendar - → List<List<CalendarDay?>?> - -
              -
              - The calendar filled with Days. [...] -
              final
              - -
              - -
              - daysInMonth - ↔ List<int?> - -
              -
              - How many days there are in every month. -
              read / write
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - subscriptions - → List<StreamSubscription?> - -
              -
              - A list of streams on the Firebase streams. -
              final
              - -
              - -
              - years - → List<int> - -
              -
              - The year of each month. [...] -
              final
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              override
              - -
              - -
              - layoutMonth(List<Day?> cal, int month) - → List<CalendarDay?> - - - -
              -
              - Fits the calendar to a 6-week layout. [...] - - -
              - -
              - loadMonth(int month) - → void - - - -
              -
              - - - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              - updateDay({required Day? day, required DateTime date}) - → Future<void> - - - -
              -
              - Updates the calendar. - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Static Properties

              - -
              -
              - currentMonth - → int - -
              -
              - The current month. -
              final
              - -
              - -
              - currentYear - → int - -
              -
              - The current year. -
              final
              - -
              - -
              - now - → DateTime - -
              -
              - The current date. -
              final
              - -
              - -
              -
              - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/CalendarEditor.html b/docs/models/CalendarEditor/CalendarEditor.html deleted file mode 100644 index 79a59f1bf..000000000 --- a/docs/models/CalendarEditor/CalendarEditor.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - CalendarEditor constructor - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              CalendarEditor
              - -
              - -
              - - - - -
              -
              - -

              CalendarEditor constructor - Null safety -

              - -
              - CalendarEditor() -
              - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/calendar.html b/docs/models/CalendarEditor/calendar.html deleted file mode 100644 index 03ff24980..000000000 --- a/docs/models/CalendarEditor/calendar.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - calendar property - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              calendar
              - -
              - -
              - - - - -
              -
              - -

              calendar property - Null safety -

              - -
              - List<List<CalendarDay?>?> - calendar -
              final
              - -
              - -
              -

              The calendar filled with Days.

              -

              Each month is lazy-loaded from the database, so it's null until selected.

              -
              - - -
              -

              Implementation

              -
              final List<List<CalendarDay?>?> calendar = List.filled(12, null);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/currentMonth.html b/docs/models/CalendarEditor/currentMonth.html deleted file mode 100644 index ea11beaa3..000000000 --- a/docs/models/CalendarEditor/currentMonth.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - currentMonth property - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              currentMonth
              - -
              - -
              - - - - -
              -
              - -

              currentMonth property - Null safety -

              - -
              - int - currentMonth -
              final
              - -
              - -
              -

              The current month.

              -
              - - -
              -

              Implementation

              -
              static final int currentMonth = now.month;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/currentYear.html b/docs/models/CalendarEditor/currentYear.html deleted file mode 100644 index da894435a..000000000 --- a/docs/models/CalendarEditor/currentYear.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - currentYear property - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              currentYear
              - -
              - -
              - - - - -
              -
              - -

              currentYear property - Null safety -

              - -
              - int - currentYear -
              final
              - -
              - -
              -

              The current year.

              -
              - - -
              -

              Implementation

              -
              static final int currentYear = now.year;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/daysInMonth.html b/docs/models/CalendarEditor/daysInMonth.html deleted file mode 100644 index 61ec7851a..000000000 --- a/docs/models/CalendarEditor/daysInMonth.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - daysInMonth property - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              daysInMonth
              - -
              - -
              - - - - -
              -
              - -

              daysInMonth property - Null safety -

              - -
              - List<int?> - daysInMonth -
              read / write
              - -
              - -
              -

              How many days there are in every month.

              -
              - - -
              -

              Implementation

              -
              List<int?> daysInMonth = List.filled(12, null);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/dispose.html b/docs/models/CalendarEditor/dispose.html deleted file mode 100644 index b6e882639..000000000 --- a/docs/models/CalendarEditor/dispose.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - dispose method - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              dispose
              - -
              - -
              - - - - -
              -
              - -

              dispose method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -void -dispose() - -
              override
              - -
              - -
              -

              Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed).

              -

              This method should only be called by the object's owner.

              -
              - - - -
              -

              Implementation

              -
              @override
              -void dispose() {
              -	for (final StreamSubscription? subscription in subscriptions) {
              -		subscription?.cancel();
              -	}
              -	super.dispose();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/layoutMonth.html b/docs/models/CalendarEditor/layoutMonth.html deleted file mode 100644 index d3f5ea2f8..000000000 --- a/docs/models/CalendarEditor/layoutMonth.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - layoutMonth method - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              layoutMonth
              - -
              - -
              - - - - -
              -
              - -

              layoutMonth method - Null safety -

              - -
              - - -List<CalendarDay?> -layoutMonth(
              1. List<Day?> cal,
              2. -
              3. int month
              4. -
              ) - - - -
              - -
              -

              Fits the calendar to a 6-week layout.

              -

              Adjusts the calendar so that it begins on the correct day of the week -(starting on Sunday) instead of defaulting to the first open cell on -the calendar grid. This function pads the calendar with the correct -amount of empty days before and after the month.

              -
              - - - -
              -

              Implementation

              -
              List<CalendarDay?> layoutMonth(List<Day?> cal, int month) {
              -	final int year = years [month];
              -	final int firstDayOfMonth = DateTime(year, month + 1, 1).weekday;
              -	final int weekday = firstDayOfMonth == 7 ? 0 : firstDayOfMonth;
              -	int weeks = 0;  // the number of sundays (except for the first week)
              -	if (firstDayOfMonth != 7) {  // First week doesn't have a sunday
              -		weeks++;
              -	}
              -	for (int date = 0; date < cal.length; date++) {
              -		if (DateTime(year, month + 1, date + 1).weekday == 7) {  // Sunday
              -			weeks++;
              -		}
              -	}
              -	final int leftPad = weekday;
              -	final int rightPad = (weeks * 7) - (weekday + cal.length);
              -	return [
              -		for (int _ = 0; _ < leftPad; _++) null,
              -		for (int date = 0; date < cal.length; date++) CalendarDay(
              -			date: DateTime(year, month + 1, date + 1),
              -			schoolDay: cal [date],
              -		),
              -		for (int _ = 0; _ < rightPad; _++) null,
              -	];
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/loadMonth.html b/docs/models/CalendarEditor/loadMonth.html deleted file mode 100644 index 7e35049de..000000000 --- a/docs/models/CalendarEditor/loadMonth.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - loadMonth method - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              loadMonth
              - -
              - -
              - - - - -
              -
              - -

              loadMonth method - Null safety -

              - -
              - - -void -loadMonth(
              1. int month
              2. -
              ) - - - -
              - - - - -
              -

              Implementation

              -
              void loadMonth(int month) => subscriptions [month] ??= Services
              -	.instance.database.cloudDatabase.getCalendarStream(month + 1)
              -	.listen(
              -		(List<Map?> cal) {
              -			calendar [month] = layoutMonth(
              -				[
              -					for (final Map? day in cal)
              -						day == null ? null : Day.fromJson(day),
              -				],
              -				month
              -			);
              -			notifyListeners();
              -		}
              -	);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/now.html b/docs/models/CalendarEditor/now.html deleted file mode 100644 index 707a0d800..000000000 --- a/docs/models/CalendarEditor/now.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - now property - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              now
              - -
              - -
              - - - - -
              -
              - -

              now property - Null safety -

              - -
              - DateTime - now -
              final
              - -
              - -
              -

              The current date.

              -
              - - -
              -

              Implementation

              -
              static final DateTime now = DateTime.now();
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/subscriptions.html b/docs/models/CalendarEditor/subscriptions.html deleted file mode 100644 index 8e26a681c..000000000 --- a/docs/models/CalendarEditor/subscriptions.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - subscriptions property - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              subscriptions
              - -
              - -
              - - - - -
              -
              - -

              subscriptions property - Null safety -

              - -
              - List<StreamSubscription?> - subscriptions -
              final
              - -
              - -
              -

              A list of streams on the Firebase streams.

              -
              - - -
              -

              Implementation

              -
              final List<StreamSubscription?> subscriptions = List.filled(12, null);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/updateDay.html b/docs/models/CalendarEditor/updateDay.html deleted file mode 100644 index 32c74b128..000000000 --- a/docs/models/CalendarEditor/updateDay.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - updateDay method - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              updateDay
              - -
              - -
              - - - - -
              -
              - -

              updateDay method - Null safety -

              - -
              - - -Future<void> -updateDay(
              1. {required Day? day,
              2. -
              3. required DateTime date}
              4. -
              ) - - - -
              - -
              -

              Updates the calendar.

              -
              - - - -
              -

              Implementation

              -
              Future<void> updateDay({required Day? day, required DateTime date}) async {
              -	final int index = calendar [date.month - 1]!
              -		.indexWhere((CalendarDay? day) => day != null);
              -	calendar [date.month - 1]! [index + date.day - 1]!.schoolDay = day;
              -	await Services.instance.database.setCalendar(
              -		date.month,
              -		{
              -			"calendar": [
              -				for (final CalendarDay? day in calendar [date.month - 1]!)
              -					if (day != null)
              -						day.schoolDay?.toJson(),
              -			],
              -			"month": date.month
              -		}
              -	);
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/CalendarEditor/years.html b/docs/models/CalendarEditor/years.html deleted file mode 100644 index a42f9ff56..000000000 --- a/docs/models/CalendarEditor/years.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - years property - CalendarEditor class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              years
              - -
              - -
              - - - - -
              -
              - -

              years property - Null safety -

              - -
              - List<int> - years -
              final
              - -
              - -
              -

              The year of each month.

              -

              Because the school year goes from September to June, determining the year -of any given month is not trivial. The year is computed from the current -month and the month in question.

              -
              - - -
              -

              Implementation

              -
              final List<int> years = [
              -	for (int month = 0; month < 12; month++)
              -		currentMonth > 7
              -			? month > 7 ? currentYear : currentYear + 1
              -			: month > 7 ? currentYear - 1 : currentYear
              -];
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/DayBuilderModel-class.html b/docs/models/DayBuilderModel-class.html deleted file mode 100644 index c5460fc32..000000000 --- a/docs/models/DayBuilderModel-class.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - - - - - DayBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              DayBuilderModel
              - -
              - -
              - - - - -
              -
              - -

              DayBuilderModel class - Null safety - -

              - - -
              -

              A view model for the creating a new Day.

              -
              - - -
              -
              - - -
              Mixed in types
              -
              - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - DayBuilderModel({required Day? day, required DateTime date}) -
              -
              - Creates a view model for modifying a Day. -
              -
              -
              - -
              -

              Properties

              - -
              -
              - date - → DateTime - -
              -
              - -
              final
              - -
              - -
              - day - Day? - -
              -
              - The day being created (in present state). -
              read-only
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - hasSchool - ↔ bool - -
              -
              - If this day has school. -
              read / write
              - -
              - -
              - name - ↔ String? - -
              -
              - The name for this day. -
              read / write
              - -
              - -
              - ready - → bool - -
              -
              - Whether this day is ready to be created. -
              read-only
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - schedule - Schedule? - -
              -
              - The schedule for this day. -
              read / write
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              @mustCallSuper, inherited
              - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/DayBuilderModel/DayBuilderModel.html b/docs/models/DayBuilderModel/DayBuilderModel.html deleted file mode 100644 index 035368e9b..000000000 --- a/docs/models/DayBuilderModel/DayBuilderModel.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - DayBuilderModel constructor - DayBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              DayBuilderModel
              - -
              - -
              - - - - -
              -
              - -

              DayBuilderModel constructor - Null safety -

              - -
              - DayBuilderModel(
              1. {required Day? day,
              2. -
              3. required DateTime date}
              4. -
              ) -
              - - -
              -

              Creates a view model for modifying a Day.

              -
              - - - -
              -

              Implementation

              -
              DayBuilderModel({required Day? day, required this.date}) :
              -	_name = day?.name,
              -	_schedule = day?.schedule,
              -	_hasSchool = day != null;
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/DayBuilderModel/date.html b/docs/models/DayBuilderModel/date.html deleted file mode 100644 index c8a470d48..000000000 --- a/docs/models/DayBuilderModel/date.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - date property - DayBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              date
              - -
              - -
              - - - - -
              -
              - -

              date property - Null safety -

              - -
              - DateTime - date -
              final
              - -
              - - - -
              -

              Implementation

              -
              final DateTime date;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/DayBuilderModel/day.html b/docs/models/DayBuilderModel/day.html deleted file mode 100644 index 3776771fe..000000000 --- a/docs/models/DayBuilderModel/day.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - day property - DayBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              day
              - -
              - -
              - - - - -
              -
              - -

              day property - Null safety -

              - - - -
              - -
              - Day? - day - - -
              - - -
              -

              The day being created (in present state).

              -
              - - -
              -

              Implementation

              -
              Day? get day => !hasSchool ? null : Day(
              -	name: name ?? "",
              -	schedule: schedule ?? Schedule.schedules.first,
              -);
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/DayBuilderModel/hasSchool.html b/docs/models/DayBuilderModel/hasSchool.html deleted file mode 100644 index 113e96cf2..000000000 --- a/docs/models/DayBuilderModel/hasSchool.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - hasSchool property - DayBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hasSchool
              - -
              - -
              - - - - -
              -
              - -

              hasSchool property - Null safety -

              - - - -
              - -
              - bool - hasSchool - - -
              - - -
              -

              If this day has school.

              -
              - - -
              -

              Implementation

              -
              bool get hasSchool => _hasSchool;
              -
              - -
              - - - -
              - -
              - void - hasSchool=(bool value) - - -
              - - - - -
              -

              Implementation

              -
              set hasSchool(bool value) {
              -	_hasSchool = value;
              -	notifyListeners();
              -}
              -
              - -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/DayBuilderModel/name.html b/docs/models/DayBuilderModel/name.html deleted file mode 100644 index 3f51b31dc..000000000 --- a/docs/models/DayBuilderModel/name.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - name property - DayBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              name
              - -
              - -
              - - - - -
              -
              - -

              name property - Null safety -

              - - - -
              - -
              - String? - name - - -
              - - -
              -

              The name for this day.

              -
              - - -
              -

              Implementation

              -
              String? get name => _name;
              -
              - -
              - - - -
              - -
              - void - name=(String? value) - - -
              - - - - -
              -

              Implementation

              -
              set name (String? value) {
              -	_name = value;
              -	notifyListeners();
              -}
              -
              - -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/DayBuilderModel/ready.html b/docs/models/DayBuilderModel/ready.html deleted file mode 100644 index 2e74fc173..000000000 --- a/docs/models/DayBuilderModel/ready.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - ready property - DayBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ready
              - -
              - -
              - - - - -
              -
              - -

              ready property - Null safety -

              - - - -
              - -
              - bool - ready - - -
              - - -
              -

              Whether this day is ready to be created.

              -
              - - -
              -

              Implementation

              -
              bool get ready => name != null && schedule != null;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/DayBuilderModel/schedule.html b/docs/models/DayBuilderModel/schedule.html deleted file mode 100644 index b2d81f465..000000000 --- a/docs/models/DayBuilderModel/schedule.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - schedule property - DayBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schedule
              - -
              - -
              - - - - -
              -
              - -

              schedule property - Null safety -

              - - - -
              - -
              - Schedule? - schedule - - -
              - - -
              -

              The schedule for this day.

              -
              - - -
              -

              Implementation

              -
              Schedule? get schedule => _schedule;
              -
              - -
              - - - -
              - -
              - void - schedule=(Schedule? value) - - -
              - - - - -
              -

              Implementation

              -
              set schedule (Schedule? value) {
              -	if (value == null) {
              -		return;
              -	}
              -	_schedule = value;
              -	notifyListeners();
              -}
              -
              - -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/FeedbackModel-class.html b/docs/models/FeedbackModel-class.html deleted file mode 100644 index 2cb7be37d..000000000 --- a/docs/models/FeedbackModel-class.html +++ /dev/null @@ -1,386 +0,0 @@ - - - - - - - - FeedbackModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              FeedbackModel
              - -
              - -
              - - - - -
              -
              - -

              FeedbackModel class - Null safety - -

              - - -
              -

              A view model for the feedback page.

              -
              - - -
              -
              - - -
              Mixed in types
              -
              - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - FeedbackModel() -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - anonymous - ↔ bool - -
              -
              - Whether the user consents to receiving a follow-up response. -
              read / write
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - message - ↔ String? - -
              -
              - The message that will be sent along with the feedback. -
              read / write
              - -
              - -
              - ready - → bool - -
              -
              - Whether the user is ready to submit [...] -
              read-only
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              @mustCallSuper, inherited
              - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - send() - → Future<void> - - - -
              -
              - Sends the feedback to Cloud Firestore. [...] - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/FeedbackModel/FeedbackModel.html b/docs/models/FeedbackModel/FeedbackModel.html deleted file mode 100644 index f960e5942..000000000 --- a/docs/models/FeedbackModel/FeedbackModel.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - FeedbackModel constructor - FeedbackModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              FeedbackModel
              - -
              - -
              - - - - -
              -
              - -

              FeedbackModel constructor - Null safety -

              - -
              - FeedbackModel() -
              - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/FeedbackModel/anonymous.html b/docs/models/FeedbackModel/anonymous.html deleted file mode 100644 index 44073fee8..000000000 --- a/docs/models/FeedbackModel/anonymous.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - anonymous property - FeedbackModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              anonymous
              - -
              - -
              - - - - -
              -
              - -

              anonymous property - Null safety -

              - - - -
              - -
              - bool - anonymous - - -
              - - -
              -

              Whether the user consents to receiving a follow-up response.

              -
              - - -
              -

              Implementation

              -
              bool get anonymous => _anonymous;
              -
              - -
              - - - -
              - -
              - void - anonymous=(bool value) - - -
              - - - - -
              -

              Implementation

              -
              set anonymous(bool value) {
              -	_anonymous = value;
              -	notifyListeners();
              -}
              -
              - -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/FeedbackModel/message.html b/docs/models/FeedbackModel/message.html deleted file mode 100644 index 1e2364c55..000000000 --- a/docs/models/FeedbackModel/message.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - message property - FeedbackModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              message
              - -
              - -
              - - - - -
              -
              - -

              message property - Null safety -

              - - - -
              - -
              - String? - message - - -
              - - -
              -

              The message that will be sent along with the feedback.

              -
              - - -
              -

              Implementation

              -
              String? get message => _message;
              -
              - -
              - - - -
              - -
              - void - message=(String? value) - - -
              - - - - -
              -

              Implementation

              -
              set message (String? value) {
              -	_message = value;
              -	notifyListeners();
              -}
              -
              - -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/FeedbackModel/ready.html b/docs/models/FeedbackModel/ready.html deleted file mode 100644 index 9e0e16615..000000000 --- a/docs/models/FeedbackModel/ready.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - ready property - FeedbackModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ready
              - -
              - -
              - - - - -
              -
              - -

              ready property - Null safety -

              - - - -
              - -
              - bool - ready - - -
              - - -
              -

              Whether the user is ready to submit

              -

              Is true if the message is non-null and not empty.

              -
              - - -
              -

              Implementation

              -
              bool get ready => message != null && message!.trim().isNotEmpty;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/FeedbackModel/send.html b/docs/models/FeedbackModel/send.html deleted file mode 100644 index 017f0d432..000000000 --- a/docs/models/FeedbackModel/send.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - send method - FeedbackModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              send
              - -
              - -
              - - - - -
              -
              - -

              send method - Null safety -

              - -
              - - -Future<void> -send() - - - -
              - -
              -

              Sends the feedback to Cloud Firestore.

              -

              The feedback is anonymized if anonymous is true.

              -
              - - - -
              -

              Implementation

              -
              Future<void> send() async => Services
              -	.instance
              -	.database
              -	.cloudDatabase
              -	.sendFeedback(
              -		Feedback (
              -			message: message!,
              -			timestamp: DateTime.now(),
              -			anonymous: anonymous,
              -			name: anonymous ? null : Auth.name,
              -			email: anonymous ? null : Auth.email,
              -		).toJson()
              -);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/HomeModel-class.html b/docs/models/HomeModel-class.html deleted file mode 100644 index 62bfb03db..000000000 --- a/docs/models/HomeModel-class.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - - - HomeModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              HomeModel
              - -
              - -
              - - - - -
              -
              - -

              HomeModel class - Null safety - -

              - - -
              -

              A view model for the home page.

              -

              This model doesn't actually do much, it just listens to any data models -that are relevant to the home page. Because we're using ChangeNotifier, -as its the only Listenable with a dispose method, we can't simply use -Listenable.merge.

              -

              Additionally, the data models being listened to here will be disposed after -signing in and will be unusable. That's why we can't simply pass in a data -model. Instead, we have to reference it through Models, which will always -have an up-to-date instance.

              -
              - - -
              -
              - - -
              Mixed in types
              -
              - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - HomeModel() -
              -
              - Listens to ScheduleModel (and by extension, Reminders) and Sports. -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              override
              - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - refresh(VoidCallback onFailure) - → Future<void> - - - -
              -
              - Refreshes the database. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/HomeModel/HomeModel.html b/docs/models/HomeModel/HomeModel.html deleted file mode 100644 index 28e76ecff..000000000 --- a/docs/models/HomeModel/HomeModel.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - HomeModel constructor - HomeModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              HomeModel
              - -
              - -
              - - - - -
              -
              - -

              HomeModel constructor - Null safety -

              - -
              - HomeModel() -
              - - -
              -

              Listens to ScheduleModel (and by extension, Reminders) and Sports.

              -
              - - - -
              -

              Implementation

              -
              HomeModel() {
              -	Models.instance.schedule.addListener(notifyListeners);
              -	Models.instance.sports.addListener(notifyListeners);
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/HomeModel/dispose.html b/docs/models/HomeModel/dispose.html deleted file mode 100644 index fbb48c33c..000000000 --- a/docs/models/HomeModel/dispose.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - dispose method - HomeModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              dispose
              - -
              - -
              - - - - -
              -
              - -

              dispose method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -void -dispose() - -
              override
              - -
              - -
              -

              Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed).

              -

              This method should only be called by the object's owner.

              -
              - - - -
              -

              Implementation

              -
              @override
              -void dispose() {
              -	Models.instance.schedule.removeListener(notifyListeners);
              -	Models.instance.sports.removeListener(notifyListeners);
              -	super.dispose();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/HomeModel/refresh.html b/docs/models/HomeModel/refresh.html deleted file mode 100644 index a58e6c425..000000000 --- a/docs/models/HomeModel/refresh.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - refresh method - HomeModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              refresh
              - -
              - -
              - - - - -
              -
              - -

              refresh method - Null safety -

              - -
              - - -Future<void> -refresh(
              1. VoidCallback onFailure
              2. -
              ) - - - -
              - -
              -

              Refreshes the database.

              -

              This only updates the calendar and sports games, not the user profile. To -update user data, sign out and sign back in.

              -
              - - - -
              -

              Implementation

              -
              Future<void> refresh(VoidCallback onFailure) async {
              -	try {
              -		await Services.instance.database.updateCalendar();
              -		await Services.instance.database.updateSports();
              -		await Models.instance.schedule.initCalendar();
              -	} catch (error) {  // ignore: avoid_catches_without_on_clauses
              -		// We just want to allow the user to retry. But still rethrow.
              -		onFailure();
              -		rethrow;
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Models-class.html b/docs/models/Models-class.html deleted file mode 100644 index f02806836..000000000 --- a/docs/models/Models-class.html +++ /dev/null @@ -1,423 +0,0 @@ - - - - - - - - Models class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Models
              - -
              - -
              - - - - -
              -
              - -

              Models class - Null safety - -

              - - -
              -

              Bundles all the data models together.

              -

              Each data model is responsible for different types of data. For example, -ScheduleModel keeps track of the schedule (as well as associated data such -as the current period) and UserModel reads the user data.

              -

              Each data model inherits from Model, so it has init and dispose -functions. This model serves to bundles those together, so that calling -init or dispose on this model will call the respective functions -on all the data models.

              -
              - - - -
              -

              Constructors

              - -
              -
              - Models() -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - isReady - ↔ bool - -
              -
              - Whether the data models have been initialized. -
              read / write
              - -
              - -
              - reminders - Reminders - -
              -
              - The reminders data model. -
              read-only
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - schedule - ScheduleModel - -
              -
              - The schedule data model. -
              read-only
              - -
              - -
              - sports - Sports - -
              -
              - The sports data model. -
              read-only
              - -
              - -
              - user - UserModel - -
              -
              - The user data model. -
              read-only
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              override
              - -
              - -
              - init() - → Future<void> - - - -
              -
              - Gets whatever data is needed by this model from a service. [...] - - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Static Properties

              - -
              -
              - instance - Models - -
              -
              - The singleton instance of this class. -
              read / write
              - -
              - -
              -
              - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Models/Models.html b/docs/models/Models/Models.html deleted file mode 100644 index 9f2524ed9..000000000 --- a/docs/models/Models/Models.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - Models constructor - Models class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Models
              - -
              - -
              - - - - -
              -
              - -

              Models constructor - Null safety -

              - -
              - Models() -
              - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Models/dispose.html b/docs/models/Models/dispose.html deleted file mode 100644 index df896554f..000000000 --- a/docs/models/Models/dispose.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - dispose method - Models class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              dispose
              - -
              - -
              - - - - -
              -
              - -

              dispose method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -void -dispose() - -
              override
              - -
              - -
              -

              Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed).

              -

              This method should only be called by the object's owner.

              -
              - - - -
              -

              Implementation

              -
              @override
              -// This object can be revived using [init].
              -// ignore: must_call_super
              -void dispose() {
              -	_schedule?.dispose();
              -	_reminders?.dispose();
              -	_sports?.dispose();
              -	_user?.dispose();
              -	// These data models have been disposed and cannot be used again
              -	_reminders = null;
              -	_schedule = null;
              -	_sports = null;
              -	_user = null;
              -	isReady = false;
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Models/init.html b/docs/models/Models/init.html deleted file mode 100644 index f2545cd76..000000000 --- a/docs/models/Models/init.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - init method - Models class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              init
              - -
              - -
              - - - - -
              -
              - -

              init method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -Future<void> -init() - - - -
              - -
              -

              Gets whatever data is needed by this model from a service.

              -

              This model may not function properly if this function is not called.

              -
              - - - -
              -

              Implementation

              -
              @override
              -Future<void> init() async {
              -	if (isReady) {
              -		return;
              -	}
              -	final Crashlytics crashlytics = Services.instance.crashlytics;
              -	await crashlytics.log("Initializing user model");
              -	await user.init();
              -	await crashlytics.log("Initializing reminders model");
              -	await reminders.init();
              -	await crashlytics.log("Initializing schedule model");
              -	await schedule.init();
              -	await crashlytics.log("Initializing sports model");
              -	await sports.init();
              -	isReady = true;
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Models/instance.html b/docs/models/Models/instance.html deleted file mode 100644 index 13de4e1d9..000000000 --- a/docs/models/Models/instance.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - instance property - Models class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              instance
              - -
              - -
              - - - - -
              -
              - -

              instance property - Null safety -

              - -
              - Models - instance -
              read / write
              - -
              - -
              -

              The singleton instance of this class.

              -
              - - -
              -

              Implementation

              -
              static Models instance = Models();
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Models/isReady.html b/docs/models/Models/isReady.html deleted file mode 100644 index bd4985a7f..000000000 --- a/docs/models/Models/isReady.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - isReady property - Models class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              isReady
              - -
              - -
              - - - - -
              -
              - -

              isReady property - Null safety -

              - -
              - bool - isReady -
              read / write
              - -
              - -
              -

              Whether the data models have been initialized.

              -
              - - -
              -

              Implementation

              -
              bool isReady = false;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Models/reminders.html b/docs/models/Models/reminders.html deleted file mode 100644 index 763b2c5f5..000000000 --- a/docs/models/Models/reminders.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - reminders property - Models class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              reminders
              - -
              - -
              - - - - -
              -
              - -

              reminders property - Null safety -

              - - - -
              - -
              - Reminders - reminders - - -
              - - -
              -

              The reminders data model.

              -
              - - -
              -

              Implementation

              -
              Reminders get reminders => _reminders ??= Reminders();
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Models/schedule.html b/docs/models/Models/schedule.html deleted file mode 100644 index 649395698..000000000 --- a/docs/models/Models/schedule.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - schedule property - Models class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schedule
              - -
              - -
              - - - - -
              -
              - -

              schedule property - Null safety -

              - - - -
              - -
              - ScheduleModel - schedule - - -
              - - -
              -

              The schedule data model.

              -
              - - -
              -

              Implementation

              -
              ScheduleModel get schedule => _schedule ??= ScheduleModel();
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Models/sports.html b/docs/models/Models/sports.html deleted file mode 100644 index 2238a0d94..000000000 --- a/docs/models/Models/sports.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - sports property - Models class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              sports
              - -
              - -
              - - - - -
              -
              - -

              sports property - Null safety -

              - - - -
              - -
              - Sports - sports - - -
              - - -
              -

              The sports data model.

              -
              - - -
              -

              Implementation

              -
              Sports get sports => _sports ??= Sports();
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Models/user.html b/docs/models/Models/user.html deleted file mode 100644 index 4c262b040..000000000 --- a/docs/models/Models/user.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - user property - Models class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              user
              - -
              - -
              - - - - -
              -
              - -

              user property - Null safety -

              - - - -
              - -
              - UserModel - user - - -
              - - -
              -

              The user data model.

              -
              - - -
              -

              Implementation

              -
              UserModel get user => _user ??= UserModel();
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders-class.html b/docs/models/Reminders-class.html deleted file mode 100644 index 8f7dd2b7b..000000000 --- a/docs/models/Reminders-class.html +++ /dev/null @@ -1,510 +0,0 @@ - - - - - - - - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Reminders
              - -
              - -
              - - - - -
              -
              - -

              Reminders class - Null safety - -

              - - -
              -

              A DataModel that keeps the state of the user's reminders.

              -

              This data model abstracts all operations that have to do with reminders, -and all other parts of the app that want to operate on reminders should use -this data model.

              -
              - - - -
              -

              Constructors

              - -
              -
              - Reminders() -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - currentReminders - ↔ List<int> - -
              -
              - The reminders that apply for this period. [...] -
              read / write
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - hasNextReminder - → bool - -
              -
              - Whether any reminder applies to the next period. -
              read-only
              - -
              - -
              - hasReminder - → bool - -
              -
              - Whether any reminder applies to the current period. -
              read-only
              - -
              - -
              - nextReminders - ↔ List<int> - -
              -
              - The reminders that apply for next period. [...] -
              read / write
              - -
              - -
              - readReminders - → List<int> - -
              -
              - Reminders that applied for previous periods. [...] -
              final
              - -
              - -
              - reminders - ↔ List<Reminder> - -
              -
              - The reminders for the user. -
              final, read / write, late
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - addReminder(Reminder? reminder) - → void - - - -
              -
              - Creates a new reminder. - - -
              - -
              - cleanReminders() - → void - - - -
              -
              - Deletes expired reminders. [...] - - -
              - -
              - deleteReminder(int index) - → void - - - -
              -
              - Deletes the reminder at a given index. - - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              @mustCallSuper, inherited
              - -
              - -
              - getReminders({required String? subject, required String? period, required String? dayName}) - → List<int> - - - -
              -
              - Gets all reminders that apply to the a given period. [...] - - -
              - -
              - init() - → Future<void> - - - -
              -
              - Gets whatever data is needed by this model from a service. [...] - - -
              - -
              - markShown(int index) - → void - - - -
              -
              - Marks a reminder as "shown". [...] - - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - replaceReminder(int index, Reminder? reminder) - → void - - - -
              -
              - Replaces a reminder at a given index. - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              - verifyReminders(int changedIndex) - → void - - - -
              -
              - Checks if any reminders have been modified and removes them. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/Reminders.html b/docs/models/Reminders/Reminders.html deleted file mode 100644 index a1c2afeb3..000000000 --- a/docs/models/Reminders/Reminders.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - Reminders constructor - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              Reminders
              - -
              - -
              - - - - -
              -
              - -

              Reminders constructor - Null safety -

              - -
              - Reminders() -
              - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/addReminder.html b/docs/models/Reminders/addReminder.html deleted file mode 100644 index eefda039f..000000000 --- a/docs/models/Reminders/addReminder.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - addReminder method - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              addReminder
              - -
              - -
              - - - - -
              -
              - -

              addReminder method - Null safety -

              - -
              - - -void -addReminder(
              1. Reminder? reminder
              2. -
              ) - - - -
              - -
              -

              Creates a new reminder.

              -
              - - - -
              -

              Implementation

              -
              void addReminder(Reminder? reminder) {
              -	if (reminder == null) {
              -		return;
              -	}
              -	reminders.add(reminder);
              -	Services.instance.database.updateReminder(null, reminder.toJson());
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/cleanReminders.html b/docs/models/Reminders/cleanReminders.html deleted file mode 100644 index 566b3a15c..000000000 --- a/docs/models/Reminders/cleanReminders.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - cleanReminders method - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              cleanReminders
              - -
              - -
              - - - - -
              -
              - -

              cleanReminders method - Null safety -

              - -
              - - -void -cleanReminders() - - - -
              - -
              -

              Deletes expired reminders.

              -

              This method searches all reminders in readReminders for a reminder that -does not repeat and has been shown already (ie, in currentReminders), -then calls deleteReminder on them.

              -
              - - - -
              -

              Implementation

              -
              void cleanReminders() {
              -	for (final Reminder reminder in [
              -		for (final int index in readReminders)
              -			if (!reminders [index].time.repeats && !currentReminders.contains(index))
              -				reminders [index]
              -	]) {
              -		deleteReminder(reminders.indexOf(reminder));
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/currentReminders.html b/docs/models/Reminders/currentReminders.html deleted file mode 100644 index 48a89befd..000000000 --- a/docs/models/Reminders/currentReminders.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - currentReminders property - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              currentReminders
              - -
              - -
              - - - - -
              -
              - -

              currentReminders property - Null safety -

              - -
              - List<int> - currentReminders -
              read / write
              - -
              - -
              -

              The reminders that apply for this period.

              -

              This is managed by the Schedule data model.

              -
              - - -
              -

              Implementation

              -
              List<int> currentReminders = [];
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/deleteReminder.html b/docs/models/Reminders/deleteReminder.html deleted file mode 100644 index 4366172a2..000000000 --- a/docs/models/Reminders/deleteReminder.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - deleteReminder method - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              deleteReminder
              - -
              - -
              - - - - -
              -
              - -

              deleteReminder method - Null safety -

              - -
              - - -void -deleteReminder(
              1. int index
              2. -
              ) - - - -
              - -
              -

              Deletes the reminder at a given index.

              -
              - - - -
              -

              Implementation

              -
              void deleteReminder(int index) {
              -	final String oldHash = reminders [index].hash;
              -	reminders.removeAt(index);
              -	Services.instance.database.deleteReminder(oldHash);
              -	verifyReminders(index);  // remove the reminder from the schedule
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/getReminders.html b/docs/models/Reminders/getReminders.html deleted file mode 100644 index 2b3e52e10..000000000 --- a/docs/models/Reminders/getReminders.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - getReminders method - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              getReminders
              - -
              - -
              - - - - -
              -
              - -

              getReminders method - Null safety -

              - -
              - - -List<int> -getReminders(
              1. {required String? subject,
              2. -
              3. required String? period,
              4. -
              5. required String? dayName}
              6. -
              ) - - - -
              - -
              -

              Gets all reminders that apply to the a given period.

              -

              This method is a wrapper around Reminder.getReminders, and should only -be called by an object with access to the relevant period.

              -
              - - - -
              -

              Implementation

              -
              List<int> getReminders({
              -	required String? subject,
              -	required String? period,
              -	required String? dayName,
              -}) => Reminder.getReminders(
              -	reminders: reminders,
              -	subject: subject,
              -	dayName: dayName,
              -	period: period,
              -).toList();
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/hasNextReminder.html b/docs/models/Reminders/hasNextReminder.html deleted file mode 100644 index 7574511c2..000000000 --- a/docs/models/Reminders/hasNextReminder.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - hasNextReminder property - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hasNextReminder
              - -
              - -
              - - - - -
              -
              - -

              hasNextReminder property - Null safety -

              - - - -
              - -
              - bool - hasNextReminder - - -
              - - -
              -

              Whether any reminder applies to the next period.

              -
              - - -
              -

              Implementation

              -
              bool get hasNextReminder => nextReminders.isNotEmpty;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/hasReminder.html b/docs/models/Reminders/hasReminder.html deleted file mode 100644 index d86588f51..000000000 --- a/docs/models/Reminders/hasReminder.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - hasReminder property - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hasReminder
              - -
              - -
              - - - - -
              -
              - -

              hasReminder property - Null safety -

              - - - -
              - -
              - bool - hasReminder - - -
              - - -
              -

              Whether any reminder applies to the current period.

              -
              - - -
              -

              Implementation

              -
              bool get hasReminder => currentReminders.isNotEmpty;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/init.html b/docs/models/Reminders/init.html deleted file mode 100644 index 836b74b8f..000000000 --- a/docs/models/Reminders/init.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - init method - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              init
              - -
              - -
              - - - - -
              -
              - -

              init method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -Future<void> -init() - - - -
              - -
              -

              Gets whatever data is needed by this model from a service.

              -

              This model may not function properly if this function is not called.

              -
              - - - -
              -

              Implementation

              -
              @override
              -Future<void> init() async {
              -	reminders = [
              -		for (final Map json in await Services.instance.database.reminders)
              -			Reminder.fromJson(json)
              -	];
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/markShown.html b/docs/models/Reminders/markShown.html deleted file mode 100644 index 73a2642f0..000000000 --- a/docs/models/Reminders/markShown.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - markShown method - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              markShown
              - -
              - -
              - - - - -
              -
              - -

              markShown method - Null safety -

              - -
              - - -void -markShown(
              1. int index
              2. -
              ) - - - -
              - -
              -

              Marks a reminder as "shown".

              -

              It will then be marked for deletion if it does not repeat. -See readReminders and cleanReminders for details.

              -
              - - - -
              -

              Implementation

              -
              void markShown(int index) {
              -	if (readReminders.contains(index)) {
              -		return;
              -	}
              -	readReminders.add(index);
              -	cleanReminders();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/nextReminders.html b/docs/models/Reminders/nextReminders.html deleted file mode 100644 index 9a5e4133d..000000000 --- a/docs/models/Reminders/nextReminders.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - nextReminders property - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              nextReminders
              - -
              - -
              - - - - -
              -
              - -

              nextReminders property - Null safety -

              - -
              - List<int> - nextReminders -
              read / write
              - -
              - -
              -

              The reminders that apply for next period.

              -

              This is managed by the Schedule data model.

              -
              - - -
              -

              Implementation

              -
              List<int> nextReminders = [];
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/readReminders.html b/docs/models/Reminders/readReminders.html deleted file mode 100644 index 5f410d356..000000000 --- a/docs/models/Reminders/readReminders.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - readReminders property - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              readReminders
              - -
              - -
              - - - - -
              -
              - -

              readReminders property - Null safety -

              - -
              - List<int> - readReminders -
              final
              - -
              - -
              -

              Reminders that applied for previous periods.

              -

              These reminders will be marked for deletion if they do not repeat.

              -
              - - -
              -

              Implementation

              -
              final List<int> readReminders = [];
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/reminders.html b/docs/models/Reminders/reminders.html deleted file mode 100644 index 970bd38bd..000000000 --- a/docs/models/Reminders/reminders.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - reminders property - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              reminders
              - -
              - -
              - - - - -
              -
              - -

              reminders property - Null safety -

              - -
              - List<Reminder> - reminders -
              final, read / write, late
              - -
              - -
              -

              The reminders for the user.

              -
              - - -
              -

              Implementation

              -
              late final List<Reminder> reminders;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/replaceReminder.html b/docs/models/Reminders/replaceReminder.html deleted file mode 100644 index 5452ad0d5..000000000 --- a/docs/models/Reminders/replaceReminder.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - replaceReminder method - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              replaceReminder
              - -
              - -
              - - - - -
              -
              - -

              replaceReminder method - Null safety -

              - -
              - - -void -replaceReminder(
              1. int index,
              2. -
              3. Reminder? reminder
              4. -
              ) - - - -
              - -
              -

              Replaces a reminder at a given index.

              -
              - - - -
              -

              Implementation

              -
              void replaceReminder(int index, Reminder? reminder) {
              -	if (reminder == null) {
              -		return;
              -	}
              -	final String oldHash = reminders [index].hash;
              -	reminders [index] = reminder;
              -	Services.instance.database.updateReminder(oldHash, reminder.toJson());
              -	verifyReminders(index);
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/Reminders/verifyReminders.html b/docs/models/Reminders/verifyReminders.html deleted file mode 100644 index 8926f36e4..000000000 --- a/docs/models/Reminders/verifyReminders.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - verifyReminders method - Reminders class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              verifyReminders
              - -
              - -
              - - - - -
              -
              - -

              verifyReminders method - Null safety -

              - -
              - - -void -verifyReminders(
              1. int changedIndex
              2. -
              ) - - - -
              - -
              -

              Checks if any reminders have been modified and removes them.

              -

              This makes sure that any reminders in currentReminders, -nextReminders, and readReminders are all up-to-date.

              -
              - - - -
              -

              Implementation

              -
              void verifyReminders(int changedIndex) {
              -	final List<List<int>> reminderLists = [
              -		currentReminders,
              -		nextReminders,
              -		readReminders
              -	];
              -	for (final List<int> remindersList in reminderLists) {
              -		final int removeIndex = remindersList.indexOf(changedIndex);
              -		if (removeIndex != -1) {
              -			remindersList.removeAt(removeIndex);
              -		}
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel-class.html b/docs/models/RemindersBuilderModel-class.html deleted file mode 100644 index 62db206a3..000000000 --- a/docs/models/RemindersBuilderModel-class.html +++ /dev/null @@ -1,554 +0,0 @@ - - - - - - - - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              RemindersBuilderModel
              - -
              - -
              - - - - -
              -
              - -

              RemindersBuilderModel class - Null safety - -

              - - -
              -

              A view model for the dialog that allows the user to build a reminder.

              -
              - - -
              -
              - - -
              Mixed in types
              -
              - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - RemindersBuilderModel([Reminder? reminder]) -
              -
              - Creates a new reminder builder model. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - course - ↔ String? - -
              -
              - The name of the class this reminder should be displayed. [...] -
              read / write
              - -
              - -
              - courses - → List<String> - -
              -
              - All the names of the user's courses. -
              final
              - -
              - -
              - dayName - ↔ String? - -
              -
              - The name of the day. -
              read / write
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - message - ↔ String - -
              -
              - The message for this reminder. -
              read / write
              - -
              - -
              - period - ↔ String? - -
              -
              - The period this reminder should be displayed. [...] -
              read / write
              - -
              - -
              - periods - → List<String>? - -
              -
              - A list of all the periods in dayName. [...] -
              read-only
              - -
              - -
              - ready - → bool - -
              -
              - Whether the dialog is ready to submit. [...] -
              read-only
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - shouldRepeat - ↔ bool - -
              -
              - Whether this reminder repeats. [...] -
              read / write
              - -
              - -
              - time - ReminderTime? - -
              -
              - The time this reminder will be displayed. -
              read / write
              - -
              - -
              - type - ReminderTimeType? - -
              -
              - The type of reminder the user is building. -
              read / write
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - build() - Reminder - - - -
              -
              - Returns a new reminder from the model's fields. - - -
              - -
              - changeCourse(String value) - → void - - - -
              -
              - Changes the course of this reminder. [...] - - -
              - -
              - changeDay(String value) - → void - - - -
              -
              - Changes the period of this reminder. [...] - - -
              - -
              - changePeriod(String value) - → void - - - -
              -
              - Changes the period of this reminder. [...] - - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              @mustCallSuper, inherited
              - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - onMessageChanged(String newMessage) - → void - - - -
              -
              - Sets the message to the given string. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - toggleRepeat(bool value) - → void - - - -
              -
              - Toggles whether this reminder should repeat. - - -
              - -
              - toggleRepeatType(ReminderTimeType value) - → void - - - -
              -
              - Changes the type of this reminder. - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/RemindersBuilderModel.html b/docs/models/RemindersBuilderModel/RemindersBuilderModel.html deleted file mode 100644 index a4a2d5847..000000000 --- a/docs/models/RemindersBuilderModel/RemindersBuilderModel.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - RemindersBuilderModel constructor - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              RemindersBuilderModel
              - -
              - -
              - - - - -
              -
              - -

              RemindersBuilderModel constructor - Null safety -

              - -
              - RemindersBuilderModel(
              1. [Reminder? reminder]
              2. -
              ) -
              - - -
              -

              Creates a new reminder builder model.

              -

              If reminder is not null, then the relevant fields of this -class are filled in with the corresponding fields of the reminder.

              -
              - - - -
              -

              Implementation

              -
              RemindersBuilderModel([Reminder? reminder]) :
              -	_schedule = Models.instance.schedule,
              -	courses = [
              -		for (final Subject subject in Models.instance.schedule.subjects.values)
              -			subject.name
              -	]
              -{
              -	if (reminder == null) {
              -		return;
              -	}
              -
              -	message = reminder.message;
              -	time = reminder.time;
              -	shouldRepeat = time!.repeats;
              -	type = time!.type;
              -	switch (type) {
              -		case ReminderTimeType.period:
              -			final PeriodReminderTime reminderTime = time as PeriodReminderTime;
              -			period = reminderTime.period;
              -			dayName = reminderTime.dayName;
              -			break;
              -		case ReminderTimeType.subject:
              -			final SubjectReminderTime reminderTime = time as SubjectReminderTime;
              -			course = reminderTime.name;
              -			break;
              -		default:
              -			throw ArgumentError.notNull("Reminder.time.type");
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/build.html b/docs/models/RemindersBuilderModel/build.html deleted file mode 100644 index 919588e55..000000000 --- a/docs/models/RemindersBuilderModel/build.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - build method - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              build
              - -
              - -
              - - - - -
              -
              - -

              build method - Null safety -

              - -
              - - -Reminder -build() - - - -
              - -
              -

              Returns a new reminder from the model's fields.

              -
              - - - -
              -

              Implementation

              -
              Reminder build() => Reminder (
              -	message: message,
              -	time: ReminderTime.fromType(
              -		type: type!,
              -		dayName: dayName,
              -		period: period,
              -		name: course,
              -		repeats: shouldRepeat,
              -	),
              -);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/changeCourse.html b/docs/models/RemindersBuilderModel/changeCourse.html deleted file mode 100644 index 392151029..000000000 --- a/docs/models/RemindersBuilderModel/changeCourse.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - changeCourse method - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              changeCourse
              - -
              - -
              - - - - -
              -
              - -

              changeCourse method - Null safety -

              - -
              - - -void -changeCourse(
              1. String value
              2. -
              ) - - - -
              - -
              -

              Changes the course of this reminder.

              -

              Only relevant when type is ReminderTimeType.subject.

              -
              - - - -
              -

              Implementation

              -
              void changeCourse(String value) {
              -	course = value;
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/changeDay.html b/docs/models/RemindersBuilderModel/changeDay.html deleted file mode 100644 index 098222267..000000000 --- a/docs/models/RemindersBuilderModel/changeDay.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - changeDay method - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              changeDay
              - -
              - -
              - - - - -
              -
              - -

              changeDay method - Null safety -

              - -
              - - -void -changeDay(
              1. String value
              2. -
              ) - - - -
              - -
              -

              Changes the period of this reminder.

              -

              Only relevant when type is ReminderTimeType.period.

              -
              - - - -
              -

              Implementation

              -
              void changeDay(String value) {
              -	dayName = value;
              -	period = null;
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/changePeriod.html b/docs/models/RemindersBuilderModel/changePeriod.html deleted file mode 100644 index 515b5762d..000000000 --- a/docs/models/RemindersBuilderModel/changePeriod.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - changePeriod method - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              changePeriod
              - -
              - -
              - - - - -
              -
              - -

              changePeriod method - Null safety -

              - -
              - - -void -changePeriod(
              1. String value
              2. -
              ) - - - -
              - -
              -

              Changes the period of this reminder.

              -

              Only relevant when type is ReminderTimeType.period

              -
              - - - -
              -

              Implementation

              -
              void changePeriod(String value) {
              -	period = value;
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/course.html b/docs/models/RemindersBuilderModel/course.html deleted file mode 100644 index c95fd85dd..000000000 --- a/docs/models/RemindersBuilderModel/course.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - course property - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              course
              - -
              - -
              - - - - -
              -
              - -

              course property - Null safety -

              - -
              - String? - course -
              read / write
              - -
              - -
              -

              The name of the class this reminder should be displayed.

              -

              Only relevant for SubjectReminderTime.

              -
              - - -
              -

              Implementation

              -
              String? course;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/courses.html b/docs/models/RemindersBuilderModel/courses.html deleted file mode 100644 index 10e52d632..000000000 --- a/docs/models/RemindersBuilderModel/courses.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - courses property - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              courses
              - -
              - -
              - - - - -
              -
              - -

              courses property - Null safety -

              - -
              - List<String> - courses -
              final
              - -
              - -
              -

              All the names of the user's courses.

              -
              - - -
              -

              Implementation

              -
              final List<String> courses;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/dayName.html b/docs/models/RemindersBuilderModel/dayName.html deleted file mode 100644 index 3ba5e4447..000000000 --- a/docs/models/RemindersBuilderModel/dayName.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - dayName property - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              dayName
              - -
              - -
              - - - - -
              -
              - -

              dayName property - Null safety -

              - -
              - String? - dayName -
              read / write
              - -
              - -
              -

              The name of the day.

              -
              - - -
              -

              Implementation

              -
              String? dayName;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/message.html b/docs/models/RemindersBuilderModel/message.html deleted file mode 100644 index 1bd93b5ef..000000000 --- a/docs/models/RemindersBuilderModel/message.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - message property - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              message
              - -
              - -
              - - - - -
              -
              - -

              message property - Null safety -

              - -
              - String - message -
              read / write
              - -
              - -
              -

              The message for this reminder.

              -
              - - -
              -

              Implementation

              -
              String message = "";
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/onMessageChanged.html b/docs/models/RemindersBuilderModel/onMessageChanged.html deleted file mode 100644 index ae6601ee5..000000000 --- a/docs/models/RemindersBuilderModel/onMessageChanged.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - onMessageChanged method - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              onMessageChanged
              - -
              - -
              - - - - -
              -
              - -

              onMessageChanged method - Null safety -

              - -
              - - -void -onMessageChanged(
              1. String newMessage
              2. -
              ) - - - -
              - -
              -

              Sets the message to the given string.

              -

              Use this to properly update ready.

              -
              - - - -
              -

              Implementation

              -
              void onMessageChanged(String newMessage) {
              -	message = newMessage;
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/period.html b/docs/models/RemindersBuilderModel/period.html deleted file mode 100644 index 983c858da..000000000 --- a/docs/models/RemindersBuilderModel/period.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - period property - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              period
              - -
              - -
              - - - - -
              -
              - -

              period property - Null safety -

              - -
              - String? - period -
              read / write
              - -
              - -
              -

              The period this reminder should be displayed.

              -

              Only relevant for PeriodReminderTime.

              -
              - - -
              -

              Implementation

              -
              String? period;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/periods.html b/docs/models/RemindersBuilderModel/periods.html deleted file mode 100644 index 4a67dd111..000000000 --- a/docs/models/RemindersBuilderModel/periods.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - periods property - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              periods
              - -
              - -
              - - - - -
              -
              - -

              periods property - Null safety -

              - - - -
              - -
              - List<String>? - periods - - -
              - - -
              -

              A list of all the periods in dayName.

              -

              Make sure this field is only accessed after setting dayName.

              -
              - - -
              -

              Implementation

              -
              List<String>? get periods {
              -	if (dayName == null) {
              -		return null;
              -	}
              -	final List<PeriodData?> schedule = _schedule.user.schedule [dayName]!;
              -	return [
              -		for (int index = 0; index < schedule.length; index++)
              -			(index + 1).toString()
              -	];
              -}
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/ready.html b/docs/models/RemindersBuilderModel/ready.html deleted file mode 100644 index 93e54bae4..000000000 --- a/docs/models/RemindersBuilderModel/ready.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - ready property - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ready
              - -
              - -
              - - - - -
              -
              - -

              ready property - Null safety -

              - - - -
              - -
              - bool - ready - - -
              - - -
              -

              Whether the dialog is ready to submit.

              -

              In a nutshell, this field will be false if:

              - -
              - - -
              -

              Implementation

              -
              bool get ready {
              -	if (message.isEmpty) {
              -		return false;
              -	}
              -	switch (type) {
              -		case ReminderTimeType.period:
              -			return dayName != null && period != null;
              -		case ReminderTimeType.subject:
              -			return type != ReminderTimeType.subject || course != null;
              -		case null: return false;
              -	}
              -}
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/shouldRepeat.html b/docs/models/RemindersBuilderModel/shouldRepeat.html deleted file mode 100644 index 1bfd1ac61..000000000 --- a/docs/models/RemindersBuilderModel/shouldRepeat.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - shouldRepeat property - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              shouldRepeat
              - -
              - -
              - - - - -
              -
              - -

              shouldRepeat property - Null safety -

              - -
              - bool - shouldRepeat -
              read / write
              - -
              - -
              -

              Whether this reminder repeats.

              -

              This affects whether it will be deleted after -being displayed once.

              -
              - - -
              -

              Implementation

              -
              bool shouldRepeat = false;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/time.html b/docs/models/RemindersBuilderModel/time.html deleted file mode 100644 index cfe4a7519..000000000 --- a/docs/models/RemindersBuilderModel/time.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - time property - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              time
              - -
              - -
              - - - - -
              -
              - -

              time property - Null safety -

              - -
              - ReminderTime? - time -
              read / write
              - -
              - -
              -

              The time this reminder will be displayed.

              -
              - - -
              -

              Implementation

              -
              ReminderTime? time;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/toggleRepeat.html b/docs/models/RemindersBuilderModel/toggleRepeat.html deleted file mode 100644 index 717bcf7de..000000000 --- a/docs/models/RemindersBuilderModel/toggleRepeat.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - toggleRepeat method - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toggleRepeat
              - -
              - -
              - - - - -
              -
              - -

              toggleRepeat method - Null safety -

              - -
              - - -void -toggleRepeat(
              1. bool value
              2. -
              ) - - - -
              - -
              -

              Toggles whether this reminder should repeat.

              -
              - - - -
              -

              Implementation

              -
              // ignore: avoid_positional_boolean_parameters
              -void toggleRepeat(bool value) {
              -	shouldRepeat = value;
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/toggleRepeatType.html b/docs/models/RemindersBuilderModel/toggleRepeatType.html deleted file mode 100644 index e254a8147..000000000 --- a/docs/models/RemindersBuilderModel/toggleRepeatType.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - toggleRepeatType method - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              toggleRepeatType
              - -
              - -
              - - - - -
              -
              - -

              toggleRepeatType method - Null safety -

              - -
              - - -void -toggleRepeatType(
              1. ReminderTimeType value
              2. -
              ) - - - -
              - -
              -

              Changes the type of this reminder.

              -
              - - - -
              -

              Implementation

              -
              void toggleRepeatType(ReminderTimeType value) {
              -	type = value;
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/RemindersBuilderModel/type.html b/docs/models/RemindersBuilderModel/type.html deleted file mode 100644 index a952c5f56..000000000 --- a/docs/models/RemindersBuilderModel/type.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - type property - RemindersBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              type
              - -
              - -
              - - - - -
              -
              - -

              type property - Null safety -

              - -
              - ReminderTimeType? - type -
              read / write
              - -
              - -
              -

              The type of reminder the user is building.

              -
              - - -
              -

              Implementation

              -
              ReminderTimeType? type;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleBuilderModel-class.html b/docs/models/ScheduleBuilderModel-class.html deleted file mode 100644 index d7ebad69a..000000000 --- a/docs/models/ScheduleBuilderModel-class.html +++ /dev/null @@ -1,436 +0,0 @@ - - - - - - - - ScheduleBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ScheduleBuilderModel
              - -
              - -
              - - - - -
              -
              - -

              ScheduleBuilderModel class - Null safety - -

              - - -
              -

              A view model to create a Schedule.

              -
              - - -
              -
              - - -
              Mixed in types
              -
              - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - ScheduleBuilderModel([Schedule? preset]) -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - name - ↔ String? - -
              -
              - The name of this schedule. [...] -
              read / write
              - -
              - -
              - numPeriods - ↔ int - -
              -
              - The amount of periods. [...] -
              read / write
              - -
              - -
              - periods - ↔ List<Period> - -
              -
              - Numbers for the periods. [...] -
              read / write
              - -
              - -
              - preset - Schedule? - -
              -
              - The schedule that this schedule is based on. -
              read / write
              - -
              - -
              - ready - → bool - -
              -
              - Whether this schedule is ready to be built. -
              read-only
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - schedule - Schedule - -
              -
              - The schedule being built. -
              read-only
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              @mustCallSuper, inherited
              - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - replaceTime(int index, Range range) - → void - - - -
              -
              - Switches out a time in periods with a new time. - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              - usePreset(Schedule? schedule) - → void - - - -
              -
              - Sets properties of this schedule based on an existing schedule. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleBuilderModel/ScheduleBuilderModel.html b/docs/models/ScheduleBuilderModel/ScheduleBuilderModel.html deleted file mode 100644 index 32b2b254e..000000000 --- a/docs/models/ScheduleBuilderModel/ScheduleBuilderModel.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - ScheduleBuilderModel constructor - ScheduleBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ScheduleBuilderModel
              - -
              - -
              - - - - -
              -
              - -

              ScheduleBuilderModel constructor - Null safety -

              - -
              - ScheduleBuilderModel(
              1. [Schedule? preset]
              2. -
              ) -
              - - - - - -
              -

              Implementation

              -
              ScheduleBuilderModel([this.preset]) {
              -	usePreset(preset);
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleBuilderModel/name.html b/docs/models/ScheduleBuilderModel/name.html deleted file mode 100644 index ab4cd1689..000000000 --- a/docs/models/ScheduleBuilderModel/name.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - name property - ScheduleBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              name
              - -
              - -
              - - - - -
              -
              - -

              name property - Null safety -

              - - - -
              - -
              - String? - name - - -
              - - -
              -

              The name of this schedule.

              -

              See Schedule.name.

              -
              - - -
              -

              Implementation

              -
              String? get name => _name;
              -
              - -
              - - - -
              - -
              - void - name=(String? value) - - -
              - - - - -
              -

              Implementation

              -
              set name (String? value) {
              -	_name = value;
              -	notifyListeners();
              -}
              -
              - -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleBuilderModel/numPeriods.html b/docs/models/ScheduleBuilderModel/numPeriods.html deleted file mode 100644 index 8fc514d29..000000000 --- a/docs/models/ScheduleBuilderModel/numPeriods.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - numPeriods property - ScheduleBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              numPeriods
              - -
              - -
              - - - - -
              -
              - -

              numPeriods property - Null safety -

              - - - -
              - -
              - int - numPeriods - - -
              - - -
              -

              The amount of periods.

              -

              Grows and trims periods as necessary. This is Schedule.periods.length.

              -
              - - -
              -

              Implementation

              -
              int get numPeriods => _numPeriods;
              -
              - -
              - - - -
              - -
              - void - numPeriods=(int value) - - -
              - - - - -
              -

              Implementation

              -
              set numPeriods (int value) {
              -	if (value == 0) {
              -		periods.clear();
              -	} else if (value < numPeriods) {
              -		periods.removeRange(value, periods.length);
              -	} else if (_numPeriods == 0) {
              -		periods.add(
              -			const Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 50)))
              -		);
              -	} else {
              -		final Range prev = periods [value - 2].time;
              -		periods.add(
              -			Period.raw(
              -				name: value.toString(),
              -				time: Range(
              -					Time(prev.end.hour + 1, 0),
              -					Time(prev.end.hour + 2, 0)
              -				)
              -			)
              -		);
              -	}
              -	_numPeriods = value;
              -	notifyListeners();
              -}
              -
              - -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleBuilderModel/periods.html b/docs/models/ScheduleBuilderModel/periods.html deleted file mode 100644 index 326d29ab2..000000000 --- a/docs/models/ScheduleBuilderModel/periods.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - periods property - ScheduleBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              periods
              - -
              - -
              - - - - -
              -
              - -

              periods property - Null safety -

              - -
              - List<Period> - periods -
              read / write
              - -
              - -
              -

              Numbers for the periods.

              -

              Regular periods have numbers, others (eg, homeroom and mincha) are null.

              -
              - - -
              -

              Implementation

              -
              List<Period> periods = [];
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleBuilderModel/preset.html b/docs/models/ScheduleBuilderModel/preset.html deleted file mode 100644 index a6be41b4d..000000000 --- a/docs/models/ScheduleBuilderModel/preset.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - preset property - ScheduleBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              preset
              - -
              - -
              - - - - -
              -
              - -

              preset property - Null safety -

              - -
              - Schedule? - preset -
              read / write
              - -
              - -
              -

              The schedule that this schedule is based on.

              -
              - - -
              -

              Implementation

              -
              Schedule? preset;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleBuilderModel/ready.html b/docs/models/ScheduleBuilderModel/ready.html deleted file mode 100644 index 00eeca4e0..000000000 --- a/docs/models/ScheduleBuilderModel/ready.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - ready property - ScheduleBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ready
              - -
              - -
              - - - - -
              -
              - -

              ready property - Null safety -

              - - - -
              - -
              - bool - ready - - -
              - - -
              -

              Whether this schedule is ready to be built.

              -
              - - -
              -

              Implementation

              -
              bool get ready => numPeriods > 0
              -	&& periods.isNotEmpty
              -	&& name != null && name!.isNotEmpty
              -	&& !Schedule.schedules.any((Schedule other) => other.name == name);
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleBuilderModel/replaceTime.html b/docs/models/ScheduleBuilderModel/replaceTime.html deleted file mode 100644 index b0cf9c0e0..000000000 --- a/docs/models/ScheduleBuilderModel/replaceTime.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - replaceTime method - ScheduleBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              replaceTime
              - -
              - -
              - - - - -
              -
              - -

              replaceTime method - Null safety -

              - -
              - - -void -replaceTime(
              1. int index,
              2. -
              3. Range range
              4. -
              ) - - - -
              - -
              -

              Switches out a time in periods with a new time.

              -
              - - - -
              -

              Implementation

              -
              void replaceTime(int index, Range range) {
              -	periods [index] = Period.raw(
              -		name: periods [index].name,
              -		time: range,
              -	);
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleBuilderModel/schedule.html b/docs/models/ScheduleBuilderModel/schedule.html deleted file mode 100644 index 093d747d5..000000000 --- a/docs/models/ScheduleBuilderModel/schedule.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - schedule property - ScheduleBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              schedule
              - -
              - -
              - - - - -
              -
              - -

              schedule property - Null safety -

              - - - -
              - -
              - Schedule - schedule - - -
              - - -
              -

              The schedule being built.

              -
              - - -
              -

              Implementation

              -
              Schedule get schedule => Schedule(name: name!, periods: periods);
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleBuilderModel/usePreset.html b/docs/models/ScheduleBuilderModel/usePreset.html deleted file mode 100644 index fe9d57225..000000000 --- a/docs/models/ScheduleBuilderModel/usePreset.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - usePreset method - ScheduleBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              usePreset
              - -
              - -
              - - - - -
              -
              - -

              usePreset method - Null safety -

              - -
              - - -void -usePreset(
              1. Schedule? schedule
              2. -
              ) - - - -
              - -
              -

              Sets properties of this schedule based on an existing schedule.

              -

              The schedule can then be fine-tuned afterwards.

              -
              - - - -
              -

              Implementation

              -
              void usePreset(Schedule? schedule) {
              -	if (schedule == null) {
              -		return;
              -	}
              -	preset = schedule;
              -	periods = List.of(schedule.periods);  // make a copy
              -	_name = schedule.name;
              -	_numPeriods = schedule.periods.length;
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel-class.html b/docs/models/ScheduleModel-class.html deleted file mode 100644 index df754a931..000000000 --- a/docs/models/ScheduleModel-class.html +++ /dev/null @@ -1,633 +0,0 @@ - - - - - - - - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ScheduleModel
              - -
              - -
              - - - - -
              -
              - -

              ScheduleModel class - Null safety - -

              - - -
              -

              A data model for the user's schedule.

              -
              - - - -
              -

              Constructors

              - -
              -
              - ScheduleModel() -
              -
              - -
              -
              -
              - -
              -

              Properties

              - -
              -
              - calendar - ↔ List<List<Day?>> - -
              -
              - The calendar for the month. -
              read / write
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - hasSchool - → bool - -
              -
              - Whether there is school today. -
              read-only
              - -
              - -
              - nextPeriod - Period? - -
              -
              - The next period. -
              read / write
              - -
              - -
              - nextSubject - Subject? - -
              -
              - The next subject. -
              read-only
              - -
              - -
              - period - Period? - -
              -
              - The current period. -
              read / write
              - -
              - -
              - periodIndex - ↔ int? - -
              -
              - The index that represents period's location in periods. -
              read / write
              - -
              - -
              - periods - ↔ List<Period>? - -
              -
              - A list of today's periods. -
              read / write
              - -
              - -
              - reminders - Reminders - -
              -
              - The reminders data model. -
              read / write
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              - subject - Subject? - -
              -
              - The current subject. -
              read-only
              - -
              - -
              - subjects - ↔ Map<String, Subject> - -
              -
              - The subjects this user has. -
              read / write
              - -
              - -
              - timer - ↔ Timer? - -
              -
              - A timer that updates the period. [...] -
              read / write
              - -
              - -
              - today - Day? - -
              -
              - The Day that represents today. -
              read / write
              - -
              - -
              - user - User - -
              -
              - The current user. -
              read / write
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              override
              - -
              - -
              - init() - → Future<void> - - - -
              -
              - Gets whatever data is needed by this model from a service. [...] - - -
              - -
              - initCalendar() - → Future<void> - - - -
              -
              - Initializes the calendar. - - -
              - -
              - isValidReminder(Reminder reminder) - → bool - - - -
              -
              - Determines whether a reminder is compatible with the user's schedule. [...] - - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - onNewPeriod({bool first = false}) - → void - - - -
              -
              - Updates the current period. - - -
              - -
              - remindersListener() - → void - - - -
              -
              - A callback that runs whenever the reminders data model changes. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - scheduleReminders() - → Future<void> - - - -
              -
              - Schedules notifications for today's reminders. [...] - - -
              - -
              - setToday() - → void - - - -
              -
              - Changes the current day. [...] - - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              - updateReminders({bool scheduleNotifications = false}) - → void - - - -
              -
              - Updates the reminders given the current period. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Static Properties

              - -
              -
              - now - ↔ DateTime - -
              -
              - The current date. [...] -
              read / write
              - -
              - -
              -
              - - -
              -

              Constants

              - -
              -
              - timerInterval - → const Duration - - -
              -
              - How often to refresh the schedule. - - -
              - Duration(minutes: 1) -
              -
              - -
              -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/ScheduleModel.html b/docs/models/ScheduleModel/ScheduleModel.html deleted file mode 100644 index 77d272267..000000000 --- a/docs/models/ScheduleModel/ScheduleModel.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - ScheduleModel constructor - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ScheduleModel
              - -
              - -
              - - - - -
              -
              - -

              ScheduleModel constructor - Null safety -

              - -
              - ScheduleModel() -
              - - - - - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/calendar.html b/docs/models/ScheduleModel/calendar.html deleted file mode 100644 index 2a57fae4d..000000000 --- a/docs/models/ScheduleModel/calendar.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - calendar property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              calendar
              - -
              - -
              - - - - -
              -
              - -

              calendar property - Null safety -

              - -
              - List<List<Day?>> - calendar -
              read / write
              - -
              - -
              -

              The calendar for the month.

              -
              - - -
              -

              Implementation

              -
              late List<List<Day?>> calendar;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/dispose.html b/docs/models/ScheduleModel/dispose.html deleted file mode 100644 index 887ce13c3..000000000 --- a/docs/models/ScheduleModel/dispose.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - dispose method - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              dispose
              - -
              - -
              - - - - -
              -
              - -

              dispose method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -void -dispose() - -
              override
              - -
              - -
              -

              Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed).

              -

              This method should only be called by the object's owner.

              -
              - - - -
              -

              Implementation

              -
              @override
              -void dispose() {
              -	Models.instance.reminders.removeListener(remindersListener);
              -	timer?.cancel();
              -	super.dispose();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/hasSchool.html b/docs/models/ScheduleModel/hasSchool.html deleted file mode 100644 index fc1472783..000000000 --- a/docs/models/ScheduleModel/hasSchool.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - hasSchool property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              hasSchool
              - -
              - -
              - - - - -
              -
              - -

              hasSchool property - Null safety -

              - - - -
              - -
              - bool - hasSchool - - -
              - - -
              -

              Whether there is school today.

              -
              - - -
              -

              Implementation

              -
              bool get hasSchool => today != null;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/init.html b/docs/models/ScheduleModel/init.html deleted file mode 100644 index a8f114644..000000000 --- a/docs/models/ScheduleModel/init.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - init method - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              init
              - -
              - -
              - - - - -
              -
              - -

              init method - Null safety -

              - -
              - -
              -
                -
              1. @override
              2. -
              -
              - -Future<void> -init() - - - -
              - -
              -

              Gets whatever data is needed by this model from a service.

              -

              This model may not function properly if this function is not called.

              -
              - - - -
              -

              Implementation

              -
              @override
              -Future<void> init() async {
              -	reminders = Models.instance.reminders
              -		..addListener(remindersListener);
              -	user = Models.instance.user.data;
              -	subjects = Models.instance.user.subjects;
              -	await initCalendar();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/initCalendar.html b/docs/models/ScheduleModel/initCalendar.html deleted file mode 100644 index d7b6d5d78..000000000 --- a/docs/models/ScheduleModel/initCalendar.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - initCalendar method - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              initCalendar
              - -
              - -
              - - - - -
              -
              - -

              initCalendar method - Null safety -

              - -
              - - -Future<void> -initCalendar() - - - -
              - -
              -

              Initializes the calendar.

              -
              - - - -
              -

              Implementation

              -
              Future<void> initCalendar() async {
              -	Schedule.schedules = [
              -		for (final Map json in await Services.instance.database.getSchedules())
              -			Schedule.fromJson(json)
              -	];
              -	calendar = Day.getCalendar(await Services.instance.database.calendar);
              -	setToday();
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/isValidReminder.html b/docs/models/ScheduleModel/isValidReminder.html deleted file mode 100644 index ae6bcce44..000000000 --- a/docs/models/ScheduleModel/isValidReminder.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - isValidReminder method - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              isValidReminder
              - -
              - -
              - - - - -
              -
              - -

              isValidReminder method - Null safety -

              - -
              - - -bool -isValidReminder(
              1. Reminder reminder
              2. -
              ) - - - -
              - -
              -

              Determines whether a reminder is compatible with the user's schedule.

              -

              If User.dayNames has changed, then reminders with PeriodReminderTime -might fail. Similarly, if the user changes classes, SubjectReminderTime -might fail. This method helps the app spot these inconsistencies and get -rid of the problematic reminders.

              -
              - - - -
              -

              Implementation

              -
              bool isValidReminder(Reminder reminder) {
              -	switch(reminder.time.type) {
              -		case ReminderTimeType.period:
              -			final PeriodReminderTime time = reminder.time as PeriodReminderTime;
              -			final Iterable<String> dayNames = user.schedule.keys;
              -			return dayNames.contains(time.dayName)
              -				&& int.parse(time.period) <= user.schedule [time.dayName]!.length;
              -		case ReminderTimeType.subject:
              -			final SubjectReminderTime time = reminder.time as SubjectReminderTime;
              -			return subjects.values.any((Subject subject) => subject.name == time.name);
              -		default: throw StateError("Reminder <$reminder> has invalid ReminderTime");
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/nextPeriod.html b/docs/models/ScheduleModel/nextPeriod.html deleted file mode 100644 index 6d1e5d070..000000000 --- a/docs/models/ScheduleModel/nextPeriod.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - nextPeriod property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              nextPeriod
              - -
              - -
              - - - - -
              -
              - -

              nextPeriod property - Null safety -

              - -
              - Period? - nextPeriod -
              read / write
              - -
              - -
              -

              The next period.

              -
              - - -
              -

              Implementation

              -
              Period? nextPeriod;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/nextSubject.html b/docs/models/ScheduleModel/nextSubject.html deleted file mode 100644 index 797b9f2c6..000000000 --- a/docs/models/ScheduleModel/nextSubject.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - nextSubject property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              nextSubject
              - -
              - -
              - - - - -
              -
              - -

              nextSubject property - Null safety -

              - - - -
              - -
              - Subject? - nextSubject - - -
              - - -
              -

              The next subject.

              -
              - - -
              -

              Implementation

              -
              Subject? get nextSubject => subjects [nextPeriod?.id];
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/now.html b/docs/models/ScheduleModel/now.html deleted file mode 100644 index 898548a91..000000000 --- a/docs/models/ScheduleModel/now.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - now property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              now
              - -
              - -
              - - - - -
              -
              - -

              now property - Null safety -

              - -
              - DateTime - now -
              read / write
              - -
              - -
              -

              The current date.

              -

              This helps track when the day has changed.

              -
              - - -
              -

              Implementation

              -
              static DateTime now = DateTime.now();
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/onNewPeriod.html b/docs/models/ScheduleModel/onNewPeriod.html deleted file mode 100644 index d93845615..000000000 --- a/docs/models/ScheduleModel/onNewPeriod.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - onNewPeriod method - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              onNewPeriod
              - -
              - -
              - - - - -
              -
              - -

              onNewPeriod method - Null safety -

              - -
              - - -void -onNewPeriod(
              1. {bool first = false}
              2. -
              ) - - - -
              - -
              -

              Updates the current period.

              -
              - - - -
              -

              Implementation

              -
              void onNewPeriod({bool first = false}) {
              -	final DateTime newDate = DateTime.now();
              -
              -	// Day changed. Probably midnight.
              -	if (newDate.day != now.day) {
              -		now = newDate;
              -		return setToday();
              -	}
              -
              -	// no school today.
              -	if (!hasSchool) {
              -		period = nextPeriod = periods = null;
              -		return;
              -	}
              -
              -	// So we have school today...
              -	final int? newIndex = today?.getCurrentPeriod();
              -
              -	// Maybe the day changed
              -	if (newIndex != null && newIndex == periodIndex) {
              -		return;
              -	}
              -
              -	// period changed since last checked.
              -	periodIndex = newIndex;
              -
              -	// School ended
              -	if (newIndex == null) {
              -		period = nextPeriod = null;
              -		return;
              -	}
              -
              -	// Period changed and there is still school.
              -	period = periods! [newIndex];
              -	nextPeriod = newIndex < periods!.length - 1
              -		? periods! [newIndex + 1]
              -		: null;
              -
              -	updateReminders(scheduleNotifications: first);
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/period.html b/docs/models/ScheduleModel/period.html deleted file mode 100644 index 49159f46a..000000000 --- a/docs/models/ScheduleModel/period.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - period property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              period
              - -
              - -
              - - - - -
              -
              - -

              period property - Null safety -

              - -
              - Period? - period -
              read / write
              - -
              - -
              -

              The current period.

              -
              - - -
              -

              Implementation

              -
              Period? period;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/periodIndex.html b/docs/models/ScheduleModel/periodIndex.html deleted file mode 100644 index 0c5e33a4f..000000000 --- a/docs/models/ScheduleModel/periodIndex.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - periodIndex property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              periodIndex
              - -
              - -
              - - - - -
              -
              - -

              periodIndex property - Null safety -

              - -
              - int? - periodIndex -
              read / write
              - -
              - -
              -

              The index that represents period's location in periods.

              -
              - - -
              -

              Implementation

              -
              int? periodIndex;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/periods.html b/docs/models/ScheduleModel/periods.html deleted file mode 100644 index 4cb29c4df..000000000 --- a/docs/models/ScheduleModel/periods.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - periods property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              periods
              - -
              - -
              - - - - -
              -
              - -

              periods property - Null safety -

              - -
              - List<Period>? - periods -
              read / write
              - -
              - -
              -

              A list of today's periods.

              -
              - - -
              -

              Implementation

              -
              List<Period>? periods;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/reminders.html b/docs/models/ScheduleModel/reminders.html deleted file mode 100644 index 0ebb58722..000000000 --- a/docs/models/ScheduleModel/reminders.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - reminders property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              reminders
              - -
              - -
              - - - - -
              -
              - -

              reminders property - Null safety -

              - -
              - Reminders - reminders -
              read / write
              - -
              - -
              -

              The reminders data model.

              -
              - - -
              -

              Implementation

              -
              late Reminders reminders;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/remindersListener.html b/docs/models/ScheduleModel/remindersListener.html deleted file mode 100644 index 1900a1a8c..000000000 --- a/docs/models/ScheduleModel/remindersListener.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - remindersListener method - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              remindersListener
              - -
              - -
              - - - - -
              -
              - -

              remindersListener method - Null safety -

              - -
              - - -void -remindersListener() - - - -
              - -
              -

              A callback that runs whenever the reminders data model changes.

              -

              See updateReminders.

              -
              - - - -
              -

              Implementation

              -
              void remindersListener() => updateReminders(scheduleNotifications: true);
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/scheduleReminders.html b/docs/models/ScheduleModel/scheduleReminders.html deleted file mode 100644 index f8bd9c8dc..000000000 --- a/docs/models/ScheduleModel/scheduleReminders.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - - scheduleReminders method - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              scheduleReminders
              - -
              - -
              - - - - -
              -
              - -

              scheduleReminders method - Null safety -

              - -
              - - -Future<void> -scheduleReminders() - - - -
              - -
              -

              Schedules notifications for today's reminders.

              -

              Starting from the current period, schedules a notification for the period -using Notifications.scheduleNotification

              -
              - - - -
              -

              Implementation

              -
              Future<void> scheduleReminders() async {
              -	Services.instance.notifications.cancelAll();
              -	final DateTime now = DateTime.now();
              -
              -	// No school today/right now
              -	if (!hasSchool || periodIndex == null || periods == null) {
              -		return;
              -	}
              -
              -	// For all periods starting from periodIndex, schedule applicable reminders.
              -	for (int index = periodIndex!; index < periods!.length; index++) {
              -		final Period period = periods! [index];
              -		for (final int reminderIndex in reminders.getReminders(
              -			period: period.name,
              -			subject: subjects [period.id]?.name,
              -			dayName: today?.name,
              -		)) {
              -			Services.instance.notifications.scheduleNotification(
              -				date: DateTime(
              -					now.year,
              -					now.month,
              -					now.day,
              -					period.time.start.hour,
              -					period.time.start.minutes,
              -				),
              -				notification: Notification.reminder(
              -					title: "New reminder",
              -					message: reminders.reminders [reminderIndex].message,
              -				)
              -			);
              -		}
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/setToday.html b/docs/models/ScheduleModel/setToday.html deleted file mode 100644 index f578fe496..000000000 --- a/docs/models/ScheduleModel/setToday.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - setToday method - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              setToday
              - -
              - -
              - - - - -
              -
              - -

              setToday method - Null safety -

              - -
              - - -void -setToday() - - - -
              - -
              -

              Changes the current day.

              -

              If there is school today, then schedules the time to update every period. -See onNewPeriod.

              -

              Only to be called when the day actually changes.

              -
              - - - -
              -

              Implementation

              -
              void setToday() {
              -	// initialize today
              -	today = Day.getDate(calendar, now);
              -	timer?.cancel();
              -	if (hasSchool) {
              -		// initialize periods.
              -		periods = user.getPeriods(today!);
              -		// initialize the current period.
              -		onNewPeriod(first: true);
              -		// initialize the timer. See comments for [timer].
              -		timer = Timer.periodic(
              -			timerInterval,
              -			(Timer timer) => onNewPeriod()
              -		);
              -	}
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/subject.html b/docs/models/ScheduleModel/subject.html deleted file mode 100644 index 6b90dab11..000000000 --- a/docs/models/ScheduleModel/subject.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - subject property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              subject
              - -
              - -
              - - - - -
              -
              - -

              subject property - Null safety -

              - - - -
              - -
              - Subject? - subject - - -
              - - -
              -

              The current subject.

              -
              - - -
              -

              Implementation

              -
              Subject? get subject => subjects [period?.id];
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/subjects.html b/docs/models/ScheduleModel/subjects.html deleted file mode 100644 index 502ba5616..000000000 --- a/docs/models/ScheduleModel/subjects.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - subjects property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              subjects
              - -
              - -
              - - - - -
              -
              - -

              subjects property - Null safety -

              - -
              - Map<String, Subject> - subjects -
              read / write
              - -
              - -
              -

              The subjects this user has.

              -
              - - -
              -

              Implementation

              -
              late Map<String, Subject> subjects;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/timer.html b/docs/models/ScheduleModel/timer.html deleted file mode 100644 index 98c42c06b..000000000 --- a/docs/models/ScheduleModel/timer.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - timer property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              timer
              - -
              - -
              - - - - -
              -
              - -

              timer property - Null safety -

              - -
              - Timer? - timer -
              read / write
              - -
              - -
              -

              A timer that updates the period.

              -

              This timer fires once every timerInterval, and calls onNewPeriod -when it does.

              -
              - - -
              -

              Implementation

              -
              Timer? timer;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/timerInterval-constant.html b/docs/models/ScheduleModel/timerInterval-constant.html deleted file mode 100644 index 7300d4b0e..000000000 --- a/docs/models/ScheduleModel/timerInterval-constant.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - timerInterval constant - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              timerInterval
              - -
              - -
              - - - - -
              -
              - -

              timerInterval constant - Null safety -

              - -
              - Duration - const timerInterval - - -
              - -
              -

              How often to refresh the schedule.

              -
              - - -
              -

              Implementation

              -
              static const timerInterval = Duration (minutes: 1);
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/today.html b/docs/models/ScheduleModel/today.html deleted file mode 100644 index ee29e32b1..000000000 --- a/docs/models/ScheduleModel/today.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - today property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              today
              - -
              - -
              - - - - -
              -
              - -

              today property - Null safety -

              - -
              - Day? - today -
              read / write
              - -
              - -
              -

              The Day that represents today.

              -
              - - -
              -

              Implementation

              -
              Day? today;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/updateReminders.html b/docs/models/ScheduleModel/updateReminders.html deleted file mode 100644 index 27308a04e..000000000 --- a/docs/models/ScheduleModel/updateReminders.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - updateReminders method - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              updateReminders
              - -
              - -
              - - - - -
              -
              - -

              updateReminders method - Null safety -

              - -
              - - -void -updateReminders(
              1. {bool scheduleNotifications = false}
              2. -
              ) - - - -
              - -
              -

              Updates the reminders given the current period.

              -

              Is responsible for updating Reminders.currentReminders, -Reminders.nextReminders and calling Reminders.markShown. Will also -schedule notifications if that has not been done yet today or as a -response to changed reminders. See scheduleReminders for more details -on scheduling notifications.

              -
              - - - -
              -

              Implementation

              -
              void updateReminders({bool scheduleNotifications = false}) {
              -	reminders
              -		..currentReminders = reminders.getReminders(
              -			period: period?.name,
              -			subject: subjects [period?.id]?.name,
              -			dayName: today?.name,
              -		)
              -		..nextReminders = reminders.getReminders(
              -			period: nextPeriod?.name,
              -			subject: subjects [nextPeriod?.id]?.name,
              -			dayName: today?.name,
              -		);
              -
              -	reminders.currentReminders.forEach(reminders.markShown);
              -
              -	if (scheduleNotifications) {
              -		Future(scheduleReminders);
              -	}
              -	notifyListeners();
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleModel/user.html b/docs/models/ScheduleModel/user.html deleted file mode 100644 index 04dfd404f..000000000 --- a/docs/models/ScheduleModel/user.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - user property - ScheduleModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              user
              - -
              - -
              - - - - -
              -
              - -

              user property - Null safety -

              - -
              - User - user -
              read / write
              - -
              - -
              -

              The current user.

              -
              - - -
              -

              Implementation

              -
              late User user;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleViewModel-class.html b/docs/models/ScheduleViewModel-class.html deleted file mode 100644 index 566c12216..000000000 --- a/docs/models/ScheduleViewModel-class.html +++ /dev/null @@ -1,417 +0,0 @@ - - - - - - - - ScheduleViewModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ScheduleViewModel
              - -
              - -
              - - - - -
              -
              - -

              ScheduleViewModel class - Null safety - -

              - - -
              -

              A view model for the schedule page.

              -
              - - -
              -
              - - -
              Mixed in types
              -
              - - - -
              -
              - -
              -

              Constructors

              - -
              -
              - ScheduleViewModel() -
              -
              - Initializes the view model. [...] -
              -
              -
              - -
              -

              Properties

              - -
              -
              - dataModel - ScheduleModel - -
              -
              - The schedule data model. [...] -
              final
              - -
              - -
              - date - ↔ DateTime - -
              -
              - Gets the date whose schedule the user is looking at -
              read / write
              - -
              - -
              - day - Day - -
              -
              - The day whose schedule is being shown in the UI. -
              read / write
              - -
              - -
              - defaultDay - Day - -
              -
              - The default Day for the UI. -
              read / write
              - -
              - -
              - hashCode - → int - -
              -
              - The hash code for this object. [...] -
              read-only, inherited
              - -
              - -
              - hasListeners - → bool - -
              -
              - Whether any listeners are currently registered. [...] -
              @protected, read-only, inherited
              - -
              - -
              - runtimeType - → Type - -
              -
              - A representation of the runtime type of the object. -
              read-only, inherited
              - -
              - -
              -
              - -
              -

              Methods

              -
              -
              - addListener(VoidCallback listener) - → void - - - -
              -
              - Register a closure to be called when the object changes. [...] -
              inherited
              - -
              - -
              - dispose() - → void - - - -
              -
              - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
              @mustCallSuper, inherited
              - -
              - -
              - noSuchMethod(Invocation invocation) - → dynamic - - - -
              -
              - Invoked when a non-existent method or property is accessed. [...] -
              inherited
              - -
              - -
              - notifyListeners() - → void - - - -
              -
              - Call all the registered listeners. [...] - - -
              - -
              - removeListener(VoidCallback listener) - → void - - - -
              -
              - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
              inherited
              - -
              - -
              - toString() - → String - - - -
              -
              - A string representation of this object. [...] -
              inherited
              - -
              - -
              - update({String? newName, Schedule? newSchedule, void onInvalidSchedule()?}) - → void - - - -
              -
              - Updates the UI to a new day given a new dayName or schedule. [...] - - -
              - -
              -
              - -
              -

              Operators

              -
              -
              - operator ==(Object other) - → bool - - - -
              -
              - The equality operator. [...] -
              inherited
              - -
              - -
              -
              - -
              -

              Static Properties

              - -
              -
              - defatulSchedule - Schedule - -
              -
              - The default Schedule for the UI. -
              read-only
              - -
              - -
              -
              - - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleViewModel/ScheduleViewModel.html b/docs/models/ScheduleViewModel/ScheduleViewModel.html deleted file mode 100644 index cbb9311ba..000000000 --- a/docs/models/ScheduleViewModel/ScheduleViewModel.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - ScheduleViewModel constructor - ScheduleViewModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              ScheduleViewModel
              - -
              - -
              - - - - -
              -
              - -

              ScheduleViewModel constructor - Null safety -

              - -
              - ScheduleViewModel() -
              - - -
              -

              Initializes the view model.

              -

              Also initializes the default day shown to the user. -If today is a school day, then use that. Otherwise, use the -defaults (see defatulSchedule).

              -
              - - - -
              -

              Implementation

              -
              ScheduleViewModel () : dataModel = Models.instance.schedule {
              -	defaultDay = Day(
              -		name: Models.instance.user.data.schedule.keys.first,
              -		schedule: defatulSchedule
              -	);
              -	day = dataModel.today ?? defaultDay;
              -}
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleViewModel/dataModel.html b/docs/models/ScheduleViewModel/dataModel.html deleted file mode 100644 index 3ce6759a4..000000000 --- a/docs/models/ScheduleViewModel/dataModel.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - dataModel property - ScheduleViewModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              dataModel
              - -
              - -
              - - - - -
              -
              - -

              dataModel property - Null safety -

              - -
              - ScheduleModel - dataModel -
              final
              - -
              - -
              -

              The schedule data model.

              -

              Used to retrieve the schedule for a given day.

              -
              - - -
              -

              Implementation

              -
              final ScheduleModel dataModel;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleViewModel/date.html b/docs/models/ScheduleViewModel/date.html deleted file mode 100644 index 74afb915d..000000000 --- a/docs/models/ScheduleViewModel/date.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - date property - ScheduleViewModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              date
              - -
              - -
              - - - - -
              -
              - -

              date property - Null safety -

              - - - -
              - -
              - DateTime - date - - -
              - - -
              -

              Gets the date whose schedule the user is looking at

              -
              - - -
              -

              Implementation

              -
              DateTime get date => _selectedDay;
              -
              - -
              - - - -
              - -
              - void - date=(DateTime date) - - -
              - - -
              -

              Attempts to set the UI to the schedule of the given day.

              -

              If there is no school on that day, then ArgumentError is thrown.

              -
              - - -
              -

              Implementation

              -
              set date(DateTime date) {
              -	// Get rid of time
              -	final DateTime justDate = DateTime.utc (
              -		date.year,
              -		date.month,
              -		date.day
              -	);
              -	final Day? selected = Day.getDate(dataModel.calendar, justDate);
              -	if (selected == null) {
              -		throw Exception("No School");
              -	}
              -	day = selected;
              -	_selectedDay = justDate;
              -	notifyListeners();
              -}
              -
              - -
              - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleViewModel/day.html b/docs/models/ScheduleViewModel/day.html deleted file mode 100644 index 2bbab477c..000000000 --- a/docs/models/ScheduleViewModel/day.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - day property - ScheduleViewModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              day
              - -
              - -
              - - - - -
              -
              - -

              day property - Null safety -

              - -
              - Day - day -
              read / write
              - -
              - -
              -

              The day whose schedule is being shown in the UI.

              -
              - - -
              -

              Implementation

              -
              late Day day;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleViewModel/defatulSchedule.html b/docs/models/ScheduleViewModel/defatulSchedule.html deleted file mode 100644 index 4bec49c0d..000000000 --- a/docs/models/ScheduleViewModel/defatulSchedule.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - defatulSchedule property - ScheduleViewModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              defatulSchedule
              - -
              - -
              - - - - -
              -
              - -

              defatulSchedule property - Null safety -

              - - - -
              - -
              - Schedule - defatulSchedule - - -
              - - -
              -

              The default Schedule for the UI.

              -
              - - -
              -

              Implementation

              -
              static Schedule get defatulSchedule => Schedule.schedules.first;
              -
              - -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleViewModel/defaultDay.html b/docs/models/ScheduleViewModel/defaultDay.html deleted file mode 100644 index a71b159f7..000000000 --- a/docs/models/ScheduleViewModel/defaultDay.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - defaultDay property - ScheduleViewModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              defaultDay
              - -
              - -
              - - - - -
              -
              - -

              defaultDay property - Null safety -

              - -
              - Day - defaultDay -
              read / write
              - -
              - -
              -

              The default Day for the UI.

              -
              - - -
              -

              Implementation

              -
              late Day defaultDay;
              -
              -
              -
              - - -
              - - - -
              - -
              - - ramaz - 2.1.1+1 - - - -
              - - - - - - - - - - - diff --git a/docs/models/ScheduleViewModel/update.html b/docs/models/ScheduleViewModel/update.html deleted file mode 100644 index db578c5be..000000000 --- a/docs/models/ScheduleViewModel/update.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - update method - ScheduleViewModel class - models library - Dart API - - - - - - - - - - - - - - - - -
              - -
              - - -
              update
              - -
              - -
              - - - - -
              -
              - -

              update method - Null safety -

              - -
              - - -void -update(
              1. {String? newName,
              2. -
              3. Schedule? newSchedule,
              4. -
              5. void onInvalidSchedule(
                  -)?}
                1. -
                ) - - - -
                - -
                -

                Updates the UI to a new day given a new dayName or schedule.

                -

                If the dayName is non-null, the schedule defaults to defatulSchedule.

                -
                - - - -
                -

                Implementation

                -
                void update({
                -	String? newName,
                -	Schedule? newSchedule,
                -	void Function()? onInvalidSchedule,
                -}) {
                -	final String name = newName ?? day.name;
                -	final Schedule schedule = newSchedule ?? day.schedule;
                -	day = Day(name: name, schedule: schedule);
                -	notifyListeners();
                -	try {
                -		// Just to see if the computation is possible.
                -		// TODO: Move the logic from ClassList here.
                -		Models.instance.schedule.user.getPeriods(day);
                -	} on RangeError { // ignore: avoid_catching_errors
                -		day = Day(name: day.name, schedule: defatulSchedule);
                -		if (onInvalidSchedule != null) {
                -			onInvalidSchedule();
                -		}
                -	}
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SortOption-class.html b/docs/models/SortOption-class.html deleted file mode 100644 index 937d51223..000000000 --- a/docs/models/SortOption-class.html +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - - SortOption enum - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                SortOption
                - -
                - -
                - - - - -
                -
                - -

                SortOption enum - Null safety - -

                - - -
                -

                Different ways to sort the sports calendar.

                -
                - - - -
                -

                Constants

                - -
                -
                - chronological - → const SortOption - - -
                -
                -

                Sorts the sports games chronologically.

                -

                Uses SportsGame.date.

                - - -
                - const SortOption(0) -
                -
                - -
                - sport - → const SortOption - - -
                -
                -

                Sorts the sports game by sport.

                -

                Uses SportsGame.sport.

                - - -
                - const SortOption(1) -
                -
                - -
                - values - → const List<SortOption> - - -
                -
                -

                A constant List of the values in this enum, in order of their declaration.

                - - -
                - const List<SortOption> -
                -
                - -
                -
                - - -
                -

                Properties

                - -
                -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                read-only, inherited
                - -
                - -
                - index - → int - -
                -
                -

                The integer index of this enum.

                -
                final
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - toString() - → String - - - -
                -
                - A string representation of this object. [...] - - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                inherited
                - -
                - -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SortOption/hashCode.html b/docs/models/SortOption/hashCode.html deleted file mode 100644 index 2fb45b0ec..000000000 --- a/docs/models/SortOption/hashCode.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - hashCode property - SortOption extension - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                hashCode
                - -
                - -
                - - - - -
                -
                -

                hashCode property - Null safety -

                - - - -
                - -
                - int - hashCode -
                inherited
                - -
                - - -
                -

                The hash code for this object.

                -

                A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                -

                All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                -

                If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                -

                Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                -

                Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                -

                If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                -
                - - -
                -

                Implementation

                -
                external int get hashCode;
                -
                - -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SortOption/noSuchMethod.html b/docs/models/SortOption/noSuchMethod.html deleted file mode 100644 index 2ce213f69..000000000 --- a/docs/models/SortOption/noSuchMethod.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - noSuchMethod method - SortOption extension - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                noSuchMethod
                - -
                - -
                - - - - -
                -
                -

                noSuchMethod method - Null safety -

                - -
                - - -dynamic -noSuchMethod(
                1. Invocation invocation
                2. -
                ) - -
                inherited
                - -
                - -
                -

                Invoked when a non-existent method or property is accessed.

                -

                A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                -
                dynamic object = 1;
                -object.add(42); // Statically allowed, run-time error
                -
                -

                This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                -

                Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                -

                A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                -
                class MockList<T> implements List<T> {
                -  noSuchMethod(Invocation invocation) {
                -    log(invocation);
                -    super.noSuchMethod(invocation); // Will throw.
                -  }
                -}
                -void main() {
                -  MockList().add(42);
                -}
                -
                -

                This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                -

                If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                -

                The default behavior is to throw a NoSuchMethodError.

                -
                - - - -
                -

                Implementation

                -
                @pragma("vm:entry-point")
                -external dynamic noSuchMethod(Invocation invocation);
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SortOption/operator_equals.html b/docs/models/SortOption/operator_equals.html deleted file mode 100644 index 68aff6167..000000000 --- a/docs/models/SortOption/operator_equals.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - operator == method - SortOption extension - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                operator ==
                - -
                - -
                - - - - -
                -
                -

                operator == method - Null safety -

                - -
                - - -bool -operator ==(
                1. Object other
                2. -
                ) - -
                inherited
                - -
                - -
                -

                The equality operator.

                -

                The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                -

                Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                -
                  -
                • -

                  Total: It must return a boolean for all arguments. It should never throw.

                  -
                • -
                • -

                  Reflexive: For all objects o, o == o must be true.

                  -
                • -
                • -

                  Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                  -
                • -
                • -

                  Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                  -
                • -
                -

                The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                -

                If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                -
                - - - -
                -

                Implementation

                -
                external bool operator ==(Object other);
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SortOption/runtimeType.html b/docs/models/SortOption/runtimeType.html deleted file mode 100644 index ef836cf4b..000000000 --- a/docs/models/SortOption/runtimeType.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - runtimeType property - SortOption extension - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                runtimeType
                - -
                - -
                - - - - -
                -
                -

                runtimeType property - Null safety -

                - - - -
                - -
                - Type - runtimeType -
                inherited
                - -
                - - -
                -

                A representation of the runtime type of the object.

                -
                - - -
                -

                Implementation

                -
                external Type get runtimeType;
                -
                - -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SortOption/toString.html b/docs/models/SortOption/toString.html deleted file mode 100644 index c6d322b37..000000000 --- a/docs/models/SortOption/toString.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - toString method - SortOption extension - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                toString
                - -
                - -
                - - - - -
                -
                - -

                toString method - Null safety -

                - -
                - - -String -toString() - - - -
                - -
                -

                A string representation of this object.

                -

                Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                -

                Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                -
                - - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports-class.html b/docs/models/Sports-class.html deleted file mode 100644 index 313908eef..000000000 --- a/docs/models/Sports-class.html +++ /dev/null @@ -1,457 +0,0 @@ - - - - - - - - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                Sports
                - -
                - -
                - - - - -
                -
                - -

                Sports class - Null safety - -

                - - -
                -

                A data model for sports games.

                -

                This class hosts todayGames, a list of games being played today, -as well as CRUD methods for the database (if permissions allow).

                -
                - - - -
                -

                Constructors

                - -
                -
                - Sports() -
                -
                - -
                -
                -
                - -
                -

                Properties

                - -
                -
                - games - ↔ List<SportsGame> - -
                -
                - A list of all the games taking place. -
                read / write
                - -
                - -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                read-only, inherited
                - -
                - -
                - hasListeners - → bool - -
                -
                - Whether any listeners are currently registered. [...] -
                @protected, read-only, inherited
                - -
                - -
                - now - ↔ DateTime - -
                -
                - Helps partition games by past and future. -
                read / write
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                - timer - ↔ Timer - -
                -
                - A timer to refresh todayGames. -
                read / write
                - -
                - -
                - todayGames - ↔ List<int> - -
                -
                - A list of games being played today to be showed on the home screen. -
                read / write
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - addGame(SportsGame? game) - → Future<void> - - - -
                -
                - Adds a game to the database. - - -
                - -
                - addListener(VoidCallback listener) - → void - - - -
                -
                - Register a closure to be called when the object changes. [...] -
                inherited
                - -
                - -
                - delete(int index) - → Future<void> - - - -
                -
                - Deletes a game from the database. - - -
                - -
                - dispose() - → void - - - -
                -
                - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
                @mustCallSuper, inherited
                - -
                - -
                - getTodayGames() - → List<int> - - - -
                -
                - Returns a list of all the games taking place today. [...] - - -
                - -
                - init() - → Future<void> - - - -
                -
                - Loads data from the device and - - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - notifyListeners() - → void - - - -
                -
                - Call all the registered listeners. [...] - - -
                - -
                - removeListener(VoidCallback listener) - → void - - - -
                -
                - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
                inherited
                - -
                - -
                - replace(int index, SportsGame? newGame) - → Future<void> - - - -
                -
                - Replaces a game with another and saves it to the database. [...] - - -
                - -
                - saveGames() - → Future<void> - - - -
                -
                - Saves the games to the database. [...] - - -
                - -
                - toString() - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                inherited
                - -
                - -
                -
                - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/Sports.html b/docs/models/Sports/Sports.html deleted file mode 100644 index 206c22d4c..000000000 --- a/docs/models/Sports/Sports.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - Sports constructor - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                Sports
                - -
                - -
                - - - - -
                -
                - -

                Sports constructor - Null safety -

                - -
                - Sports() -
                - - - - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/addGame.html b/docs/models/Sports/addGame.html deleted file mode 100644 index 2a4f0c741..000000000 --- a/docs/models/Sports/addGame.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - addGame method - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                addGame
                - -
                - -
                - - - - -
                -
                - -

                addGame method - Null safety -

                - -
                - - -Future<void> -addGame(
                1. SportsGame? game
                2. -
                ) - - - -
                - -
                -

                Adds a game to the database.

                -
                - - - -
                -

                Implementation

                -
                Future<void> addGame(SportsGame? game) async {
                -	if (game == null) {
                -		return;
                -	}
                -	games.add(game);
                -	return saveGames();
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/delete.html b/docs/models/Sports/delete.html deleted file mode 100644 index e171bdce7..000000000 --- a/docs/models/Sports/delete.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - delete method - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                delete
                - -
                - -
                - - - - -
                -
                - -

                delete method - Null safety -

                - -
                - - -Future<void> -delete(
                1. int index
                2. -
                ) - - - -
                - -
                -

                Deletes a game from the database.

                -
                - - - -
                -

                Implementation

                -
                Future<void> delete(int index) {
                -	games.removeAt(index);
                -	return saveGames();
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/games.html b/docs/models/Sports/games.html deleted file mode 100644 index 34059904a..000000000 --- a/docs/models/Sports/games.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - games property - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                games
                - -
                - -
                - - - - -
                -
                - -

                games property - Null safety -

                - -
                - List<SportsGame> - games -
                read / write
                - -
                - -
                -

                A list of all the games taking place.

                -
                - - -
                -

                Implementation

                -
                List<SportsGame> games = [];
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/getTodayGames.html b/docs/models/Sports/getTodayGames.html deleted file mode 100644 index b9e2e8f71..000000000 --- a/docs/models/Sports/getTodayGames.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - getTodayGames method - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                getTodayGames
                - -
                - -
                - - - - -
                -
                - -

                getTodayGames method - Null safety -

                - -
                - - -List<int> -getTodayGames() - - - -
                - -
                -

                Returns a list of all the games taking place today.

                -

                The result should be saved to todayGames.

                -
                - - - -
                -

                Implementation

                -
                List<int> getTodayGames() => [
                -	for (final MapEntry<int, SportsGame> entry in games.asMap().entries)
                -		if (entry.value.date.isSameDay(DateTime.now()))
                -			entry.key,
                -];
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/init.html b/docs/models/Sports/init.html deleted file mode 100644 index 620337a75..000000000 --- a/docs/models/Sports/init.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - init method - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                init
                - -
                - -
                - - - - -
                -
                - -

                init method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -Future<void> -init() - - - -
                - -
                -

                Loads data from the device and

                -
                - - - -
                -

                Implementation

                -
                @override
                -Future<void> init() async {
                -	timer = Timer.periodic(_minute, (_) => todayGames = getTodayGames());
                -	games = SportsGame.fromList(await Services.instance.database.sports);
                -	todayGames = getTodayGames();
                -	now = DateTime.now();
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/now.html b/docs/models/Sports/now.html deleted file mode 100644 index 1d29a29a1..000000000 --- a/docs/models/Sports/now.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - now property - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                now
                - -
                - -
                - - - - -
                -
                - -

                now property - Null safety -

                - -
                - DateTime - now -
                read / write
                - -
                - -
                -

                Helps partition games by past and future.

                -
                - - -
                -

                Implementation

                -
                DateTime now = DateTime.now();
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/replace.html b/docs/models/Sports/replace.html deleted file mode 100644 index 3e0314adf..000000000 --- a/docs/models/Sports/replace.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - replace method - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                replace
                - -
                - -
                - - - - -
                -
                - -

                replace method - Null safety -

                - -
                - - -Future<void> -replace(
                1. int index,
                2. -
                3. SportsGame? newGame
                4. -
                ) - - - -
                - -
                -

                Replaces a game with another and saves it to the database.

                -

                Since SportsGame objects are immutable, they cannot be changed in place. -Instead, they are replaced with a new one.

                -
                - - - -
                -

                Implementation

                -
                Future<void> replace(int index, SportsGame? newGame) async {
                -	if (newGame == null) {
                -		return;
                -	}
                -	games [index] = newGame;
                -	return saveGames();
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/saveGames.html b/docs/models/Sports/saveGames.html deleted file mode 100644 index 1ba3b9580..000000000 --- a/docs/models/Sports/saveGames.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - saveGames method - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                saveGames
                - -
                - -
                - - - - -
                -
                - -

                saveGames method - Null safety -

                - -
                - - -Future<void> -saveGames() - - - -
                - -
                -

                Saves the games to the database.

                -

                Used in any database CRUD methods.

                -
                - - - -
                -

                Implementation

                -
                Future<void> saveGames() =>
                -	Services.instance.database.setSports(SportsGame.getJsonList(games));
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/timer.html b/docs/models/Sports/timer.html deleted file mode 100644 index 8630c7f1d..000000000 --- a/docs/models/Sports/timer.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - timer property - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                timer
                - -
                - -
                - - - - -
                -
                - -

                timer property - Null safety -

                - -
                - Timer - timer -
                read / write
                - -
                - -
                -

                A timer to refresh todayGames.

                -
                - - -
                -

                Implementation

                -
                late Timer timer;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/Sports/todayGames.html b/docs/models/Sports/todayGames.html deleted file mode 100644 index 73b17f1ea..000000000 --- a/docs/models/Sports/todayGames.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - todayGames property - Sports class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                todayGames
                - -
                - -
                - - - - -
                -
                - -

                todayGames property - Null safety -

                - -
                - List<int> - todayGames -
                read / write
                - -
                - -
                -

                A list of games being played today to be showed on the home screen.

                -
                - - -
                -

                Implementation

                -
                List<int> todayGames = [];
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel-class.html b/docs/models/SportsBuilderModel-class.html deleted file mode 100644 index 6c85aaf69..000000000 --- a/docs/models/SportsBuilderModel-class.html +++ /dev/null @@ -1,468 +0,0 @@ - - - - - - - - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                SportsBuilderModel
                - -
                - -
                - - - - -
                -
                - -

                SportsBuilderModel class - Null safety - -

                - - -
                -

                A ViewModel for the Sports game builder.

                -
                - - -
                -
                - - -
                Mixed in types
                -
                - - - -
                -
                - -
                -

                Constructors

                - -
                -
                - SportsBuilderModel([SportsGame? parent]) -
                -
                - Creates a ViewModel for the sports game builder page. [...] -
                -
                -
                - -
                -

                Properties

                - -
                -
                - away - ↔ bool - -
                -
                - Whether this game is being played away. [...] -
                read / write
                - -
                - -
                - date - ↔ DateTime? - -
                -
                - The date this game takes place. [...] -
                read / write
                - -
                - -
                - end - TimeOfDay? - -
                -
                - The time this game ends. [...] -
                read / write
                - -
                - -
                - game - SportsGame - -
                -
                - The game being created. -
                read-only
                - -
                - -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                read-only, inherited
                - -
                - -
                - hasListeners - → bool - -
                -
                - Whether any listeners are currently registered. [...] -
                @protected, read-only, inherited
                - -
                - -
                - loading - ↔ bool - -
                -
                - Whether the page is loading. -
                read / write
                - -
                - -
                - opponent - ↔ String? - -
                -
                - The name of the opponent school. [...] -
                read / write
                - -
                - -
                - ready - → bool - -
                -
                - Whether this game is ready to submit. -
                read-only
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                - scores - Scores? - -
                -
                - The scores for this game. [...] -
                read / write
                - -
                - -
                - sport - Sport? - -
                -
                - The sport being played. [...] -
                read / write
                - -
                - -
                - start - TimeOfDay? - -
                -
                - The time this game starts. [...] -
                read / write
                - -
                - -
                - team - ↔ String? - -
                -
                - The (home) team playing this game. [...] -
                read / write
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - addListener(VoidCallback listener) - → void - - - -
                -
                - Register a closure to be called when the object changes. [...] -
                inherited
                - -
                - -
                - dispose() - → void - - - -
                -
                - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
                @mustCallSuper, inherited
                - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - notifyListeners() - → void - - - -
                -
                - Call all the registered listeners. [...] - - -
                - -
                - removeListener(VoidCallback listener) - → void - - - -
                -
                - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
                inherited
                - -
                - -
                - toString() - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                inherited
                - -
                - -
                -
                - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/SportsBuilderModel.html b/docs/models/SportsBuilderModel/SportsBuilderModel.html deleted file mode 100644 index e5aa9427a..000000000 --- a/docs/models/SportsBuilderModel/SportsBuilderModel.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - SportsBuilderModel constructor - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                SportsBuilderModel
                - -
                - -
                - - - - -
                -
                - -

                SportsBuilderModel constructor - Null safety -

                - -
                - SportsBuilderModel(
                1. [SportsGame? parent]
                2. -
                ) -
                - - -
                -

                Creates a ViewModel for the sports game builder page.

                -

                Passing in a SportsGame for parent will fill this page with all the -relevant properties of parent before building.

                -
                - - - -
                -

                Implementation

                -
                SportsBuilderModel([SportsGame? parent]) :
                -	_scores = parent?.scores,
                -	_sport = parent?.sport,
                -	_date = parent?.date,
                -	_start = parent?.times.start.asTimeOfDay,
                -	_end = parent?.times.end.asTimeOfDay,
                -	_opponent = parent?.opponent,
                -	_team = parent?.team,
                -	_away = !(parent?.isHome ?? true);
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/away.html b/docs/models/SportsBuilderModel/away.html deleted file mode 100644 index 527510909..000000000 --- a/docs/models/SportsBuilderModel/away.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - away property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                away
                - -
                - -
                - - - - -
                -
                - -

                away property - Null safety -

                - - - -
                - -
                - bool - away - - -
                - - -
                -

                Whether this game is being played away.

                -

                Changing this will update the page.

                -
                - - -
                -

                Implementation

                -
                bool get away => _away;
                -
                - -
                - - - -
                - -
                - void - away=(bool value) - - -
                - - - - -
                -

                Implementation

                -
                set away(bool value) {
                -	_away = value;
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/date.html b/docs/models/SportsBuilderModel/date.html deleted file mode 100644 index f02cd45e9..000000000 --- a/docs/models/SportsBuilderModel/date.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - date property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                date
                - -
                - -
                - - - - -
                -
                - -

                date property - Null safety -

                - - - -
                - -
                - DateTime? - date - - -
                - - -
                -

                The date this game takes place.

                -

                Changing this will update the page.

                -
                - - -
                -

                Implementation

                -
                DateTime? get date => _date;
                -
                - -
                - - - -
                - -
                - void - date=(DateTime? value) - - -
                - - - - -
                -

                Implementation

                -
                set date(DateTime? value) {
                -	_date = value;
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/end.html b/docs/models/SportsBuilderModel/end.html deleted file mode 100644 index 1af4ed48f..000000000 --- a/docs/models/SportsBuilderModel/end.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - end property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                end
                - -
                - -
                - - - - -
                -
                - -

                end property - Null safety -

                - - - -
                - -
                - TimeOfDay? - end - - -
                - - -
                -

                The time this game ends.

                -

                Changing this will update the page.

                -
                - - -
                -

                Implementation

                -
                TimeOfDay? get end => _end;
                -
                - -
                - - - -
                - -
                - void - end=(TimeOfDay? value) - - -
                - - - - -
                -

                Implementation

                -
                set end(TimeOfDay? value) {
                -	_end = value;
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/game.html b/docs/models/SportsBuilderModel/game.html deleted file mode 100644 index d48eb4a65..000000000 --- a/docs/models/SportsBuilderModel/game.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - game property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                game
                - -
                - -
                - - - - -
                -
                - -

                game property - Null safety -

                - - - -
                - -
                - SportsGame - game - - -
                - - -
                -

                The game being created.

                -
                - - -
                -

                Implementation

                -
                SportsGame get game => SportsGame(
                -	date: date!,
                -	isHome: !away,
                -	times: Range(start!.asTime, end!.asTime),
                -	team: team ?? "",
                -	opponent: opponent ?? "",
                -	sport: sport!,
                -	scores: scores,
                -);
                -
                - -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/loading.html b/docs/models/SportsBuilderModel/loading.html deleted file mode 100644 index d9aafef05..000000000 --- a/docs/models/SportsBuilderModel/loading.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - loading property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                loading
                - -
                - -
                - - - - -
                -
                - -

                loading property - Null safety -

                - - - -
                - -
                - bool - loading - - -
                - - -
                -

                Whether the page is loading.

                -
                - - -
                -

                Implementation

                -
                bool get loading => _loading;
                -
                - -
                - - - -
                - -
                - void - loading=(bool value) - - -
                - - - - -
                -

                Implementation

                -
                set loading(bool value) {
                -	_loading = value;
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/opponent.html b/docs/models/SportsBuilderModel/opponent.html deleted file mode 100644 index 0816bdf7a..000000000 --- a/docs/models/SportsBuilderModel/opponent.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - opponent property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                opponent
                - -
                - -
                - - - - -
                -
                - -

                opponent property - Null safety -

                - - - -
                - -
                - String? - opponent - - -
                - - -
                -

                The name of the opponent school.

                -

                Changing this will update the page.

                -
                - - -
                -

                Implementation

                -
                String? get opponent => _opponent;
                -
                - -
                - - - -
                - -
                - void - opponent=(String? value) - - -
                - - - - -
                -

                Implementation

                -
                set opponent(String? value) {
                -	_opponent = value;
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/ready.html b/docs/models/SportsBuilderModel/ready.html deleted file mode 100644 index 665f24f57..000000000 --- a/docs/models/SportsBuilderModel/ready.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - ready property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                ready
                - -
                - -
                - - - - -
                -
                - -

                ready property - Null safety -

                - - - -
                - -
                - bool - ready - - -
                - - -
                -

                Whether this game is ready to submit.

                -
                - - -
                -

                Implementation

                -
                bool get ready => sport != null &&
                -	team != null &&
                -	date != null &&
                -	start != null &&
                -	end != null &&
                -	(opponent?.isNotEmpty ?? false);
                -
                - -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/scores.html b/docs/models/SportsBuilderModel/scores.html deleted file mode 100644 index 731d26e18..000000000 --- a/docs/models/SportsBuilderModel/scores.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - scores property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                scores
                - -
                - -
                - - - - -
                -
                - -

                scores property - Null safety -

                - - - -
                - -
                - Scores? - scores - - -
                - - -
                -

                The scores for this game.

                -

                This only applies if the game has already been finished.

                -

                Changing this will update the page.

                -
                - - -
                -

                Implementation

                -
                Scores? get scores => _scores;
                -
                - -
                - - - -
                - -
                - void - scores=(Scores? value) - - -
                - - - - -
                -

                Implementation

                -
                set scores(Scores? value) {
                -	_scores = value;
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/sport.html b/docs/models/SportsBuilderModel/sport.html deleted file mode 100644 index cc067b318..000000000 --- a/docs/models/SportsBuilderModel/sport.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - sport property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                sport
                - -
                - -
                - - - - -
                -
                - -

                sport property - Null safety -

                - - - -
                - -
                - Sport? - sport - - -
                - - -
                -

                The sport being played.

                -

                Changing this will update the page.

                -
                - - -
                -

                Implementation

                -
                Sport? get sport => _sport;
                -
                - -
                - - - -
                - -
                - void - sport=(Sport? value) - - -
                - - - - -
                -

                Implementation

                -
                set sport(Sport? value) {
                -	_sport = value;
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/start.html b/docs/models/SportsBuilderModel/start.html deleted file mode 100644 index 1fd352d50..000000000 --- a/docs/models/SportsBuilderModel/start.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - start property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                start
                - -
                - -
                - - - - -
                -
                - -

                start property - Null safety -

                - - - -
                - -
                - TimeOfDay? - start - - -
                - - -
                -

                The time this game starts.

                -

                Changing this will update the page.

                -
                - - -
                -

                Implementation

                -
                TimeOfDay? get start => _start;
                -
                - -
                - - - -
                - -
                - void - start=(TimeOfDay? value) - - -
                - - - - -
                -

                Implementation

                -
                set start(TimeOfDay? value) {
                -	_start = value;
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsBuilderModel/team.html b/docs/models/SportsBuilderModel/team.html deleted file mode 100644 index ee1bd5a4b..000000000 --- a/docs/models/SportsBuilderModel/team.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - team property - SportsBuilderModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                team
                - -
                - -
                - - - - -
                -
                - -

                team property - Null safety -

                - - - -
                - -
                - String? - team - - -
                - - -
                -

                The (home) team playing this game.

                -

                Changing this will update the page.

                -
                - - -
                -

                Implementation

                -
                String? get team => _team;
                -
                - -
                - - - -
                - -
                - void - team=(String? value) - - -
                - - - - -
                -

                Implementation

                -
                set team(String? value) {
                -	_team = value;
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel-class.html b/docs/models/SportsModel-class.html deleted file mode 100644 index b7813eecd..000000000 --- a/docs/models/SportsModel-class.html +++ /dev/null @@ -1,519 +0,0 @@ - - - - - - - - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                SportsModel
                - -
                - -
                - - - - -
                -
                - -

                SportsModel class - Null safety - -

                - - -
                -

                A view model for the sports page.

                -

                This class provides sorting methods for the games (sortGames) as well as -helpful properties for the admin version of this page (isAdmin and -loading).

                -
                - - -
                -
                - - -
                Mixed in types
                -
                - - - -
                -
                - -
                -

                Constructors

                - -
                -
                - SportsModel(Sports data) -
                -
                - Creates a view model for the sports page. -
                -
                -
                - -
                -

                Properties

                - -
                -
                - data - Sports - -
                -
                - The data model behind this view model. -
                final
                - -
                - -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                read-only, inherited
                - -
                - -
                - hasListeners - → bool - -
                -
                - Whether any listeners are currently registered. [...] -
                @protected, read-only, inherited
                - -
                - -
                - isAdmin - ↔ bool - -
                -
                - Whether the user is an admin. [...] -
                read / write
                - -
                - -
                - loading - ↔ bool - -
                -
                - Whether the page is loading. -
                read / write
                - -
                - -
                - recentBySport - ↔ Map<Sport, List<int>> - -
                -
                - Recent games sorted by sport. [...] -
                read / write
                - -
                - -
                - recents - ↔ List<int> - -
                -
                - A list of recent games. -
                read / write
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                - sortOption - SortOption - -
                -
                - The currently selected sorting option. -
                read / write
                - -
                - -
                - upcoming - ↔ List<int> - -
                -
                - A list of upcoming games. -
                read / write
                - -
                - -
                - upcomingBySport - ↔ Map<Sport, List<int>> - -
                -
                - Upcoming games sorted by sport. [...] -
                read / write
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - addListener(VoidCallback listener) - → void - - - -
                -
                - Register a closure to be called when the object changes. [...] -
                inherited
                - -
                - -
                - adminFunc(AsyncCallback func) - AsyncCallback - - - -
                -
                - Returns an function that shows loading animations while running. [...] - - -
                - -
                - dispose() - → void - - - -
                -
                - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
                override
                - -
                - -
                - divideGames() - → void - - - -
                -
                - Divides Sports.games into recents and upcoming. - - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - notifyListeners() - → void - - - -
                -
                - Call all the registered listeners. [...] - - -
                - -
                - removeListener(VoidCallback listener) - → void - - - -
                -
                - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
                inherited
                - -
                - -
                - setup() - → void - - - -
                -
                - Gathers data from data and prepares the page for building. - - -
                - -
                - sortByDate(int a, int b) - → int - - - -
                -
                - Helper function to sort games chronologically. [...] - - -
                - -
                - sortBySport(List<int> gamesList) - → Map<Sport, List<int>> - - - -
                -
                - Sorts a list of games by sports. [...] - - -
                - -
                - sortGames() - → void - - - -
                -
                - Sorts the page according to sortOption. [...] - - -
                - -
                - toString() - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                inherited
                - -
                - -
                -
                - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/SportsModel.html b/docs/models/SportsModel/SportsModel.html deleted file mode 100644 index ccf170ed3..000000000 --- a/docs/models/SportsModel/SportsModel.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - SportsModel constructor - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                SportsModel
                - -
                - -
                - - - - -
                -
                - -

                SportsModel constructor - Null safety -

                - -
                - SportsModel(
                1. Sports data
                2. -
                ) -
                - - -
                -

                Creates a view model for the sports page.

                -
                - - - -
                -

                Implementation

                -
                SportsModel(this.data) {
                -	Auth.isSportsAdmin.then(
                -		(bool value) {
                -			isAdmin = value;
                -			notifyListeners();
                -		}
                -	);
                -	data.addListener(setup);
                -	setup();
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/adminFunc.html b/docs/models/SportsModel/adminFunc.html deleted file mode 100644 index 7e31cb0ea..000000000 --- a/docs/models/SportsModel/adminFunc.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - adminFunc method - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                adminFunc
                - -
                - -
                - - - - -
                -
                - -

                adminFunc method - Null safety -

                - -
                - - -AsyncCallback -adminFunc(
                1. AsyncCallback func
                2. -
                ) - - - -
                - -
                -

                Returns an function that shows loading animations while running.

                -

                The newly-returned function will set loading to true, run func, -and then set loading to false. It can be used in the widget tree.

                -
                - - - -
                -

                Implementation

                -
                AsyncCallback adminFunc(AsyncCallback func) => () async {
                -	loading = true;
                -	await func();
                -	loading = false;
                -};
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/data.html b/docs/models/SportsModel/data.html deleted file mode 100644 index ee58c112e..000000000 --- a/docs/models/SportsModel/data.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - data property - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                data
                - -
                - -
                - - - - -
                -
                - -

                data property - Null safety -

                - -
                - Sports - data -
                final
                - -
                - -
                -

                The data model behind this view model.

                -
                - - -
                -

                Implementation

                -
                final Sports data;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/dispose.html b/docs/models/SportsModel/dispose.html deleted file mode 100644 index 37481b358..000000000 --- a/docs/models/SportsModel/dispose.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - dispose method - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                dispose
                - -
                - -
                - - - - -
                -
                - -

                dispose method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -void -dispose() - -
                override
                - -
                - -
                -

                Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed).

                -

                This method should only be called by the object's owner.

                -
                - - - -
                -

                Implementation

                -
                @override
                -void dispose() {
                -	data.removeListener(setup);
                -	super.dispose();
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/divideGames.html b/docs/models/SportsModel/divideGames.html deleted file mode 100644 index b72eda790..000000000 --- a/docs/models/SportsModel/divideGames.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - divideGames method - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                divideGames
                - -
                - -
                - - - - -
                -
                - -

                divideGames method - Null safety -

                - -
                - - -void -divideGames() - - - -
                - -
                -

                Divides Sports.games into recents and upcoming.

                -
                - - - -
                -

                Implementation

                -
                void divideGames() {
                -	recents = [];
                -	upcoming = [];
                -	final DateTime now = DateTime.now();
                -	for (final MapEntry<int, SportsGame> entry in data.games.asMap().entries) {
                -		(entry.value.dateTime.isAfter(now) ? upcoming : recents).add(entry.key);
                -	}
                -	recents.sort(sortByDate);
                -	upcoming.sort(sortByDate);
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/isAdmin.html b/docs/models/SportsModel/isAdmin.html deleted file mode 100644 index 0292e9121..000000000 --- a/docs/models/SportsModel/isAdmin.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - isAdmin property - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                isAdmin
                - -
                - -
                - - - - -
                -
                - -

                isAdmin property - Null safety -

                - -
                - bool - isAdmin -
                read / write
                - -
                - -
                -

                Whether the user is an admin.

                -

                This will allow widgets to give the user options to change some entries.

                -
                - - -
                -

                Implementation

                -
                bool isAdmin = false;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/loading.html b/docs/models/SportsModel/loading.html deleted file mode 100644 index 9d5323d5f..000000000 --- a/docs/models/SportsModel/loading.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - loading property - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                loading
                - -
                - -
                - - - - -
                -
                - -

                loading property - Null safety -

                - - - -
                - -
                - bool - loading - - -
                - - -
                -

                Whether the page is loading.

                -
                - - -
                -

                Implementation

                -
                bool get loading => _loading;
                -
                - -
                - - - -
                - -
                - void - loading=(bool value) - - -
                - - - - -
                -

                Implementation

                -
                set loading(bool value) {
                -	_loading = value;
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/recentBySport.html b/docs/models/SportsModel/recentBySport.html deleted file mode 100644 index d8d0c2db7..000000000 --- a/docs/models/SportsModel/recentBySport.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - recentBySport property - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                recentBySport
                - -
                - -
                - - - - -
                -
                - -

                recentBySport property - Null safety -

                - -
                - Map<Sport, List<int>> - recentBySport -
                read / write
                - -
                - -
                -

                Recent games sorted by sport.

                -

                Generated by calling sortBySport with recents.

                -
                - - -
                -

                Implementation

                -
                Map<Sport, List<int>> recentBySport = {};
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/recents.html b/docs/models/SportsModel/recents.html deleted file mode 100644 index 097bdd665..000000000 --- a/docs/models/SportsModel/recents.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - recents property - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                recents
                - -
                - -
                - - - - -
                -
                - -

                recents property - Null safety -

                - -
                - List<int> - recents -
                read / write
                - -
                - -
                -

                A list of recent games.

                -
                - - -
                -

                Implementation

                -
                List<int> recents = [];
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/setup.html b/docs/models/SportsModel/setup.html deleted file mode 100644 index 801dcf193..000000000 --- a/docs/models/SportsModel/setup.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - setup method - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                setup
                - -
                - -
                - - - - -
                -
                - -

                setup method - Null safety -

                - -
                - - -void -setup() - - - -
                - -
                -

                Gathers data from data and prepares the page for building.

                -
                - - - -
                -

                Implementation

                -
                void setup() {
                -	divideGames();
                -	sortGames();
                -	notifyListeners();
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/sortByDate.html b/docs/models/SportsModel/sortByDate.html deleted file mode 100644 index 24460e39e..000000000 --- a/docs/models/SportsModel/sortByDate.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - sortByDate method - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                sortByDate
                - -
                - -
                - - - - -
                -
                - -

                sortByDate method - Null safety -

                - -
                - - -int -sortByDate(
                1. int a,
                2. -
                3. int b
                4. -
                ) - - - -
                - -
                -

                Helper function to sort games chronologically.

                -

                See Comparator and Comparable.compareTo for how to sort in Dart.

                -
                - - - -
                -

                Implementation

                -
                int sortByDate(int a, int b) =>
                -	data.games [a].dateTime.compareTo(data.games [b].dateTime);
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/sortBySport.html b/docs/models/SportsModel/sortBySport.html deleted file mode 100644 index 4833b6a84..000000000 --- a/docs/models/SportsModel/sortBySport.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - sortBySport method - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                sortBySport
                - -
                - -
                - - - - -
                -
                - -

                sortBySport method - Null safety -

                - -
                - - -Map<Sport, List<int>> -sortBySport(
                1. List<int> gamesList
                2. -
                ) - - - -
                - -
                -

                Sorts a list of games by sports.

                -

                The resulting map has all the sports as keys, and a list of games with -that sport as its values.

                -
                - - - -
                -

                Implementation

                -
                Map<Sport, List<int>> sortBySport(List<int> gamesList) {
                -	final Map<Sport, List<int>> result = {};
                -	for (final int index in gamesList) {
                -		final SportsGame game = data.games [index];
                -		if (!result.containsKey(game.sport)) {
                -			result [game.sport] = [index];
                -		} else {
                -			result [game.sport]!.add(index);
                -		}
                -	}
                -	for (final List<int> gamesList in result.values) {
                -		gamesList.sort(sortByDate);  // sort chronologically in place
                -	}
                -	return result;
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/sortGames.html b/docs/models/SportsModel/sortGames.html deleted file mode 100644 index 85d1ddc3f..000000000 --- a/docs/models/SportsModel/sortGames.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - sortGames method - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                sortGames
                - -
                - -
                - - - - -
                -
                - -

                sortGames method - Null safety -

                - -
                - - -void -sortGames() - - - -
                - -
                -

                Sorts the page according to sortOption.

                -

                By the time this function is called, recents and upcoming are already -sorted chronologically, so if sortOption equals -SortOption.chronological, nothing happens.

                -
                - - - -
                -

                Implementation

                -
                void sortGames() {
                -	switch (sortOption) {
                -		case SortOption.chronological: break;  // already sorted
                -		case SortOption.sport:
                -			recentBySport = sortBySport(recents);
                -			upcomingBySport = sortBySport(upcoming);
                -	}
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/sortOption.html b/docs/models/SportsModel/sortOption.html deleted file mode 100644 index e396abc23..000000000 --- a/docs/models/SportsModel/sortOption.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - sortOption property - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                sortOption
                - -
                - -
                - - - - -
                -
                - -

                sortOption property - Null safety -

                - - - -
                - -
                - SortOption - sortOption - - -
                - - -
                -

                The currently selected sorting option.

                -
                - - -
                -

                Implementation

                -
                SortOption get sortOption => _sortOption;
                -
                - -
                - - - -
                - -
                - void - sortOption=(SortOption value) - - -
                - - - - -
                -

                Implementation

                -
                set sortOption(SortOption value) {
                -	_sortOption = value;
                -	sortGames();
                -	notifyListeners();
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/upcoming.html b/docs/models/SportsModel/upcoming.html deleted file mode 100644 index 06554c54f..000000000 --- a/docs/models/SportsModel/upcoming.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - upcoming property - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                upcoming
                - -
                - -
                - - - - -
                -
                - -

                upcoming property - Null safety -

                - -
                - List<int> - upcoming -
                read / write
                - -
                - -
                -

                A list of upcoming games.

                -
                - - -
                -

                Implementation

                -
                List<int> upcoming = [];
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/SportsModel/upcomingBySport.html b/docs/models/SportsModel/upcomingBySport.html deleted file mode 100644 index f3e3ff500..000000000 --- a/docs/models/SportsModel/upcomingBySport.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - upcomingBySport property - SportsModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                upcomingBySport
                - -
                - -
                - - - - -
                -
                - -

                upcomingBySport property - Null safety -

                - -
                - Map<Sport, List<int>> - upcomingBySport -
                read / write
                - -
                - -
                -

                Upcoming games sorted by sport.

                -

                Generated by calling sortBySport with upcoming.

                -
                - - -
                -

                Implementation

                -
                Map<Sport, List<int>> upcomingBySport = {};
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/UserModel-class.html b/docs/models/UserModel-class.html deleted file mode 100644 index 75d53bb48..000000000 --- a/docs/models/UserModel-class.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - - - UserModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                UserModel
                - -
                - -
                - - - - -
                -
                - -

                UserModel class - Null safety - -

                - - -
                -

                A data model to hold and initialize the User object.

                -

                This data model doesn't really update, however it's a convenient place to -keep the user object. Any functionality relating to the admin is also -implemented here, so that the code for updating both the database and the -UI is in one place.

                -
                - - - -
                -

                Constructors

                - -
                -
                - UserModel() -
                -
                - -
                -
                -
                - -
                -

                Properties

                - -
                -
                - adminScopes - ↔ List<AdminScope>? - -
                -
                - The permissions this user has, if they are an administrator. -
                read / write
                - -
                - -
                - data - User - -
                -
                - The user object. -
                read / write
                - -
                - -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                read-only, inherited
                - -
                - -
                - hasListeners - → bool - -
                -
                - Whether any listeners are currently registered. [...] -
                @protected, read-only, inherited
                - -
                - -
                - isAdmin - → bool - -
                -
                - Whether this user is an admin. [...] -
                read-only
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                - subjects - ↔ Map<String, Subject> - -
                -
                - The subjects this user has. [...] -
                read / write
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - addListener(VoidCallback listener) - → void - - - -
                -
                - Register a closure to be called when the object changes. [...] -
                inherited
                - -
                - -
                - dispose() - → void - - - -
                -
                - Discards any resources used by the object. After this is called, the -object is not in a usable state and should be discarded (calls to -addListener and removeListener will throw after the object is -disposed). [...] -
                @mustCallSuper, inherited
                - -
                - -
                - init() - → Future<void> - - - -
                -
                - Gets whatever data is needed by this model from a service. [...] - - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - notifyListeners() - → void - - - -
                -
                - Call all the registered listeners. [...] - - -
                - -
                - removeListener(VoidCallback listener) - → void - - - -
                -
                - Remove a previously registered closure from the list of closures that are -notified when the object changes. [...] -
                inherited
                - -
                - -
                - toString() - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                inherited
                - -
                - -
                -
                - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/UserModel/UserModel.html b/docs/models/UserModel/UserModel.html deleted file mode 100644 index 18c893fa6..000000000 --- a/docs/models/UserModel/UserModel.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - UserModel constructor - UserModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                UserModel
                - -
                - -
                - - - - -
                -
                - -

                UserModel constructor - Null safety -

                - -
                - UserModel() -
                - - - - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/UserModel/adminScopes.html b/docs/models/UserModel/adminScopes.html deleted file mode 100644 index f49f09a67..000000000 --- a/docs/models/UserModel/adminScopes.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - adminScopes property - UserModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                adminScopes
                - -
                - -
                - - - - -
                -
                - -

                adminScopes property - Null safety -

                - -
                - List<AdminScope>? - adminScopes -
                read / write
                - -
                - -
                -

                The permissions this user has, if they are an administrator.

                -
                - - -
                -

                Implementation

                -
                List<AdminScope>? adminScopes;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/UserModel/data.html b/docs/models/UserModel/data.html deleted file mode 100644 index 8fbca5626..000000000 --- a/docs/models/UserModel/data.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - data property - UserModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                data
                - -
                - -
                - - - - -
                -
                - -

                data property - Null safety -

                - -
                - User - data -
                read / write
                - -
                - -
                -

                The user object.

                -
                - - -
                -

                Implementation

                -
                late User data;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/UserModel/init.html b/docs/models/UserModel/init.html deleted file mode 100644 index 6bee674b4..000000000 --- a/docs/models/UserModel/init.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - init method - UserModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                init
                - -
                - -
                - - - - -
                -
                - -

                init method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -Future<void> -init() - - - -
                - -
                -

                Gets whatever data is needed by this model from a service.

                -

                This model may not function properly if this function is not called.

                -
                - - - -
                -

                Implementation

                -
                @override
                -Future<void> init() async {
                -	data = User.fromJson(await Services.instance.database.user);
                -	subjects = Subject.getSubjects(
                -		await Services.instance.database.getSections(data.sectionIDs)
                -	);
                -	final List<String>? scopeStrings = await Auth.adminScopes;
                -	adminScopes = scopeStrings == null ? null : [
                -		for (final String scope in scopeStrings)
                -			parseAdminScope(scope)
                -	];
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/UserModel/isAdmin.html b/docs/models/UserModel/isAdmin.html deleted file mode 100644 index d6a6f61ee..000000000 --- a/docs/models/UserModel/isAdmin.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - isAdmin property - UserModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                isAdmin
                - -
                - -
                - - - - -
                -
                - -

                isAdmin property - Null safety -

                - - - -
                - -
                - bool - isAdmin - - -
                - - -
                -

                Whether this user is an admin.

                -

                Unlike Auth.isAdmin, which authenticates with the server, this getter -simply checks to see if adminScopes was initialized.

                -
                - - -
                -

                Implementation

                -
                bool get isAdmin => adminScopes != null;
                -
                - -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/UserModel/subjects.html b/docs/models/UserModel/subjects.html deleted file mode 100644 index 02116a050..000000000 --- a/docs/models/UserModel/subjects.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - subjects property - UserModel class - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                subjects
                - -
                - -
                - - - - -
                -
                - -

                subjects property - Null safety -

                - -
                - Map<String, Subject> - subjects -
                read / write
                - -
                - -
                -

                The subjects this user has.

                -

                For students this will be the courses they attend. For teachers, this -will be the courses they teach.

                -
                - - -
                -

                Implementation

                -
                late Map<String, Subject> subjects;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/models/models-library.html b/docs/models/models-library.html deleted file mode 100644 index 8923b90a1..000000000 --- a/docs/models/models-library.html +++ /dev/null @@ -1,321 +0,0 @@ - - - - - - - - models library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                models
                - -
                - -
                - - - - -
                -
                - -

                models library - Null safety - -

                - - -
                -

                An abstraction over data handling.

                -

                This library can be split into two separate components:

                -
                  -
                1. -

                  Data models.

                  -

                  Data models maintain the global state of the app. These models are -responsible for pulling data from data sources (using services), and -using that raw data to initialize data classes.

                  -

                  By canonicalizing a single source of truth for all data, code duplication -and race conditions are avoided.

                  -
                2. -
                3. -

                  View models.

                  -

                  View models maintain the state of a single part of the UI, for example, -a page, or dialog. These models dictate what properties and methods a -UI element needs, and provides them, as well as how and when to update -the UI. Pages, for example, can now be stateless, and simply rely on -the logic inherent in the view model to control their state.

                  -

                  The point of a view model is to map fields to static UI elements and -methods to interactive ones. Every button and label that depends on -state should depend on their corresponding view model.

                  -
                4. -
                -
                - - -
                -

                Classes

                - -
                -
                - AdminScheduleModel - -
                -
                - -
                - -
                - CalendarDay - -
                -
                - -
                - -
                - CalendarEditor - -
                -
                - A model to manage the calendar. [...] -
                - -
                - DayBuilderModel - -
                -
                - A view model for the creating a new Day. -
                - -
                - FeedbackModel - -
                -
                - A view model for the feedback page. -
                - -
                - HomeModel - -
                -
                - A view model for the home page. [...] -
                - -
                - Models - -
                -
                - Bundles all the data models together. [...] -
                - -
                - Reminders - -
                -
                - A DataModel that keeps the state of the user's reminders. [...] -
                - -
                - RemindersBuilderModel - -
                -
                - A view model for the dialog that allows the user to build a reminder. -
                - -
                - ScheduleBuilderModel - -
                -
                - A view model to create a Schedule. -
                - -
                - ScheduleModel - -
                -
                - A data model for the user's schedule. -
                - -
                - ScheduleViewModel - -
                -
                - A view model for the schedule page. -
                - -
                - Sports - -
                -
                - A data model for sports games. [...] -
                - -
                - SportsBuilderModel - -
                -
                - A ViewModel for the Sports game builder. -
                - -
                - SportsModel - -
                -
                - A view model for the sports page. [...] -
                - -
                - UserModel - -
                -
                - A data model to hold and initialize the User object. [...] -
                - -
                -
                - - - - - - -
                -

                Enums

                - -
                -
                - SortOption - -
                -
                - Different ways to sort the sports calendar. -
                - -
                -
                - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarPage-class.html b/docs/pages/AdminCalendarPage-class.html deleted file mode 100644 index a3d9374bf..000000000 --- a/docs/pages/AdminCalendarPage-class.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - AdminCalendarPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                AdminCalendarPage
                - -
                - -
                - - - - -
                -
                - -

                AdminCalendarPage class - Null safety - -

                - - -
                -

                A page for admins to modify the calendar in the database.

                -
                - - -
                -
                -
                Inheritance
                -
                - - - - - -
                -
                - -
                -

                Constructors

                - -
                -
                - AdminCalendarPage() -
                -
                - -
                const
                -
                -
                -
                - -
                -

                Properties

                - -
                -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                @nonVirtual, read-only, inherited
                - -
                - -
                - key - Key? - -
                -
                - Controls how one widget replaces another widget in the tree. [...] -
                final, inherited
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - createElement() - StatefulElement - - - -
                -
                - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                inherited
                - -
                - -
                - createState() - AdminCalendarState - - - -
                -
                - Creates the mutable state for this widget at a given location in the tree. [...] -
                override
                - -
                - -
                - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                -
                - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                @protected, inherited
                - -
                - -
                - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                -
                - Add additional properties associated with the node. [...] -
                inherited
                - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                -
                - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                inherited
                - -
                - -
                - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a string representation of this node and its descendants. [...] -
                inherited
                - -
                - -
                - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a one-line detailed description of the object. [...] -
                inherited
                - -
                - -
                - toStringShort() - → String - - - -
                -
                - A short, textual description of this widget. -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                @nonVirtual, inherited
                - -
                - -
                -
                - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarPage/AdminCalendarPage.html b/docs/pages/AdminCalendarPage/AdminCalendarPage.html deleted file mode 100644 index 6423709d7..000000000 --- a/docs/pages/AdminCalendarPage/AdminCalendarPage.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - AdminCalendarPage constructor - AdminCalendarPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                AdminCalendarPage
                - -
                - -
                - - - - -
                -
                - -

                AdminCalendarPage constructor - Null safety -

                - -
                const - AdminCalendarPage() -
                - - - - - -
                -

                Implementation

                -
                const AdminCalendarPage();
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarPage/createState.html b/docs/pages/AdminCalendarPage/createState.html deleted file mode 100644 index 0f10133d4..000000000 --- a/docs/pages/AdminCalendarPage/createState.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - createState method - AdminCalendarPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                createState
                - -
                - -
                - - - - -
                -
                - -

                createState method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -AdminCalendarState -createState() - -
                override
                - -
                - -
                -

                Creates the mutable state for this widget at a given location in the tree.

                -

                Subclasses should override this method to return a newly created -instance of their associated State subclass:

                -
                @override
                -_MyState createState() => _MyState();
                -
                -

                The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                -
                - - - -
                -

                Implementation

                -
                @override
                -AdminCalendarState createState() => AdminCalendarState();
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState-class.html b/docs/pages/AdminCalendarState-class.html deleted file mode 100644 index d7dc42fd3..000000000 --- a/docs/pages/AdminCalendarState-class.html +++ /dev/null @@ -1,558 +0,0 @@ - - - - - - - - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                AdminCalendarState
                - -
                - -
                - - - - -
                -
                - -

                AdminCalendarState class - Null safety - -

                - - - - -
                -
                -
                Inheritance
                -
                - - - - - -
                -
                - -
                -

                Constructors

                - -
                -
                - AdminCalendarState() -
                -
                - -
                -
                -
                - -
                -

                Properties

                - -
                -
                - context - BuildContext - -
                -
                - The location in the tree where this widget builds. [...] -
                read-only, inherited
                - -
                - -
                - currentMonth - ↔ int - -
                -
                - -
                read / write
                - -
                - -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                read-only, inherited
                - -
                - -
                - model - CalendarEditor - -
                -
                - -
                final
                - -
                - -
                - mounted - → bool - -
                -
                - Whether this State object is currently in a tree. [...] -
                read-only, inherited
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                - widget - AdminCalendarPage - -
                -
                - The current configuration. [...] -
                read-only, inherited
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - build(BuildContext context) - Widget - - - -
                -
                - Describes the part of the user interface represented by this widget. [...] -
                override
                - -
                - -
                - deactivate() - → void - - - -
                -
                - Called when this object is removed from the tree. [...] -
                @mustCallSuper, @protected, inherited
                - -
                - -
                - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                -
                - Add additional properties associated with the node. [...] -
                inherited
                - -
                - -
                - didChangeDependencies() - → void - - - -
                -
                - Called when a dependency of this State object changes. [...] -
                @mustCallSuper, @protected, inherited
                - -
                - -
                - didUpdateWidget(covariant AdminCalendarPage oldWidget) - → void - - - -
                -
                - Called whenever the widget configuration changes. [...] -
                @mustCallSuper, @protected, inherited
                - -
                - -
                - dispose() - → void - - - -
                -
                - Called when this object is removed from the tree permanently. [...] -
                override
                - -
                - -
                - initState() - → void - - - -
                -
                - Called when this object is inserted into the tree. [...] -
                override
                - -
                - -
                - listener() - → void - - - -
                -
                - - - -
                - -
                - loopMonth(int val) - → int - - - -
                -
                - - - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - reassemble() - → void - - - -
                -
                - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                @mustCallSuper, @protected, inherited
                - -
                - -
                - setState(VoidCallback fn) - → void - - - -
                -
                - Notify the framework that the internal state of this object has changed. [...] -
                @protected, inherited
                - -
                - -
                - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                -
                - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                inherited
                - -
                - -
                - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                - toStringShort() - → String - - - -
                -
                - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                inherited
                - -
                - -
                -
                - - - -
                -

                Constants

                - -
                -
                - months - → const List<String> - - -
                -
                - The months of the year. [...] - - -
                - ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", &… -
                -
                - -
                - weekdays - → const List<String> - - -
                -
                - The days of the week. [...] - - -
                - ["Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat"] -
                -
                - -
                -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState/AdminCalendarState.html b/docs/pages/AdminCalendarState/AdminCalendarState.html deleted file mode 100644 index 6a2dc1754..000000000 --- a/docs/pages/AdminCalendarState/AdminCalendarState.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - AdminCalendarState constructor - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                AdminCalendarState
                - -
                - -
                - - - - -
                -
                - -

                AdminCalendarState constructor - Null safety -

                - -
                - AdminCalendarState() -
                - - - - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState/build.html b/docs/pages/AdminCalendarState/build.html deleted file mode 100644 index d46238ff5..000000000 --- a/docs/pages/AdminCalendarState/build.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - - - build method - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                build
                - -
                - -
                - - - - -
                -
                - -

                build method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -Widget -build(
                1. BuildContext context
                2. -
                ) - -
                override
                - -
                - -
                -

                Describes the part of the user interface represented by this widget.

                -

                The framework calls this method in a number of different situations. For -example:

                - -

                This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                -

                The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                -

                Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                -

                The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                -

                Design discussion

                -

                Why is the build method on State, and not StatefulWidget?

                -

                Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                -

                For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                -

                Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                -

                Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                -
                class MyButton extends StatefulWidget {
                -  ...
                -  final Color color;
                -
                -  @override
                -  Widget build(BuildContext context, MyButtonState state) {
                -    ... () { print("color: $color"); } ...
                -  }
                -}
                -
                -

                For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                -

                In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                -
                class MyButtonState extends State<MyButton> {
                -  ...
                -  @override
                -  Widget build(BuildContext context) {
                -    ... () { print("color: ${widget.color}"); } ...
                -  }
                -}
                -
                -

                Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                -

                See also:

                -
                  -
                • StatefulWidget, which contains the discussion on performance considerations.
                • -
                -
                - - - -
                -

                Implementation

                -
                @override
                -Widget build(BuildContext context) => ResponsiveScaffold(
                -	drawer: const NavigationDrawer(),
                -	appBar: AppBar(title: const Text("Calendar")),
                -	bodyBuilder: (_) => Center(
                -		child: Column(
                -			mainAxisSize: MainAxisSize.min,
                -			mainAxisAlignment: MainAxisAlignment.center,
                -			children: [
                -				const SizedBox(height: 24),
                -				Row(
                -					children: [
                -						const Spacer(flex: 3),
                -						TextButton.icon(
                -							icon: const Icon(Icons.arrow_back),
                -							onPressed: () => currentMonth--,
                -							label: Text(months [loopMonth(currentMonth - 1)]),
                -						),
                -						const Spacer(flex: 2),
                -						Text(
                -							"${months [currentMonth]} ${model.years [currentMonth]}",
                -							style: Theme.of(context).textTheme.headline4,
                -						),
                -						const Spacer(flex: 2),
                -						TextButton.icon(
                -							// icon always goes to the left of the label
                -							// since they're both widgets, we can swap them
                -							label: const Icon(Icons.arrow_forward),
                -							icon: Text(months [loopMonth(currentMonth + 1)]),
                -							onPressed: () => currentMonth++,
                -						),
                -						const Spacer(flex: 3),
                -					]
                -				),
                -				const SizedBox(height: 16),
                -				Row(
                -					mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                -					children: [
                -						for (final String weekday in weekdays)
                -							Text(weekday),
                -					]
                -				),
                -				Flexible(
                -					child: model.calendar [currentMonth] == null
                -						? const Center(child: CircularProgressIndicator())
                -						: GridView.count(
                -							padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
                -							shrinkWrap: true,
                -							childAspectRatio: 1.25,
                -							crossAxisCount: 7,
                -							children: [
                -								for (final CalendarDay? day in model.calendar [currentMonth]!)
                -									if (day == null) CalendarTile.blank
                -									else GestureDetector(
                -										onTap: () => showDialog(
                -											context: context,
                -											builder: (_) => DayBuilder(
                -												day: day.schoolDay,
                -												date: day.date,
                -												upload: (Day? value) => model.updateDay(
                -													day: value,
                -													date: day.date
                -												),
                -											)
                -										),
                -										child: CalendarTile(day: day.schoolDay, date: day.date),
                -									)
                -							]
                -						),
                -				)
                -			]
                -		)
                -	)
                -);
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState/currentMonth.html b/docs/pages/AdminCalendarState/currentMonth.html deleted file mode 100644 index 9193ca7f9..000000000 --- a/docs/pages/AdminCalendarState/currentMonth.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - currentMonth property - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                currentMonth
                - -
                - -
                - - - - -
                -
                - -

                currentMonth property - Null safety -

                - - - -
                - -
                - int - currentMonth - - -
                - - - - -
                -

                Implementation

                -
                int get currentMonth => _currentMonth;
                -
                - -
                - - - -
                - -
                - void - currentMonth=(int value) - - -
                - - - - -
                -

                Implementation

                -
                set currentMonth(int value) {
                -	_currentMonth = loopMonth(value);
                -	model.loadMonth(_currentMonth);  // will update later
                -	setState(() {});
                -}
                -
                - -
                - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState/dispose.html b/docs/pages/AdminCalendarState/dispose.html deleted file mode 100644 index cfb0e4eaf..000000000 --- a/docs/pages/AdminCalendarState/dispose.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - dispose method - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                dispose
                - -
                - -
                - - - - -
                -
                - -

                dispose method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -void -dispose() - -
                override
                - -
                - -
                -

                Called when this object is removed from the tree permanently.

                -

                The framework calls this method when this State object will never -build again. After the framework calls dispose, the State object is -considered unmounted and the mounted property is false. It is an error -to call setState at this point. This stage of the lifecycle is terminal: -there is no way to remount a State object that has been disposed.

                -

                Subclasses should override this method to release any resources retained -by this object (e.g., stop any active animations).

                -

                If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                -
                  -
                • In initState, subscribe to the object.
                • -
                • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                • -
                • In dispose, unsubscribe from the object.
                • -
                -

                If you override this, make sure to end your method with a call to -super.dispose().

                -

                See also:

                - -
                - - - -
                -

                Implementation

                -
                @override
                -void dispose() {
                -	model
                -		..removeListener(listener)
                -		..dispose();
                -	super.dispose();
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState/initState.html b/docs/pages/AdminCalendarState/initState.html deleted file mode 100644 index 06e9e6562..000000000 --- a/docs/pages/AdminCalendarState/initState.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - initState method - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                initState
                - -
                - -
                - - - - -
                -
                - -

                initState method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -void -initState() - -
                override
                - -
                - -
                -

                Called when this object is inserted into the tree.

                -

                The framework will call this method exactly once for each State object -it creates.

                -

                Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                -

                If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                -
                  -
                • In initState, subscribe to the object.
                • -
                • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                • -
                • In dispose, unsubscribe from the object.
                • -
                -

                You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                -

                If you override this, make sure your method starts with a call to -super.initState().

                -
                - - - -
                -

                Implementation

                -
                @override
                -void initState() {
                -	super.initState();
                -	model
                -		..addListener(listener)
                -		..loadMonth(_currentMonth);
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState/listener.html b/docs/pages/AdminCalendarState/listener.html deleted file mode 100644 index 45568152e..000000000 --- a/docs/pages/AdminCalendarState/listener.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - listener method - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                listener
                - -
                - -
                - - - - -
                -
                - -

                listener method - Null safety -

                - -
                - - -void -listener() - - - -
                - - - - -
                -

                Implementation

                -
                void listener() => setState(() {});
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState/loopMonth.html b/docs/pages/AdminCalendarState/loopMonth.html deleted file mode 100644 index d413a91b3..000000000 --- a/docs/pages/AdminCalendarState/loopMonth.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - loopMonth method - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                loopMonth
                - -
                - -
                - - - - -
                -
                - -

                loopMonth method - Null safety -

                - -
                - - -int -loopMonth(
                1. int val
                2. -
                ) - - - -
                - - - - -
                -

                Implementation

                -
                int loopMonth(int val) {
                -	if (val == 12) {
                -		return 0;
                -	} else if (val == -1) {
                -		return 11;
                -	} else {
                -		return val;
                -	}
                -}
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState/model.html b/docs/pages/AdminCalendarState/model.html deleted file mode 100644 index a8be4747c..000000000 --- a/docs/pages/AdminCalendarState/model.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - model property - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                model
                - -
                - -
                - - - - -
                -
                - -

                model property - Null safety -

                - -
                - CalendarEditor - model -
                final
                - -
                - - - -
                -

                Implementation

                -
                final CalendarEditor model = CalendarEditor();
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState/months-constant.html b/docs/pages/AdminCalendarState/months-constant.html deleted file mode 100644 index 64a99cc8c..000000000 --- a/docs/pages/AdminCalendarState/months-constant.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - months constant - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                months
                - -
                - -
                - - - - -
                -
                - -

                months constant - Null safety -

                - -
                - List<String> - const months - - -
                - -
                -

                The months of the year.

                -

                These will be the headers of all the months.

                -
                - - -
                -

                Implementation

                -
                static const List<String> months = [
                -	"January", "February", "March", "April", "May",
                -	"June", "July", "August", "September", "October",
                -	"November", "December"
                -];
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminCalendarState/weekdays-constant.html b/docs/pages/AdminCalendarState/weekdays-constant.html deleted file mode 100644 index e8833c96a..000000000 --- a/docs/pages/AdminCalendarState/weekdays-constant.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - weekdays constant - AdminCalendarState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                weekdays
                - -
                - -
                - - - - -
                -
                - -

                weekdays constant - Null safety -

                - -
                - List<String> - const weekdays - - -
                - -
                -

                The days of the week.

                -

                This will be used as the labels of the calendar.

                -
                - - -
                -

                Implementation

                -
                static const List<String> weekdays = [
                -	"Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat"
                -];
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminSchedulesPage-class.html b/docs/pages/AdminSchedulesPage-class.html deleted file mode 100644 index bc7dcee74..000000000 --- a/docs/pages/AdminSchedulesPage-class.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - AdminSchedulesPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                AdminSchedulesPage
                - -
                - -
                - - - - -
                -
                - -

                AdminSchedulesPage class - Null safety - -

                - - -
                -

                A page to show the admin's custom schedules.

                -
                - - -
                -
                -
                Inheritance
                -
                - - - - - -
                -
                - -
                -

                Constructors

                - -
                -
                - AdminSchedulesPage() -
                -
                - -
                const
                -
                -
                -
                - -
                -

                Properties

                - -
                -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                @nonVirtual, read-only, inherited
                - -
                - -
                - key - Key? - -
                -
                - Controls how one widget replaces another widget in the tree. [...] -
                final, inherited
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - build(BuildContext context) - Widget - - - -
                -
                - Describes the part of the user interface represented by this widget. [...] -
                override
                - -
                - -
                - createElement() - StatelessElement - - - -
                -
                - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                inherited
                - -
                - -
                - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                -
                - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                @protected, inherited
                - -
                - -
                - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                -
                - Add additional properties associated with the node. [...] -
                inherited
                - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                -
                - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                inherited
                - -
                - -
                - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a string representation of this node and its descendants. [...] -
                inherited
                - -
                - -
                - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a one-line detailed description of the object. [...] -
                inherited
                - -
                - -
                - toStringShort() - → String - - - -
                -
                - A short, textual description of this widget. -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                @nonVirtual, inherited
                - -
                - -
                -
                - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminSchedulesPage/AdminSchedulesPage.html b/docs/pages/AdminSchedulesPage/AdminSchedulesPage.html deleted file mode 100644 index b464eb8c5..000000000 --- a/docs/pages/AdminSchedulesPage/AdminSchedulesPage.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - AdminSchedulesPage constructor - AdminSchedulesPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                AdminSchedulesPage
                - -
                - -
                - - - - -
                -
                - -

                AdminSchedulesPage constructor - Null safety -

                - -
                const - AdminSchedulesPage() -
                - - - - - -
                -

                Implementation

                -
                const AdminSchedulesPage();
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/AdminSchedulesPage/build.html b/docs/pages/AdminSchedulesPage/build.html deleted file mode 100644 index 5f54bf510..000000000 --- a/docs/pages/AdminSchedulesPage/build.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - build method - AdminSchedulesPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                build
                - -
                - -
                - - - - -
                -
                - -

                build method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -Widget -build(
                1. BuildContext context
                2. -
                ) - -
                override
                - -
                - -
                -

                Describes the part of the user interface represented by this widget.

                -

                The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                -

                The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                -

                Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                -

                The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                -

                The implementation of this method must only depend on:

                - -

                If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                -

                See also:

                -
                  -
                • StatelessWidget, which contains the discussion on performance considerations.
                • -
                -
                - - - -
                -

                Implementation

                -
                @override
                -Widget build(BuildContext context) => ModelListener(
                -	model: () => AdminScheduleModel(),
                -	builder: (_, AdminScheduleModel model, __) => ResponsiveScaffold(
                -		appBar: AppBar(title: const Text("Custom schedules")),
                -		drawer: const NavigationDrawer(),
                -		floatingActionButton: FloatingActionButton(
                -			onPressed: () async {
                -				final Schedule? schedule = await ScheduleBuilder.buildSchedule(context);
                -				if (schedule == null) {
                -					return;
                -				}
                -				await model.createSchedule(schedule);
                -			},
                -			child: const Icon(Icons.add),
                -		),
                -		bodyBuilder: (_) => Padding(
                -			padding: const EdgeInsets.all(20),
                -			child: model.schedules.isEmpty
                -				? const Center (
                -					child: Text (
                -						"There are no schedules yet. Feel free to add one.",
                -						textScaleFactor: 1.5,
                -						textAlign: TextAlign.center,
                -					)
                -				)
                -				: ListView(
                -					children: [
                -						for (final Schedule schedule in model.schedules)
                -							ListTile(
                -								title: Text(schedule.name),
                -								onTap: () async {
                -									final Schedule? newSchedule =
                -										await ScheduleBuilder.buildSchedule(context, schedule);
                -									if (newSchedule != null) {
                -										await model.createSchedule(newSchedule);
                -									}
                -								},
                -							)
                -					]
                -			)
                -		)
                -	)
                -);
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/DayBuilder-class.html b/docs/pages/DayBuilder-class.html deleted file mode 100644 index 5b425a5e5..000000000 --- a/docs/pages/DayBuilder-class.html +++ /dev/null @@ -1,446 +0,0 @@ - - - - - - - - DayBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                DayBuilder
                - -
                - -
                - - - - -
                -
                - -

                DayBuilder class - Null safety - -

                - - -
                -

                A widget to guide the admin in modifying a day in the calendar.

                -

                Creates a pop-up that allows the admin to set the dayName and Schedule -for a given day in the calendar.

                -

                If day is provided, then the fields DayBuilderModel.name, -DayBuilderModel.schedule, are set to Day.name and Day.schedule.

                -
                - - -
                -
                -
                Inheritance
                -
                - - - - - -
                -
                - -
                -

                Constructors

                - -
                -
                - DayBuilder({required Day? day, required DateTime date, required Future<void> upload(Day?)}) -
                -
                - Creates a widget to guide the user in creating a Day -
                const
                -
                -
                -
                - -
                -

                Properties

                - -
                -
                - date - → DateTime - -
                -
                - -
                final
                - -
                - -
                - day - Day? - -
                -
                - The day to edit, if it already exists. -
                final
                - -
                - -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                @nonVirtual, read-only, inherited
                - -
                - -
                - key - Key? - -
                -
                - Controls how one widget replaces another widget in the tree. [...] -
                final, inherited
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                - upload - → Future<void> Function(Day?) - -
                -
                - -
                final
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - build(BuildContext context) - Widget - - - -
                -
                - Describes the part of the user interface represented by this widget. [...] -
                override
                - -
                - -
                - createElement() - StatelessElement - - - -
                -
                - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                inherited
                - -
                - -
                - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                -
                - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                @protected, inherited
                - -
                - -
                - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                -
                - Add additional properties associated with the node. [...] -
                inherited
                - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                -
                - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                inherited
                - -
                - -
                - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a string representation of this node and its descendants. [...] -
                inherited
                - -
                - -
                - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a one-line detailed description of the object. [...] -
                inherited
                - -
                - -
                - toStringShort() - → String - - - -
                -
                - A short, textual description of this widget. -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                @nonVirtual, inherited
                - -
                - -
                -
                - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/DayBuilder/DayBuilder.html b/docs/pages/DayBuilder/DayBuilder.html deleted file mode 100644 index e0b65ffd6..000000000 --- a/docs/pages/DayBuilder/DayBuilder.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - DayBuilder constructor - DayBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                DayBuilder
                - -
                - -
                - - - - -
                -
                - -

                DayBuilder constructor - Null safety -

                - -
                const - DayBuilder(
                1. {required Day? day,
                2. -
                3. required DateTime date,
                4. -
                5. required Future<void> upload(
                  1. Day?
                  2. -
                  -)}
                6. -
                ) -
                - - -
                -

                Creates a widget to guide the user in creating a Day

                -
                - - - -
                -

                Implementation

                -
                const DayBuilder({
                -	required this.day,
                -	required this.date,
                -	required this.upload
                -});
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/DayBuilder/build.html b/docs/pages/DayBuilder/build.html deleted file mode 100644 index 05fd16138..000000000 --- a/docs/pages/DayBuilder/build.html +++ /dev/null @@ -1,272 +0,0 @@ - - - - - - - - build method - DayBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                build
                - -
                - -
                - - - - -
                -
                - -

                build method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -Widget -build(
                1. BuildContext context
                2. -
                ) - -
                override
                - -
                - -
                -

                Describes the part of the user interface represented by this widget.

                -

                The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                -

                The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                -

                Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                -

                The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                -

                The implementation of this method must only depend on:

                - -

                If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                -

                See also:

                -
                  -
                • StatelessWidget, which contains the discussion on performance considerations.
                • -
                -
                - - - -
                -

                Implementation

                -
                @override
                -Widget build(BuildContext context) => ModelListener<DayBuilderModel>(
                -	model: () => DayBuilderModel(day: day, date: date),
                -	// ignore: sort_child_properties_last
                -	child: TextButton(
                -		onPressed: () => Navigator.of(context).pop(),
                -		child: const Text("Cancel"),
                -	),
                -	builder: (_, DayBuilderModel model, Widget? cancel) => AlertDialog(
                -		title: const Text("Edit day"),
                -		content: Column (
                -			mainAxisSize: MainAxisSize.min,
                -			children: [
                -				Text("Date: ${date.month}/${date.day}"),
                -				const SizedBox(height: 20),
                -				SwitchListTile(
                -					title: const Text("School?"),
                -					value: model.hasSchool,
                -					onChanged: (bool value) => model.hasSchool = value,
                -				),
                -				Container(
                -					width: double.infinity,
                -					child: Wrap (
                -						alignment: WrapAlignment.spaceBetween,
                -						crossAxisAlignment: WrapCrossAlignment.center,
                -						children: [
                -							const Text("Day", textAlign: TextAlign.center),
                -							DropdownButton<String>(
                -								value: model.name,
                -								hint: const Text("Day"),
                -								onChanged: !model.hasSchool ? null :
                -									(String? value) => model.name = value,
                -								items: [
                -									for (final String dayName in Models.instance.schedule.user.dayNames)
                -										DropdownMenuItem<String>(
                -											value: dayName,
                -											child: Text(dayName),
                -										)
                -								],
                -							)
                -						]
                -					),
                -				),
                -				const SizedBox(height: 20),
                -				Container(
                -					width: double.infinity,
                -					child: Wrap (
                -						runSpacing: 3,
                -						children: [
                -							const Text("Schedule"),
                -							DropdownButton<String>(
                -								value: model.schedule?.name,
                -								hint: const Text("Schedule"),
                -								onChanged: !model.hasSchool ? null : (String? value) =>
                -									model.schedule = Schedule.schedules.firstWhere(
                -										(Schedule schedule) => schedule.name == value
                -									),
                -								items: [
                -									for (final Schedule schedule in Schedule.schedules)
                -										DropdownMenuItem(
                -											value: schedule.name,
                -											child: Text(schedule.name),
                -										),
                -								],
                -							)
                -						]
                -					)
                -				)
                -			]
                -		),
                -		actions: [
                -			cancel!,
                -			ElevatedButton(
                -				onPressed: !model.ready ? null : () async {
                -					await upload(model.day);
                -					Navigator.of(context).pop();
                -				},
                -				child: const Text("Save", style: TextStyle(color: Colors.white)),
                -			)
                -		]
                -	),
                -);
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/DayBuilder/date.html b/docs/pages/DayBuilder/date.html deleted file mode 100644 index b95caea94..000000000 --- a/docs/pages/DayBuilder/date.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - date property - DayBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                date
                - -
                - -
                - - - - -
                -
                - -

                date property - Null safety -

                - -
                - DateTime - date -
                final
                - -
                - - - -
                -

                Implementation

                -
                final DateTime date;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/DayBuilder/day.html b/docs/pages/DayBuilder/day.html deleted file mode 100644 index 4123542f1..000000000 --- a/docs/pages/DayBuilder/day.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - day property - DayBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                day
                - -
                - -
                - - - - -
                -
                - -

                day property - Null safety -

                - -
                - Day? - day -
                final
                - -
                - -
                -

                The day to edit, if it already exists.

                -
                - - -
                -

                Implementation

                -
                final Day? day;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/DayBuilder/upload.html b/docs/pages/DayBuilder/upload.html deleted file mode 100644 index c3aa3365c..000000000 --- a/docs/pages/DayBuilder/upload.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - upload property - DayBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                upload
                - -
                - -
                - - - - -
                -
                - -

                upload property - Null safety -

                - -
                - Future<void> Function(Day?) - upload -
                final
                - -
                - - - -
                -

                Implementation

                -
                final Future<void> Function(Day?) upload;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FeedbackPage-class.html b/docs/pages/FeedbackPage-class.html deleted file mode 100644 index 6d210b9d3..000000000 --- a/docs/pages/FeedbackPage-class.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - FeedbackPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                FeedbackPage
                - -
                - -
                - - - - -
                -
                - -

                FeedbackPage class - Null safety - -

                - - -
                -

                A page to submit feedback.

                -
                - - -
                -
                -
                Inheritance
                -
                - - - - - -
                -
                - -
                -

                Constructors

                - -
                -
                - FeedbackPage() -
                -
                - -
                const
                -
                -
                -
                - -
                -

                Properties

                - -
                -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                @nonVirtual, read-only, inherited
                - -
                - -
                - key - Key? - -
                -
                - Controls how one widget replaces another widget in the tree. [...] -
                final, inherited
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - build(BuildContext context) - Widget - - - -
                -
                - Describes the part of the user interface represented by this widget. [...] -
                override
                - -
                - -
                - createElement() - StatelessElement - - - -
                -
                - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                inherited
                - -
                - -
                - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                -
                - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                @protected, inherited
                - -
                - -
                - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                -
                - Add additional properties associated with the node. [...] -
                inherited
                - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                -
                - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                inherited
                - -
                - -
                - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a string representation of this node and its descendants. [...] -
                inherited
                - -
                - -
                - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a one-line detailed description of the object. [...] -
                inherited
                - -
                - -
                - toStringShort() - → String - - - -
                -
                - A short, textual description of this widget. -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                @nonVirtual, inherited
                - -
                - -
                -
                - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FeedbackPage/FeedbackPage.html b/docs/pages/FeedbackPage/FeedbackPage.html deleted file mode 100644 index 30fe626e8..000000000 --- a/docs/pages/FeedbackPage/FeedbackPage.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - FeedbackPage constructor - FeedbackPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                FeedbackPage
                - -
                - -
                - - - - -
                -
                - -

                FeedbackPage constructor - Null safety -

                - -
                const - FeedbackPage() -
                - - - - - -
                -

                Implementation

                -
                const FeedbackPage();
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FeedbackPage/build.html b/docs/pages/FeedbackPage/build.html deleted file mode 100644 index ccb6fa0b2..000000000 --- a/docs/pages/FeedbackPage/build.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - build method - FeedbackPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                build
                - -
                - -
                - - - - -
                -
                - -

                build method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -Widget -build(
                1. BuildContext context
                2. -
                ) - -
                override
                - -
                - -
                -

                Describes the part of the user interface represented by this widget.

                -

                The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                -

                The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                -

                Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                -

                The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                -

                The implementation of this method must only depend on:

                - -

                If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                -

                See also:

                -
                  -
                • StatelessWidget, which contains the discussion on performance considerations.
                • -
                -
                - - - -
                -

                Implementation

                -
                @override
                -Widget build (BuildContext context) => ResponsiveScaffold(
                -	drawer: const NavigationDrawer(),
                -	appBar: AppBar(title: const Text ("Send Feedback")),
                -	bodyBuilder: (_) => ModelListener<FeedbackModel>(
                -		model: () => FeedbackModel(),
                -		builder: (BuildContext context, FeedbackModel model, _) => Center(
                -			child: SizedBox(
                -				width: 400,
                -				child: Column(
                -			mainAxisAlignment: MainAxisAlignment.center,
                -			crossAxisAlignment: CrossAxisAlignment.center,
                -			children: [
                -				TextField(
                -					autofocus: true,
                -					maxLength: 500,
                -					onChanged: (String text) => model.message = text,
                -					textCapitalization: TextCapitalization.sentences,
                -				),
                -				const SizedBox(height: 20),
                -				CheckboxListTile(
                -					value: model.anonymous,
                -					// If tristate == false (default), value != null
                -					onChanged: (bool? value) => model.anonymous = value!,
                -					title: const Text("Anonymous"),
                -					subtitle: const Text(
                -						"To keep your name and email hidden, check this box."
                -					)
                -				),
                -				const SizedBox(height: 50),
                -				ElevatedButton.icon(
                -					label: const Text ("Submit"),
                -					icon: const Icon(Icons.send),
                -					onPressed: !model.ready
                -						? null
                -						: () {
                -							model.send();
                -							Navigator.of(context).pop();
                -						}
                -					)
                -				]
                -			)
                -		)
                -	))
                -);
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FormRow-class.html b/docs/pages/FormRow-class.html deleted file mode 100644 index 624002777..000000000 --- a/docs/pages/FormRow-class.html +++ /dev/null @@ -1,462 +0,0 @@ - - - - - - - - FormRow class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                FormRow
                - -
                - -
                - - - - -
                -
                - -

                FormRow class - Null safety - -

                - - -
                -

                A row in a form.

                -

                Displays a title or header on the left, and a picker on the right.

                -
                - - -
                -
                -
                Inheritance
                -
                - - - - - -
                -
                - -
                -

                Constructors

                - -
                -
                - FormRow(String title, Widget picker, {bool sized = false}) -
                -
                - Creates a row in a form. -
                const
                -
                -
                - FormRow.editable({required String title, required VoidCallback setNewValue, required IconData whenNull, String? value}) -
                -
                - A FormRow where the right side is represented by an Icon [...] -
                -
                -
                - -
                -

                Properties

                - -
                -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                @nonVirtual, read-only, inherited
                - -
                - -
                - key - Key? - -
                -
                - Controls how one widget replaces another widget in the tree. [...] -
                final, inherited
                - -
                - -
                - moreSpace - → bool - -
                -
                - Whether this widget needs more space on the bottom. [...] -
                final
                - -
                - -
                - picker - Widget - -
                -
                - The picker for user input. -
                final
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                - sized - → bool - -
                -
                - Whether to constrict picker's size. -
                final
                - -
                - -
                - title - → String - -
                -
                - The title to show. -
                final
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - build(BuildContext context) - Widget - - - -
                -
                - Describes the part of the user interface represented by this widget. [...] -
                override
                - -
                - -
                - createElement() - StatelessElement - - - -
                -
                - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                inherited
                - -
                - -
                - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                -
                - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                @protected, inherited
                - -
                - -
                - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                -
                - Add additional properties associated with the node. [...] -
                inherited
                - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                -
                - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                inherited
                - -
                - -
                - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a string representation of this node and its descendants. [...] -
                inherited
                - -
                - -
                - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a one-line detailed description of the object. [...] -
                inherited
                - -
                - -
                - toStringShort() - → String - - - -
                -
                - A short, textual description of this widget. -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                @nonVirtual, inherited
                - -
                - -
                -
                - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FormRow/FormRow.editable.html b/docs/pages/FormRow/FormRow.editable.html deleted file mode 100644 index 197f81f16..000000000 --- a/docs/pages/FormRow/FormRow.editable.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - FormRow.editable constructor - FormRow class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                FormRow.editable
                - -
                - -
                - - - - -
                -
                - -

                FormRow.editable constructor - Null safety -

                - -
                - FormRow.editable(
                1. {required String title,
                2. -
                3. required VoidCallback setNewValue,
                4. -
                5. required IconData whenNull,
                6. -
                7. String? value}
                8. -
                ) -
                - - -
                -

                A FormRow where the right side is represented by an Icon

                -

                When value is null, whenNull is displayed. Otherwise, value is -displayed in a Text widget. Both widgets, when tapped, call -setNewValue.

                -
                - - - -
                -

                Implementation

                -
                FormRow.editable({
                -	required this.title,
                -	required VoidCallback setNewValue,
                -	required IconData whenNull,
                -	String? value,
                -}) :
                -	sized = false,
                -	moreSpace = true,
                -	picker = value == null
                -		? IconButton(
                -			icon: Icon(whenNull),
                -			onPressed: setNewValue
                -		)
                -		: InkWell(
                -			onTap: setNewValue,
                -			child: Text(
                -				value,
                -				style: const TextStyle(color: Colors.blue),
                -			),
                -		);
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FormRow/FormRow.html b/docs/pages/FormRow/FormRow.html deleted file mode 100644 index c09d3fa11..000000000 --- a/docs/pages/FormRow/FormRow.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - FormRow constructor - FormRow class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                FormRow
                - -
                - -
                - - - - -
                -
                - -

                FormRow constructor - Null safety -

                - -
                const - FormRow(
                1. String title,
                2. -
                3. Widget picker,
                4. -
                5. {bool sized = false}
                6. -
                ) -
                - - -
                -

                Creates a row in a form.

                -
                - - - -
                -

                Implementation

                -
                const FormRow(this.title, this.picker, {this.sized = false}) :
                -	moreSpace = false;
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FormRow/build.html b/docs/pages/FormRow/build.html deleted file mode 100644 index 94bf4d974..000000000 --- a/docs/pages/FormRow/build.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - build method - FormRow class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                build
                - -
                - -
                - - - - -
                -
                - -

                build method - Null safety -

                - -
                - -
                -
                  -
                1. @override
                2. -
                -
                - -Widget -build(
                1. BuildContext context
                2. -
                ) - -
                override
                - -
                - -
                -

                Describes the part of the user interface represented by this widget.

                -

                The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                -

                The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                -

                Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                -

                The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                -

                The implementation of this method must only depend on:

                - -

                If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                -

                See also:

                -
                  -
                • StatelessWidget, which contains the discussion on performance considerations.
                • -
                -
                - - - -
                -

                Implementation

                -
                @override
                -Widget build(BuildContext context) => Column(
                -	children: [
                -		Row(
                -			mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                -			children: [
                -				Text(title),
                -				const Spacer(),
                -				if (sized) Container(
                -					constraints: const BoxConstraints(
                -						maxWidth: 200,
                -						maxHeight: 75,
                -					),
                -					child: picker,
                -				)
                -				else picker
                -			]
                -		),
                -		SizedBox(height: moreSpace ? 25 : 15),
                -	]
                -);
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FormRow/moreSpace.html b/docs/pages/FormRow/moreSpace.html deleted file mode 100644 index afc37b482..000000000 --- a/docs/pages/FormRow/moreSpace.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - moreSpace property - FormRow class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                moreSpace
                - -
                - -
                - - - - -
                -
                - -

                moreSpace property - Null safety -

                - -
                - bool - moreSpace -
                final
                - -
                - -
                -

                Whether this widget needs more space on the bottom.

                -

                Widgets that use sized don't need this, since their picker is big -enough to provide padding on the bottom as well. Hence, this is only -set to true for widgets created with FormRow.editable(), since those -never use a big picker.

                -
                - - -
                -

                Implementation

                -
                final bool moreSpace;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FormRow/picker.html b/docs/pages/FormRow/picker.html deleted file mode 100644 index 15670fa2e..000000000 --- a/docs/pages/FormRow/picker.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - picker property - FormRow class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                picker
                - -
                - -
                - - - - -
                -
                - -

                picker property - Null safety -

                - -
                - Widget - picker -
                final
                - -
                - -
                -

                The picker for user input.

                -
                - - -
                -

                Implementation

                -
                final Widget picker;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FormRow/sized.html b/docs/pages/FormRow/sized.html deleted file mode 100644 index 960cecd49..000000000 --- a/docs/pages/FormRow/sized.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - sized property - FormRow class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                sized
                - -
                - -
                - - - - -
                -
                - -

                sized property - Null safety -

                - -
                - bool - sized -
                final
                - -
                - -
                -

                Whether to constrict picker's size.

                -
                - - -
                -

                Implementation

                -
                final bool sized;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/FormRow/title.html b/docs/pages/FormRow/title.html deleted file mode 100644 index d99c99424..000000000 --- a/docs/pages/FormRow/title.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - title property - FormRow class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                title
                - -
                - -
                - - - - -
                -
                - -

                title property - Null safety -

                - -
                - String - title -
                final
                - -
                - -
                -

                The title to show.

                -
                - - -
                -

                Implementation

                -
                final String title;
                -
                -
                -
                - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/GenericSportsView-class.html b/docs/pages/GenericSportsView-class.html deleted file mode 100644 index 657e9b467..000000000 --- a/docs/pages/GenericSportsView-class.html +++ /dev/null @@ -1,469 +0,0 @@ - - - - - - - - GenericSportsView class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                GenericSportsView
                - -
                - -
                - - - - -
                -
                - -

                GenericSportsView<T> class - Null safety - -

                - - -
                -

                A Swipe to Refresh list of SportsGames.

                -

                This is used to simplify the logic between games that are sorted -chronologically and by sport, since both will be split by past and -future games.

                -
                - - -
                -
                -
                Inheritance
                -
                - - - - - -
                -
                - -
                -

                Constructors

                - -
                -
                - GenericSportsView({required List<T> upcoming, required List<T> recents, required Widget builder(T), required Future<void> onRefresh(), required bool loading}) -
                -
                - Creates a list of SportsTiles. -
                const
                -
                -
                -
                - -
                -

                Properties

                - -
                -
                - builder - Widget Function(T) - -
                -
                - Builds a list of SportsTiles using upcoming and recents. -
                final
                - -
                - -
                - hashCode - → int - -
                -
                - The hash code for this object. [...] -
                @nonVirtual, read-only, inherited
                - -
                - -
                - key - Key? - -
                -
                - Controls how one widget replaces another widget in the tree. [...] -
                final, inherited
                - -
                - -
                - loading - → bool - -
                -
                - Whether to show a loading indicator. -
                final
                - -
                - -
                - onRefresh - → Future<void> Function() - -
                -
                - The function to call when the user refreshes the page. -
                final
                - -
                - -
                - recents - → List<T> - -
                -
                - A list of past games. [...] -
                final
                - -
                - -
                - runtimeType - → Type - -
                -
                - A representation of the runtime type of the object. -
                read-only, inherited
                - -
                - -
                - upcoming - → List<T> - -
                -
                - A list of upcoming games. [...] -
                final
                - -
                - -
                -
                - -
                -

                Methods

                -
                -
                - build(BuildContext context) - Widget - - - -
                -
                - Describes the part of the user interface represented by this widget. [...] -
                override
                - -
                - -
                - createElement() - StatelessElement - - - -
                -
                - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                inherited
                - -
                - -
                - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                -
                - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                @protected, inherited
                - -
                - -
                - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                -
                - Add additional properties associated with the node. [...] -
                inherited
                - -
                - -
                - noSuchMethod(Invocation invocation) - → dynamic - - - -
                -
                - Invoked when a non-existent method or property is accessed. [...] -
                inherited
                - -
                - -
                - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                -
                - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                inherited
                - -
                - -
                - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                -
                - A string representation of this object. [...] -
                inherited
                - -
                - -
                - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a string representation of this node and its descendants. [...] -
                inherited
                - -
                - -
                - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                -
                - Returns a one-line detailed description of the object. [...] -
                inherited
                - -
                - -
                - toStringShort() - → String - - - -
                -
                - A short, textual description of this widget. -
                inherited
                - -
                - -
                -
                - -
                -

                Operators

                -
                -
                - operator ==(Object other) - → bool - - - -
                -
                - The equality operator. [...] -
                @nonVirtual, inherited
                - -
                - -
                -
                - - - - -
                - - - -
                - -
                - - ramaz - 2.1.1+1 - - - -
                - - - - - - - - - - - diff --git a/docs/pages/GenericSportsView/GenericSportsView.html b/docs/pages/GenericSportsView/GenericSportsView.html deleted file mode 100644 index 566ec66ca..000000000 --- a/docs/pages/GenericSportsView/GenericSportsView.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - GenericSportsView constructor - GenericSportsView class - pages library - Dart API - - - - - - - - - - - - - - - - -
                - -
                - - -
                GenericSportsView
                - -
                - -
                - - - - -
                -
                - -

                GenericSportsView<T> constructor - Null safety -

                - -
                const - GenericSportsView<T>(
                1. {required List<T> upcoming,
                2. -
                3. required List<T> recents,
                4. -
                5. required Widget builder(
                  1. T
                  2. -
                  -),
                6. -
                7. required Future<void> onRefresh(
                    -),
                  1. -
                  2. required bool loading}
                  3. -
                  ) -
                  - - -
                  -

                  Creates a list of SportsTiles.

                  -
                  - - - -
                  -

                  Implementation

                  -
                  const GenericSportsView({
                  -	required this.upcoming,
                  -	required this.recents,
                  -	required this.builder,
                  -	required this.onRefresh,
                  -	required this.loading,
                  -});
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/GenericSportsView/build.html b/docs/pages/GenericSportsView/build.html deleted file mode 100644 index fc6492e35..000000000 --- a/docs/pages/GenericSportsView/build.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - build method - GenericSportsView class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  build
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  build method - Null safety -

                  - -
                  - -
                  -
                    -
                  1. @override
                  2. -
                  -
                  - -Widget -build(
                  1. BuildContext context
                  2. -
                  ) - -
                  override
                  - -
                  - -
                  -

                  Describes the part of the user interface represented by this widget.

                  -

                  The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                  -

                  The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                  -

                  Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                  -

                  The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                  -

                  The implementation of this method must only depend on:

                  - -

                  If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                  -

                  See also:

                  -
                    -
                  • StatelessWidget, which contains the discussion on performance considerations.
                  • -
                  -
                  - - - -
                  -

                  Implementation

                  -
                  @override
                  -Widget build(BuildContext context) => TabBarView(
                  -	children: [
                  -		for (final List<T> gamesList in [upcoming, recents])
                  -			RefreshIndicator(
                  -				onRefresh: onRefresh,
                  -				child: ListView(
                  -					children: [
                  -						if (loading)
                  -							const LinearProgressIndicator(),
                  -						for (final T game in gamesList)
                  -							builder(game)
                  -					]
                  -				)
                  -			)
                  -	]
                  -);
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/GenericSportsView/builder.html b/docs/pages/GenericSportsView/builder.html deleted file mode 100644 index 5fbe05c33..000000000 --- a/docs/pages/GenericSportsView/builder.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - builder property - GenericSportsView class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  builder
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  builder property - Null safety -

                  - -
                  - Widget Function(T) - builder -
                  final
                  - -
                  - -
                  -

                  Builds a list of SportsTiles using upcoming and recents.

                  -
                  - - -
                  -

                  Implementation

                  -
                  final Widget Function(T) builder;
                  -
                  -
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/GenericSportsView/loading.html b/docs/pages/GenericSportsView/loading.html deleted file mode 100644 index 747b49770..000000000 --- a/docs/pages/GenericSportsView/loading.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - loading property - GenericSportsView class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  loading
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  loading property - Null safety -

                  - -
                  - bool - loading -
                  final
                  - -
                  - -
                  -

                  Whether to show a loading indicator.

                  -
                  - - -
                  -

                  Implementation

                  -
                  final bool loading;
                  -
                  -
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/GenericSportsView/onRefresh.html b/docs/pages/GenericSportsView/onRefresh.html deleted file mode 100644 index 3f3cc1d8d..000000000 --- a/docs/pages/GenericSportsView/onRefresh.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - onRefresh property - GenericSportsView class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  onRefresh
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  onRefresh property - Null safety -

                  - -
                  - Future<void> Function() - onRefresh -
                  final
                  - -
                  - -
                  -

                  The function to call when the user refreshes the page.

                  -
                  - - -
                  -

                  Implementation

                  -
                  final Future<void> Function() onRefresh;
                  -
                  -
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/GenericSportsView/recents.html b/docs/pages/GenericSportsView/recents.html deleted file mode 100644 index c62abe4df..000000000 --- a/docs/pages/GenericSportsView/recents.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - recents property - GenericSportsView class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  recents
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  recents property - Null safety -

                  - -
                  - List<T> - recents -
                  final
                  - -
                  - -
                  -

                  A list of past games.

                  -

                  This can be any type as long as it can be used in builder to build -SportsTiles.

                  -
                  - - -
                  -

                  Implementation

                  -
                  final List<T> recents;
                  -
                  -
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/GenericSportsView/upcoming.html b/docs/pages/GenericSportsView/upcoming.html deleted file mode 100644 index 7ee16da75..000000000 --- a/docs/pages/GenericSportsView/upcoming.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - upcoming property - GenericSportsView class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  upcoming
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  upcoming property - Null safety -

                  - -
                  - List<T> - upcoming -
                  final
                  - -
                  - -
                  -

                  A list of upcoming games.

                  -

                  This can be any type as long as it can be used in builder to build -SportsTiles.

                  -
                  - - -
                  -

                  Implementation

                  -
                  final List<T> upcoming;
                  -
                  -
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/HomePage-class.html b/docs/pages/HomePage-class.html deleted file mode 100644 index 006bc237b..000000000 --- a/docs/pages/HomePage-class.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - HomePage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  HomePage
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  HomePage class - Null safety - -

                  - - - - -
                  -
                  -
                  Inheritance
                  -
                  - - - - - -
                  -
                  - -
                  -

                  Constructors

                  - -
                  -
                  - HomePage({int? pageIndex}) -
                  -
                  - -
                  const
                  -
                  -
                  -
                  - -
                  -

                  Properties

                  - -
                  -
                  - hashCode - → int - -
                  -
                  - The hash code for this object. [...] -
                  @nonVirtual, read-only, inherited
                  - -
                  - -
                  - key - Key? - -
                  -
                  - Controls how one widget replaces another widget in the tree. [...] -
                  final, inherited
                  - -
                  - -
                  - pageIndex - → int? - -
                  -
                  - -
                  final
                  - -
                  - -
                  - runtimeType - → Type - -
                  -
                  - A representation of the runtime type of the object. -
                  read-only, inherited
                  - -
                  - -
                  -
                  - -
                  -

                  Methods

                  -
                  -
                  - createElement() - StatefulElement - - - -
                  -
                  - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                  inherited
                  - -
                  - -
                  - createState() - HomePageState - - - -
                  -
                  - Creates the mutable state for this widget at a given location in the tree. [...] -
                  override
                  - -
                  - -
                  - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                  -
                  - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                  @protected, inherited
                  - -
                  - -
                  - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                  -
                  - Add additional properties associated with the node. [...] -
                  inherited
                  - -
                  - -
                  - noSuchMethod(Invocation invocation) - → dynamic - - - -
                  -
                  - Invoked when a non-existent method or property is accessed. [...] -
                  inherited
                  - -
                  - -
                  - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                  -
                  - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                  inherited
                  - -
                  - -
                  - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                  -
                  - A string representation of this object. [...] -
                  inherited
                  - -
                  - -
                  - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                  -
                  - Returns a string representation of this node and its descendants. [...] -
                  inherited
                  - -
                  - -
                  - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                  -
                  - Returns a one-line detailed description of the object. [...] -
                  inherited
                  - -
                  - -
                  - toStringShort() - → String - - - -
                  -
                  - A short, textual description of this widget. -
                  inherited
                  - -
                  - -
                  -
                  - -
                  -

                  Operators

                  -
                  -
                  - operator ==(Object other) - → bool - - - -
                  -
                  - The equality operator. [...] -
                  @nonVirtual, inherited
                  - -
                  - -
                  -
                  - - - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/HomePage/HomePage.html b/docs/pages/HomePage/HomePage.html deleted file mode 100644 index ad3078ae7..000000000 --- a/docs/pages/HomePage/HomePage.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - HomePage constructor - HomePage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  HomePage
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  HomePage constructor - Null safety -

                  - -
                  const - HomePage(
                  1. {int? pageIndex}
                  2. -
                  ) -
                  - - - - - -
                  -

                  Implementation

                  -
                  const HomePage({this.pageIndex});
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/HomePage/createState.html b/docs/pages/HomePage/createState.html deleted file mode 100644 index a82236c34..000000000 --- a/docs/pages/HomePage/createState.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - createState method - HomePage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  createState
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  createState method - Null safety -

                  - -
                  - -
                  -
                    -
                  1. @override
                  2. -
                  -
                  - -HomePageState -createState() - -
                  override
                  - -
                  - -
                  -

                  Creates the mutable state for this widget at a given location in the tree.

                  -

                  Subclasses should override this method to return a newly created -instance of their associated State subclass:

                  -
                  @override
                  -_MyState createState() => _MyState();
                  -
                  -

                  The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                  -
                  - - - -
                  -

                  Implementation

                  -
                  @override
                  -HomePageState createState() => HomePageState();
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/HomePage/pageIndex.html b/docs/pages/HomePage/pageIndex.html deleted file mode 100644 index 7d956d206..000000000 --- a/docs/pages/HomePage/pageIndex.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - pageIndex property - HomePage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  pageIndex
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  pageIndex property - Null safety -

                  - -
                  - int? - pageIndex -
                  final
                  - -
                  - - - -
                  -

                  Implementation

                  -
                  final int? pageIndex;
                  -
                  -
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/HomePageState-class.html b/docs/pages/HomePageState-class.html deleted file mode 100644 index cf9b64e5e..000000000 --- a/docs/pages/HomePageState-class.html +++ /dev/null @@ -1,491 +0,0 @@ - - - - - - - - HomePageState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  HomePageState
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  HomePageState class - Null safety - -

                  - - - - -
                  -
                  -
                  Inheritance
                  -
                  - - - - - -
                  -
                  - -
                  -

                  Constructors

                  - -
                  -
                  - HomePageState() -
                  -
                  - -
                  -
                  -
                  - -
                  -

                  Properties

                  - -
                  -
                  - context - BuildContext - -
                  -
                  - The location in the tree where this widget builds. [...] -
                  read-only, inherited
                  - -
                  - -
                  - hashCode - → int - -
                  -
                  - The hash code for this object. [...] -
                  read-only, inherited
                  - -
                  - -
                  - index - ↔ int - -
                  -
                  - -
                  read / write
                  - -
                  - -
                  - mounted - → bool - -
                  -
                  - Whether this State object is currently in a tree. [...] -
                  read-only, inherited
                  - -
                  - - -
                  - -
                  final
                  - -
                  - -
                  - runtimeType - → Type - -
                  -
                  - A representation of the runtime type of the object. -
                  read-only, inherited
                  - -
                  - -
                  - widget - HomePage - -
                  -
                  - The current configuration. [...] -
                  read-only, inherited
                  - -
                  - -
                  -
                  - -
                  -

                  Methods

                  -
                  -
                  - build(BuildContext context) - Widget - - - -
                  -
                  - Describes the part of the user interface represented by this widget. [...] -
                  override
                  - -
                  - -
                  - deactivate() - → void - - - -
                  -
                  - Called when this object is removed from the tree. [...] -
                  @mustCallSuper, @protected, inherited
                  - -
                  - -
                  - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                  -
                  - Add additional properties associated with the node. [...] -
                  inherited
                  - -
                  - -
                  - didChangeDependencies() - → void - - - -
                  -
                  - Called when a dependency of this State object changes. [...] -
                  @mustCallSuper, @protected, inherited
                  - -
                  - -
                  - didUpdateWidget(covariant HomePage oldWidget) - → void - - - -
                  -
                  - Called whenever the widget configuration changes. [...] -
                  @mustCallSuper, @protected, inherited
                  - -
                  - -
                  - dispose() - → void - - - -
                  -
                  - Called when this object is removed from the tree permanently. [...] -
                  @mustCallSuper, @protected, inherited
                  - -
                  - -
                  - initState() - → void - - - -
                  -
                  - Called when this object is inserted into the tree. [...] -
                  override
                  - -
                  - -
                  - noSuchMethod(Invocation invocation) - → dynamic - - - -
                  -
                  - Invoked when a non-existent method or property is accessed. [...] -
                  inherited
                  - -
                  - -
                  - reassemble() - → void - - - -
                  -
                  - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                  @mustCallSuper, @protected, inherited
                  - -
                  - -
                  - setState(VoidCallback fn) - → void - - - -
                  -
                  - Notify the framework that the internal state of this object has changed. [...] -
                  @protected, inherited
                  - -
                  - -
                  - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                  -
                  - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                  inherited
                  - -
                  - -
                  - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                  -
                  - A string representation of this object. [...] -
                  inherited
                  - -
                  - -
                  - toStringShort() - → String - - - -
                  -
                  - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                  inherited
                  - -
                  - -
                  -
                  - -
                  -

                  Operators

                  -
                  -
                  - operator ==(Object other) - → bool - - - -
                  -
                  - The equality operator. [...] -
                  inherited
                  - -
                  - -
                  -
                  - - - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/HomePageState/HomePageState.html b/docs/pages/HomePageState/HomePageState.html deleted file mode 100644 index 3e0cc1564..000000000 --- a/docs/pages/HomePageState/HomePageState.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - HomePageState constructor - HomePageState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  HomePageState
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  HomePageState constructor - Null safety -

                  - -
                  - HomePageState() -
                  - - - - - - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/HomePageState/build.html b/docs/pages/HomePageState/build.html deleted file mode 100644 index 4faecd0bb..000000000 --- a/docs/pages/HomePageState/build.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - - build method - HomePageState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  build
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  build method - Null safety -

                  - -
                  - -
                  -
                    -
                  1. @override
                  2. -
                  -
                  - -Widget -build(
                  1. BuildContext context
                  2. -
                  ) - -
                  override
                  - -
                  - -
                  -

                  Describes the part of the user interface represented by this widget.

                  -

                  The framework calls this method in a number of different situations. For -example:

                  - -

                  This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                  -

                  The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                  -

                  Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                  -

                  The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                  -

                  Design discussion

                  -

                  Why is the build method on State, and not StatefulWidget?

                  -

                  Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                  -

                  For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                  -

                  Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                  -

                  Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                  -
                  class MyButton extends StatefulWidget {
                  -  ...
                  -  final Color color;
                  -
                  -  @override
                  -  Widget build(BuildContext context, MyButtonState state) {
                  -    ... () { print("color: $color"); } ...
                  -  }
                  -}
                  -
                  -

                  For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                  -

                  In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                  -
                  class MyButtonState extends State<MyButton> {
                  -  ...
                  -  @override
                  -  Widget build(BuildContext context) {
                  -    ... () { print("color: ${widget.color}"); } ...
                  -  }
                  -}
                  -
                  -

                  Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                  -

                  See also:

                  -
                    -
                  • StatefulWidget, which contains the discussion on performance considerations.
                  • -
                  -
                  - - - -
                  -

                  Implementation

                  -
                  @override
                  -Widget build(BuildContext context) => ResponsiveBuilder(
                  -	builder: (_, LayoutInfo layout, __) => ResponsiveScaffold.navBar(
                  -		navItems: navItems,
                  -		navIndex: index,
                  -		onNavIndexChanged: (int value) => setState(() => index = value),
                  -		drawer: const NavigationDrawer(),
                  -		secondaryDrawer: const NavigationDrawer(),
                  -	)
                  -);
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/HomePageState/index.html b/docs/pages/HomePageState/index.html deleted file mode 100644 index d0758e789..000000000 --- a/docs/pages/HomePageState/index.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - index property - HomePageState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  index
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  index property - Null safety -

                  - -
                  - int - index -
                  read / write
                  - -
                  - - - -
                  -

                  Implementation

                  -
                  late int index;
                  -
                  -
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/HomePageState/initState.html b/docs/pages/HomePageState/initState.html deleted file mode 100644 index 7a0c03c4f..000000000 --- a/docs/pages/HomePageState/initState.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - initState method - HomePageState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  initState
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  initState method - Null safety -

                  - -
                  - -
                  -
                    -
                  1. @override
                  2. -
                  -
                  - -void -initState() - -
                  override
                  - -
                  - -
                  -

                  Called when this object is inserted into the tree.

                  -

                  The framework will call this method exactly once for each State object -it creates.

                  -

                  Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                  -

                  If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                  -
                    -
                  • In initState, subscribe to the object.
                  • -
                  • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                  • -
                  • In dispose, unsubscribe from the object.
                  • -
                  -

                  You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                  -

                  If you override this, make sure your method starts with a call to -super.initState().

                  -
                  - - - -
                  -

                  Implementation

                  -
                  @override
                  -void initState() {
                  -	super.initState();
                  -	index = widget.pageIndex ?? 0;
                  -}
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/HomePageState/navItems.html b/docs/pages/HomePageState/navItems.html deleted file mode 100644 index d26f34a06..000000000 --- a/docs/pages/HomePageState/navItems.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - navItems property - HomePageState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  navItems
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  navItems property - Null safety -

                  - -
                  - List<NavigationItem> - navItems -
                  final
                  - -
                  - - - -
                  -

                  Implementation

                  -
                  final List<NavigationItem> navItems = [
                  -	Dashboard(),
                  -	ResponsiveSchedule(),
                  -	ResponsiveReminders(),
                  -];
                  -
                  -
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/Login-class.html b/docs/pages/Login-class.html deleted file mode 100644 index 469ccc8f7..000000000 --- a/docs/pages/Login-class.html +++ /dev/null @@ -1,425 +0,0 @@ - - - - - - - - Login class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  Login
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  Login class - Null safety - -

                  - - -
                  -

                  The login page.

                  -

                  This widget is only stateful so it doesn't get disposed when -the theme changes, and then we can keep using the BuildContext. -Otherwise, if the theme is changed, the Scaffold cannot be accessed.

                  -

                  This page is the only page where errors from the backend are expected. -As such, more helpful measures than simply closing the app are needed. -This page holds methods that can safely clean the errors away before -prompting the user to try again.

                  -
                  - - -
                  -
                  -
                  Inheritance
                  -
                  - - - - - -
                  -
                  - -
                  -

                  Constructors

                  - -
                  -
                  - Login({String destination = Routes.home}) -
                  -
                  - Builds the login page -
                  const
                  -
                  -
                  -
                  - -
                  -

                  Properties

                  - -
                  -
                  - destination - → String - -
                  -
                  - The page to navigate to after a successful login. -
                  final
                  - -
                  - -
                  - hashCode - → int - -
                  -
                  - The hash code for this object. [...] -
                  @nonVirtual, read-only, inherited
                  - -
                  - -
                  - key - Key? - -
                  -
                  - Controls how one widget replaces another widget in the tree. [...] -
                  final, inherited
                  - -
                  - -
                  - runtimeType - → Type - -
                  -
                  - A representation of the runtime type of the object. -
                  read-only, inherited
                  - -
                  - -
                  -
                  - -
                  -

                  Methods

                  -
                  -
                  - createElement() - StatefulElement - - - -
                  -
                  - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                  inherited
                  - -
                  - -
                  - createState() - LoginState - - - -
                  -
                  - Creates the mutable state for this widget at a given location in the tree. [...] -
                  override
                  - -
                  - -
                  - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                  -
                  - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                  @protected, inherited
                  - -
                  - -
                  - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                  -
                  - Add additional properties associated with the node. [...] -
                  inherited
                  - -
                  - -
                  - noSuchMethod(Invocation invocation) - → dynamic - - - -
                  -
                  - Invoked when a non-existent method or property is accessed. [...] -
                  inherited
                  - -
                  - -
                  - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                  -
                  - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                  inherited
                  - -
                  - -
                  - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                  -
                  - A string representation of this object. [...] -
                  inherited
                  - -
                  - -
                  - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                  -
                  - Returns a string representation of this node and its descendants. [...] -
                  inherited
                  - -
                  - -
                  - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                  -
                  - Returns a one-line detailed description of the object. [...] -
                  inherited
                  - -
                  - -
                  - toStringShort() - → String - - - -
                  -
                  - A short, textual description of this widget. -
                  inherited
                  - -
                  - -
                  -
                  - -
                  -

                  Operators

                  -
                  -
                  - operator ==(Object other) - → bool - - - -
                  -
                  - The equality operator. [...] -
                  @nonVirtual, inherited
                  - -
                  - -
                  -
                  - - - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/Login/Login.html b/docs/pages/Login/Login.html deleted file mode 100644 index 8a08b4c86..000000000 --- a/docs/pages/Login/Login.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - Login constructor - Login class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  Login
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  Login constructor - Null safety -

                  - -
                  const - Login(
                  1. {String destination = Routes.home}
                  2. -
                  ) -
                  - - -
                  -

                  Builds the login page

                  -
                  - - - -
                  -

                  Implementation

                  -
                  const Login({this.destination = Routes.home});
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/Login/createState.html b/docs/pages/Login/createState.html deleted file mode 100644 index a77c6d54c..000000000 --- a/docs/pages/Login/createState.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - createState method - Login class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  createState
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  createState method - Null safety -

                  - -
                  - -
                  -
                    -
                  1. @override
                  2. -
                  -
                  - -LoginState -createState() - -
                  override
                  - -
                  - -
                  -

                  Creates the mutable state for this widget at a given location in the tree.

                  -

                  Subclasses should override this method to return a newly created -instance of their associated State subclass:

                  -
                  @override
                  -_MyState createState() => _MyState();
                  -
                  -

                  The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                  -
                  - - - -
                  -

                  Implementation

                  -
                  @override
                  -LoginState createState() => LoginState();
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/Login/destination.html b/docs/pages/Login/destination.html deleted file mode 100644 index 5a2b55044..000000000 --- a/docs/pages/Login/destination.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - destination property - Login class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  destination
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  destination property - Null safety -

                  - -
                  - String - destination -
                  final
                  - -
                  - -
                  -

                  The page to navigate to after a successful login.

                  -
                  - - -
                  -

                  Implementation

                  -
                  final String destination;
                  -
                  -
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/LoginState-class.html b/docs/pages/LoginState-class.html deleted file mode 100644 index cc114a012..000000000 --- a/docs/pages/LoginState-class.html +++ /dev/null @@ -1,525 +0,0 @@ - - - - - - - - LoginState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  LoginState
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  LoginState class - Null safety - -

                  - - -
                  -

                  A state for the login page.

                  -

                  This state keeps a reference to the BuildContext.

                  -
                  - - -
                  -
                  -
                  Inheritance
                  -
                  - - - - - -
                  -
                  - -
                  -

                  Constructors

                  - -
                  -
                  - LoginState() -
                  -
                  - -
                  -
                  -
                  - -
                  -

                  Properties

                  - -
                  -
                  - context - BuildContext - -
                  -
                  - The location in the tree where this widget builds. [...] -
                  read-only, inherited
                  - -
                  - -
                  - hashCode - → int - -
                  -
                  - The hash code for this object. [...] -
                  read-only, inherited
                  - -
                  - -
                  - isLoading - ↔ bool - -
                  -
                  - Whether the page is loading. -
                  read / write
                  - -
                  - -
                  - mounted - → bool - -
                  -
                  - Whether this State object is currently in a tree. [...] -
                  read-only, inherited
                  - -
                  - -
                  - runtimeType - → Type - -
                  -
                  - A representation of the runtime type of the object. -
                  read-only, inherited
                  - -
                  - -
                  - widget - Login - -
                  -
                  - The current configuration. [...] -
                  read-only, inherited
                  - -
                  - -
                  -
                  - -
                  -

                  Methods

                  -
                  -
                  - build(BuildContext context) - Widget - - - -
                  -
                  - Describes the part of the user interface represented by this widget. [...] -
                  override
                  - -
                  - -
                  - deactivate() - → void - - - -
                  -
                  - Called when this object is removed from the tree. [...] -
                  @mustCallSuper, @protected, inherited
                  - -
                  - -
                  - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                  -
                  - Add additional properties associated with the node. [...] -
                  inherited
                  - -
                  - -
                  - didChangeDependencies() - → void - - - -
                  -
                  - Called when a dependency of this State object changes. [...] -
                  @mustCallSuper, @protected, inherited
                  - -
                  - -
                  - didUpdateWidget(covariant Login oldWidget) - → void - - - -
                  -
                  - Called whenever the widget configuration changes. [...] -
                  @mustCallSuper, @protected, inherited
                  - -
                  - -
                  - dispose() - → void - - - -
                  -
                  - Called when this object is removed from the tree permanently. [...] -
                  @mustCallSuper, @protected, inherited
                  - -
                  - -
                  - initState() - → void - - - -
                  -
                  - Called when this object is inserted into the tree. [...] -
                  override
                  - -
                  - -
                  - noSuchMethod(Invocation invocation) - → dynamic - - - -
                  -
                  - Invoked when a non-existent method or property is accessed. [...] -
                  inherited
                  - -
                  - -
                  - onError(dynamic error, StackTrace stack) - → Future<void> - - - -
                  -
                  - A function that runs whenever there is an error. [...] - - -
                  - -
                  - reassemble() - → void - - - -
                  -
                  - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                  @mustCallSuper, @protected, inherited
                  - -
                  - -
                  - safely({required Future<void> function(), required void onSuccess(), required BuildContext scaffoldContext}) - → Future<void> - - - -
                  -
                  - Safely execute a function. [...] - - -
                  - -
                  - setState(VoidCallback fn) - → void - - - -
                  -
                  - Notify the framework that the internal state of this object has changed. [...] -
                  @protected, inherited
                  - -
                  - -
                  - signIn(BuildContext scaffoldContext) - → Future<void> - - - -
                  -
                  - Signs the user in. [...] - - -
                  - -
                  - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                  -
                  - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                  inherited
                  - -
                  - -
                  - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                  -
                  - A string representation of this object. [...] -
                  inherited
                  - -
                  - -
                  - toStringShort() - → String - - - -
                  -
                  - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                  inherited
                  - -
                  - -
                  -
                  - -
                  -

                  Operators

                  -
                  -
                  - operator ==(Object other) - → bool - - - -
                  -
                  - The equality operator. [...] -
                  inherited
                  - -
                  - -
                  -
                  - - - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/LoginState/LoginState.html b/docs/pages/LoginState/LoginState.html deleted file mode 100644 index 5520249b4..000000000 --- a/docs/pages/LoginState/LoginState.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - LoginState constructor - LoginState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  LoginState
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  LoginState constructor - Null safety -

                  - -
                  - LoginState() -
                  - - - - - - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/LoginState/build.html b/docs/pages/LoginState/build.html deleted file mode 100644 index a07e575b3..000000000 --- a/docs/pages/LoginState/build.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - - build method - LoginState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  build
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  build method - Null safety -

                  - -
                  - -
                  -
                    -
                  1. @override
                  2. -
                  -
                  - -Widget -build(
                  1. BuildContext context
                  2. -
                  ) - -
                  override
                  - -
                  - -
                  -

                  Describes the part of the user interface represented by this widget.

                  -

                  The framework calls this method in a number of different situations. For -example:

                  - -

                  This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                  -

                  The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                  -

                  Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                  -

                  The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                  -

                  Design discussion

                  -

                  Why is the build method on State, and not StatefulWidget?

                  -

                  Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                  -

                  For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                  -

                  Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                  -

                  Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                  -
                  class MyButton extends StatefulWidget {
                  -  ...
                  -  final Color color;
                  -
                  -  @override
                  -  Widget build(BuildContext context, MyButtonState state) {
                  -    ... () { print("color: $color"); } ...
                  -  }
                  -}
                  -
                  -

                  For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                  -

                  In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                  -
                  class MyButtonState extends State<MyButton> {
                  -  ...
                  -  @override
                  -  Widget build(BuildContext context) {
                  -    ... () { print("color: ${widget.color}"); } ...
                  -  }
                  -}
                  -
                  -

                  Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                  -

                  See also:

                  -
                    -
                  • StatefulWidget, which contains the discussion on performance considerations.
                  • -
                  -
                  - - - -
                  -

                  Implementation

                  -
                  @override
                  -Widget build (BuildContext context) => Scaffold (
                  -	appBar: AppBar (
                  -		title: const Text ("Login"),
                  -		actions: [
                  -			BrightnessChanger.iconButton(),
                  -		],
                  -	),
                  -	body: Center(
                  -		child: Column(
                  -			children: [
                  -				if (isLoading) const LinearProgressIndicator(minHeight: 8),
                  -				const Spacer(flex: 2),
                  -				SizedBox(
                  -					height: 300,
                  -					width: 300,
                  -					child: ThemeChanger.of(context).brightness == Brightness.light
                  -						? ClipRRect(
                  -							borderRadius: BorderRadius.circular(20),
                  -							child: RamazLogos.teal
                  -						) : RamazLogos.ramSquareWords
                  -				),
                  -				// const SizedBox(height: 100),
                  -				const Spacer(flex: 1),
                  -				TextButton.icon(
                  -					icon: Logos.google,
                  -					label: const Text("Sign in with Google"),
                  -					onPressed: () => signIn(context),
                  -				),
                  -				const Spacer(flex: 2),
                  -			]
                  -		)
                  -	)
                  -);
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/LoginState/initState.html b/docs/pages/LoginState/initState.html deleted file mode 100644 index 8e43b00e1..000000000 --- a/docs/pages/LoginState/initState.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - initState method - LoginState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  initState
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  initState method - Null safety -

                  - -
                  - -
                  -
                    -
                  1. @override
                  2. -
                  -
                  - -void -initState() - -
                  override
                  - -
                  - -
                  -

                  Called when this object is inserted into the tree.

                  -

                  The framework will call this method exactly once for each State object -it creates.

                  -

                  Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                  -

                  If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                  -
                    -
                  • In initState, subscribe to the object.
                  • -
                  • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                  • -
                  • In dispose, unsubscribe from the object.
                  • -
                  -

                  You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                  -

                  If you override this, make sure your method starts with a call to -super.initState().

                  -
                  - - - -
                  -

                  Implementation

                  -
                  @override
                  -void initState() {
                  -	super.initState();
                  -	// "To log in, one must first log out"
                  -	// -- Levi Lesches, class of '21, creator of this app, 2019
                  -	Services.instance.database.signOut();
                  -	Models.instance.dispose();
                  -}
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/LoginState/isLoading.html b/docs/pages/LoginState/isLoading.html deleted file mode 100644 index 7914e99d7..000000000 --- a/docs/pages/LoginState/isLoading.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - isLoading property - LoginState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  isLoading
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  isLoading property - Null safety -

                  - -
                  - bool - isLoading -
                  read / write
                  - -
                  - -
                  -

                  Whether the page is loading.

                  -
                  - - -
                  -

                  Implementation

                  -
                  bool isLoading = false;
                  -
                  -
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/LoginState/onError.html b/docs/pages/LoginState/onError.html deleted file mode 100644 index a6a44760a..000000000 --- a/docs/pages/LoginState/onError.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - onError method - LoginState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  onError
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  onError method - Null safety -

                  - -
                  - - -Future<void> -onError(
                  1. dynamic error,
                  2. -
                  3. StackTrace stack
                  4. -
                  ) - - - -
                  - -
                  -

                  A function that runs whenever there is an error.

                  -

                  Unlike other screens, this screen can expect an error to be thrown by the -backend, so special care must be taken to present these errors in a -user-friendly way, while at the same time making sure they don't prevent -the user from logging in.

                  -
                  - - - -
                  -

                  Implementation

                  -
                  Future<void> onError(dynamic error, StackTrace stack) async {
                  -	setState(() => isLoading = false);
                  -	final Crashlytics crashlytics = Services.instance.crashlytics;
                  -	await crashlytics.log("Login failed");
                  -	final String? email = Auth.email;
                  -	if (email != null) {
                  -		await crashlytics.setEmail(email);
                  -	}
                  -	// ignore: unawaited_futures
                  -	showDialog (
                  -		context: context,
                  -		builder: (dialogContext) => AlertDialog (
                  -			title: const Text ("Cannot connect"),
                  -			content: const Text (
                  -				"Due to technical difficulties, your account cannot be accessed.\n\n"
                  -				"If the problem persists, please contact Levi Lesches "
                  -				"(class of '21) for help"
                  -			),
                  -			actions: [
                  -				TextButton(
                  -					onPressed: () => Navigator.of(dialogContext).pop(),
                  -					child: const Text ("Cancel"),
                  -				),
                  -				ElevatedButton(
                  -					onPressed: () => launch("mailto:leschesl@ramaz.org"),
                  -					child: const Text ("leschesl@ramaz.org"),
                  -				)
                  -			]
                  -		)
                  -	).then((_) async {
                  -		await Services.instance.database.signOut();
                  -		Models.instance.dispose();
                  -	});
                  -	await crashlytics.recordError(error, stack);
                  -}
                  -
                  - - -
                  - - - -
                  - -
                  - - ramaz - 2.1.1+1 - - - -
                  - - - - - - - - - - - diff --git a/docs/pages/LoginState/safely.html b/docs/pages/LoginState/safely.html deleted file mode 100644 index d9dc6160c..000000000 --- a/docs/pages/LoginState/safely.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - safely method - LoginState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                  - -
                  - - -
                  safely
                  - -
                  - -
                  - - - - -
                  -
                  - -

                  safely method - Null safety -

                  - -
                  - - -Future<void> -safely(
                  1. {required Future<void> function(
                      -),
                    1. -
                    2. required void onSuccess(
                        -),
                      1. -
                      2. required BuildContext scaffoldContext}
                      3. -
                      ) - - - -
                      - -
                      -

                      Safely execute a function.

                      -

                      This function holds all the try-catch logic needed to properly debug -errors. If a network error occurs, a simple SnackBar is shown. -Otherwise, the error pop-up is shown (see onError).

                      -
                      - - - -
                      -

                      Implementation

                      -
                      Future<void> safely({
                      -	required Future<void> Function() function,
                      -	required void Function() onSuccess,
                      -	required BuildContext scaffoldContext,
                      -}) async {
                      -	try {await function();}
                      -	on PlatformException catch (error, stack) {
                      -		if (error.code == "ERROR_NETWORK_REQUEST_FAILED") {
                      -			ScaffoldMessenger.of(scaffoldContext).showSnackBar(
                      -				const SnackBar (content: Text ("No Internet")),
                      -			);
                      -			return setState(() => isLoading = false);
                      -		} else {
                      -			return onError(error, stack);
                      -		}
                      -	} on NoAccountException {
                      -		return setState(() => isLoading = false);
                      -	} catch (error, stack) {  // ignore: avoid_catches_without_on_clauses
                      -		return onError(error, stack);
                      -	}
                      -	onSuccess();
                      -}
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/LoginState/signIn.html b/docs/pages/LoginState/signIn.html deleted file mode 100644 index 25839e7dc..000000000 --- a/docs/pages/LoginState/signIn.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - signIn method - LoginState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      signIn
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      signIn method - Null safety -

                      - -
                      - - -Future<void> -signIn(
                      1. BuildContext scaffoldContext
                      2. -
                      ) - - - -
                      - -
                      -

                      Signs the user in.

                      -

                      Calls Services.signIn and Models.init.

                      -
                      - - - -
                      -

                      Implementation

                      -
                      Future<void> signIn(BuildContext scaffoldContext) => safely(
                      -	scaffoldContext: scaffoldContext,
                      -	function: () async {
                      -		setState(() => isLoading = true);
                      -		await Services.instance.signIn();
                      -		await Models.instance.init();
                      -	},
                      -	onSuccess: () {
                      -		setState(() => isLoading = false);
                      -		Navigator.of(context).pushReplacementNamed(widget.destination);
                      -	},
                      -);
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/NavigationDrawer-class.html b/docs/pages/NavigationDrawer-class.html deleted file mode 100644 index a606ded46..000000000 --- a/docs/pages/NavigationDrawer-class.html +++ /dev/null @@ -1,464 +0,0 @@ - - - - - - - - NavigationDrawer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      NavigationDrawer
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      NavigationDrawer class - Null safety - -

                      - - -
                      -

                      A drawer to show throughout the app.

                      -
                      - - -
                      -
                      -
                      Inheritance
                      -
                      - - - - - -
                      -
                      - -
                      -

                      Constructors

                      - -
                      - -
                      - -
                      const
                      -
                      -
                      -
                      - -
                      -

                      Properties

                      - -
                      -
                      - hashCode - → int - -
                      -
                      - The hash code for this object. [...] -
                      @nonVirtual, read-only, inherited
                      - -
                      - -
                      - isScheduleAdmin - → bool - -
                      -
                      - -
                      read-only
                      - -
                      - -
                      - isSportsAdmin - → bool - -
                      -
                      - -
                      read-only
                      - -
                      - -
                      - key - Key? - -
                      -
                      - Controls how one widget replaces another widget in the tree. [...] -
                      final, inherited
                      - -
                      - -
                      - runtimeType - → Type - -
                      -
                      - A representation of the runtime type of the object. -
                      read-only, inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Methods

                      -
                      -
                      - build(BuildContext context) - Widget - - - -
                      -
                      - Describes the part of the user interface represented by this widget. [...] -
                      override
                      - -
                      - -
                      - createElement() - StatelessElement - - - -
                      -
                      - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                      inherited
                      - -
                      - -
                      - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                      -
                      - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                      @protected, inherited
                      - -
                      - -
                      - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                      -
                      - Add additional properties associated with the node. [...] -
                      inherited
                      - -
                      - -
                      - getRouteName(BuildContext context) - → String? - - - -
                      -
                      - - - -
                      - -
                      - noSuchMethod(Invocation invocation) - → dynamic - - - -
                      -
                      - Invoked when a non-existent method or property is accessed. [...] -
                      inherited
                      - -
                      - -
                      - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                      -
                      - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                      inherited
                      - -
                      - -
                      - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                      -
                      - A string representation of this object. [...] -
                      inherited
                      - -
                      - -
                      - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a string representation of this node and its descendants. [...] -
                      inherited
                      - -
                      - -
                      - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a one-line detailed description of the object. [...] -
                      inherited
                      - -
                      - -
                      - toStringShort() - → String - - - -
                      -
                      - A short, textual description of this widget. -
                      inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Operators

                      -
                      -
                      - operator ==(Object other) - → bool - - - -
                      -
                      - The equality operator. [...] -
                      @nonVirtual, inherited
                      - -
                      - -
                      -
                      - - -
                      -

                      Static Methods

                      -
                      -
                      - pushRoute(BuildContext context, String name) - → Future<void> Function() - - - -
                      -
                      - Uses the navigator to launch a page by name. - - -
                      - -
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/NavigationDrawer/NavigationDrawer.html b/docs/pages/NavigationDrawer/NavigationDrawer.html deleted file mode 100644 index 88cea2dae..000000000 --- a/docs/pages/NavigationDrawer/NavigationDrawer.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - NavigationDrawer constructor - NavigationDrawer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      NavigationDrawer
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      NavigationDrawer constructor - Null safety -

                      - -
                      const - NavigationDrawer() -
                      - - - - - -
                      -

                      Implementation

                      -
                      const NavigationDrawer();
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/NavigationDrawer/build.html b/docs/pages/NavigationDrawer/build.html deleted file mode 100644 index 6f572041c..000000000 --- a/docs/pages/NavigationDrawer/build.html +++ /dev/null @@ -1,314 +0,0 @@ - - - - - - - - build method - NavigationDrawer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      build
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      build method - Null safety -

                      - -
                      - -
                      -
                        -
                      1. @override
                      2. -
                      -
                      - -Widget -build(
                      1. BuildContext context
                      2. -
                      ) - -
                      override
                      - -
                      - -
                      -

                      Describes the part of the user interface represented by this widget.

                      -

                      The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                      -

                      The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                      -

                      Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                      -

                      The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                      -

                      The implementation of this method must only depend on:

                      - -

                      If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                      -

                      See also:

                      -
                        -
                      • StatelessWidget, which contains the discussion on performance considerations.
                      • -
                      -
                      - - - -
                      -

                      Implementation

                      -
                      @override
                      -Widget build (BuildContext context) => ResponsiveBuilder(
                      -	builder: (_, LayoutInfo layout, __) => Drawer (
                      -		child: LayoutBuilder(
                      -			builder: (
                      -				BuildContext context,
                      -				BoxConstraints constraints
                      -			) => SingleChildScrollView(
                      -				child: ConstrainedBox(
                      -					constraints: BoxConstraints(
                      -						minHeight: constraints.maxHeight,
                      -					),
                      -					child: IntrinsicHeight(
                      -						child: Column(
                      -							children: [
                      -								DrawerHeader(child: RamazLogos.ramSquare),
                      -								if (layout.isDesktop || getRouteName(context) != Routes.home)
                      -									ListTile (
                      -										title: const Text ("Dashboard"),
                      -										leading: Icon (Icons.dashboard),
                      -										onTap: pushRoute(context, Routes.home),
                      -									),
                      -								if (layout.isDesktop || getRouteName(context) != Routes.schedule)
                      -									ListTile (
                      -										title: const Text ("Schedule"),
                      -										leading: Icon (Icons.schedule),
                      -										onTap: pushRoute(context, Routes.schedule),
                      -									),
                      -								if (layout.isDesktop || getRouteName(context) != Routes.reminders)
                      -									ListTile (
                      -										title: const Text ("Reminders"),
                      -										leading: Icon (Icons.notifications),
                      -										onTap: pushRoute(context, Routes.reminders),
                      -									),
                      -								// ListTile (
                      -								// 	title: Text ("Sports"),
                      -								// 	leading: Icon (Icons.sports),
                      -								// 	onTap: pushRoute(context, Routes.sports),
                      -								// ),
                      -								if (Models.instance.user.isAdmin) ExpansionTile(
                      -									leading: Icon(Icons.admin_panel_settings),
                      -									title: const Text("Admin options"),
                      -									children: [
                      -										if (isScheduleAdmin) ...[
                      -											ListTile(
                      -												title: Text("Calendar"),
                      -												leading: Icon(Icons.calendar_today),
                      -												onTap: pushRoute(context, Routes.calendar),
                      -											),
                      -											ListTile(
                      -												title: Text("Custom schedules"),
                      -												leading: Icon(Icons.schedule),
                      -												onTap: pushRoute(context, Routes.schedules),
                      -											),
                      -										],
                      -										if (isSportsAdmin)
                      -											ListTile(
                      -												title: Text("Sports"),
                      -												leading: Icon(Icons.sports),
                      -												onTap: pushRoute(context, Routes.sports),
                      -											)
                      -									]
                      -								),
                      -								BrightnessChanger.dropdown(),
                      -								ListTile (
                      -									title: const Text ("Logout"),
                      -									leading: Icon (Icons.lock),
                      -									onTap: pushRoute(context, Routes.login)
                      -								),
                      -								ListTile (
                      -									title: const Text ("Send Feedback"),
                      -									leading: Icon (Icons.feedback),
                      -									onTap: pushRoute(context, Routes.feedback),
                      -								),
                      -								const AboutListTile (
                      -									icon: Icon (Icons.info),
                      -									// ignore: sort_child_properties_last
                      -									child: Text ("About"),
                      -									applicationName: "Ramaz Student Life",
                      -									applicationVersion: "0.5",
                      -									applicationIcon: Logos.ramazIcon,
                      -									aboutBoxChildren: [
                      -										Text (
                      -											"Created by the Ramaz Coding Club (Levi Lesches and Sophia "
                      -											"Kremer) with the support of the Ramaz administration. "
                      -										),
                      -										SizedBox (height: 20),
                      -										Text (
                      -											"A special thanks to Mr. Vovsha for helping us go from idea to "
                      -											"reality."
                      -										),
                      -									]
                      -								),
                      -								const Spacer(),
                      -								Align (
                      -									alignment: Alignment.bottomCenter,
                      -									child: Column (
                      -										children: [
                      -											const Divider(),
                      -											SingleChildScrollView (
                      -												scrollDirection: Axis.horizontal,
                      -												child: Row (
                      -													children: const [
                      -														Logos.ramazIcon,
                      -														Logos.outlook,
                      -														Logos.schoology,
                      -														Logos.drive,
                      -														Logos.seniorSystems
                      -													]
                      -												)
                      -											)
                      -										]
                      -									)
                      -								)
                      -							]
                      -						)
                      -					)
                      -				)
                      -			)
                      -		)
                      -	)
                      -);
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/NavigationDrawer/getRouteName.html b/docs/pages/NavigationDrawer/getRouteName.html deleted file mode 100644 index cd22ffdb9..000000000 --- a/docs/pages/NavigationDrawer/getRouteName.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - getRouteName method - NavigationDrawer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      getRouteName
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      getRouteName method - Null safety -

                      - -
                      - - -String? -getRouteName(
                      1. BuildContext context
                      2. -
                      ) - - - -
                      - - - - -
                      -

                      Implementation

                      -
                      String? getRouteName(BuildContext context) =>
                      -	ModalRoute.of(context)!.settings.name;
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/NavigationDrawer/isScheduleAdmin.html b/docs/pages/NavigationDrawer/isScheduleAdmin.html deleted file mode 100644 index 8ac256821..000000000 --- a/docs/pages/NavigationDrawer/isScheduleAdmin.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - isScheduleAdmin property - NavigationDrawer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      isScheduleAdmin
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      isScheduleAdmin property - Null safety -

                      - - - -
                      - -
                      - bool - isScheduleAdmin - - -
                      - - - - -
                      -

                      Implementation

                      -
                      bool get isScheduleAdmin => Models.instance.user
                      -	.adminScopes!.contains(AdminScope.calendar);
                      -
                      - -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/NavigationDrawer/isSportsAdmin.html b/docs/pages/NavigationDrawer/isSportsAdmin.html deleted file mode 100644 index ec903ed7e..000000000 --- a/docs/pages/NavigationDrawer/isSportsAdmin.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - isSportsAdmin property - NavigationDrawer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      isSportsAdmin
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      isSportsAdmin property - Null safety -

                      - - - -
                      - -
                      - bool - isSportsAdmin - - -
                      - - - - -
                      -

                      Implementation

                      -
                      bool get isSportsAdmin => Models.instance.user
                      -	.adminScopes!.contains(AdminScope.sports);
                      -
                      - -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/NavigationDrawer/pushRoute.html b/docs/pages/NavigationDrawer/pushRoute.html deleted file mode 100644 index d9b5c5a47..000000000 --- a/docs/pages/NavigationDrawer/pushRoute.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - pushRoute method - NavigationDrawer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      pushRoute
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      pushRoute method - Null safety -

                      - -
                      - - -Future<void> Function() -pushRoute(
                      1. BuildContext context,
                      2. -
                      3. String name
                      4. -
                      ) - - - -
                      - -
                      -

                      Uses the navigator to launch a page by name.

                      -
                      - - - -
                      -

                      Implementation

                      -
                      static Future<void> Function() pushRoute(BuildContext context, String name) =>
                      -	() => Navigator.of(context).pushReplacementNamed(name);
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/OldCalendarWidget-class.html b/docs/pages/OldCalendarWidget-class.html deleted file mode 100644 index 7539dbb92..000000000 --- a/docs/pages/OldCalendarWidget-class.html +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - OldCalendarWidget class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      OldCalendarWidget
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      OldCalendarWidget class - Null safety - -

                      - - -
                      -

                      A widget to represent a calendar icon.

                      -

                      Due to "budget cuts", poor Levi Lesches ('21) had to recreate the calendar -icon from scratch, instead of Googling for a png. What a loser.

                      -

                      This widget is not used, rather left here as a token of appreciation for -all the time Levi has wasted designing (and scrapping said designs) -the UI and backend code for this app. That dude deserves a raise.

                      -
                      - - -
                      -
                      -
                      Inheritance
                      -
                      - - - - - -
                      -
                      - -
                      -

                      Constructors

                      - -
                      -
                      - OldCalendarWidget() -
                      -
                      - Creates a widget to look like the calendar icon. -
                      const
                      -
                      -
                      -
                      - -
                      -

                      Properties

                      - -
                      -
                      - hashCode - → int - -
                      -
                      - The hash code for this object. [...] -
                      @nonVirtual, read-only, inherited
                      - -
                      - -
                      - key - Key? - -
                      -
                      - Controls how one widget replaces another widget in the tree. [...] -
                      final, inherited
                      - -
                      - -
                      - runtimeType - → Type - -
                      -
                      - A representation of the runtime type of the object. -
                      read-only, inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Methods

                      -
                      -
                      - build(BuildContext context) - Widget - - - -
                      -
                      - Describes the part of the user interface represented by this widget. [...] -
                      override
                      - -
                      - -
                      - createElement() - StatelessElement - - - -
                      -
                      - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                      inherited
                      - -
                      - -
                      - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                      -
                      - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                      @protected, inherited
                      - -
                      - -
                      - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                      -
                      - Add additional properties associated with the node. [...] -
                      inherited
                      - -
                      - -
                      - noSuchMethod(Invocation invocation) - → dynamic - - - -
                      -
                      - Invoked when a non-existent method or property is accessed. [...] -
                      inherited
                      - -
                      - -
                      - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                      -
                      - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                      inherited
                      - -
                      - -
                      - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                      -
                      - A string representation of this object. [...] -
                      inherited
                      - -
                      - -
                      - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a string representation of this node and its descendants. [...] -
                      inherited
                      - -
                      - -
                      - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a one-line detailed description of the object. [...] -
                      inherited
                      - -
                      - -
                      - toStringShort() - → String - - - -
                      -
                      - A short, textual description of this widget. -
                      inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Operators

                      -
                      -
                      - operator ==(Object other) - → bool - - - -
                      -
                      - The equality operator. [...] -
                      @nonVirtual, inherited
                      - -
                      - -
                      -
                      - - - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/OldCalendarWidget/OldCalendarWidget.html b/docs/pages/OldCalendarWidget/OldCalendarWidget.html deleted file mode 100644 index b23f4680b..000000000 --- a/docs/pages/OldCalendarWidget/OldCalendarWidget.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - OldCalendarWidget constructor - OldCalendarWidget class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      OldCalendarWidget
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      OldCalendarWidget constructor - Null safety -

                      - -
                      const - OldCalendarWidget() -
                      - - -
                      -

                      Creates a widget to look like the calendar icon.

                      -
                      - - - -
                      -

                      Implementation

                      -
                      const OldCalendarWidget();
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/OldCalendarWidget/build.html b/docs/pages/OldCalendarWidget/build.html deleted file mode 100644 index ed920d69c..000000000 --- a/docs/pages/OldCalendarWidget/build.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - build method - OldCalendarWidget class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      build
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      build method - Null safety -

                      - -
                      - -
                      -
                        -
                      1. @override
                      2. -
                      -
                      - -Widget -build(
                      1. BuildContext context
                      2. -
                      ) - -
                      override
                      - -
                      - -
                      -

                      Describes the part of the user interface represented by this widget.

                      -

                      The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                      -

                      The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                      -

                      Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                      -

                      The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                      -

                      The implementation of this method must only depend on:

                      - -

                      If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                      -

                      See also:

                      -
                        -
                      • StatelessWidget, which contains the discussion on performance considerations.
                      • -
                      -
                      - - - -
                      -

                      Implementation

                      -
                      @override
                      -Widget build(BuildContext context) => InkWell(
                      -	onTap: () => Navigator.pushReplacementNamed(context, Routes.calendar),
                      -	child: Container(
                      -	    decoration: BoxDecoration(border: Border.all()),
                      -	    padding: const EdgeInsets.symmetric(horizontal: 25),
                      -	    child: Column(
                      -	      mainAxisAlignment: MainAxisAlignment.center,
                      -	      crossAxisAlignment: CrossAxisAlignment.center,
                      -	      children: [
                      -	        const Spacer(flex: 1),
                      -	        Expanded(
                      -	          flex: 1,
                      -	          child: Container(
                      -	            decoration: BoxDecoration(border: Border.all()),
                      -	            child: const Center(
                      -	              child: Text("Monday")
                      -	            ),
                      -	          ),
                      -	        ),
                      -	        Expanded(
                      -	          flex: 4,
                      -	          child: Container(
                      -	            decoration: BoxDecoration(border: Border.all()),
                      -	            child: const Center(
                      -	              child: Text("01", textScaleFactor: 2),
                      -	            )
                      -	          )
                      -	        ),
                      -	        const Spacer(flex: 1),
                      -	      ]
                      -	    )
                      -  )
                      -);
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilder-class.html b/docs/pages/ReminderBuilder-class.html deleted file mode 100644 index 29ce0c314..000000000 --- a/docs/pages/ReminderBuilder-class.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - ReminderBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      ReminderBuilder
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      ReminderBuilder class - Null safety - -

                      - - -
                      -

                      A widget to help the user create a Reminder.

                      -

                      This widget must be a StatefulWidget in order to avoid recreating a -TextEditingController every time the widget tree is rebuilt.

                      -
                      - - -
                      -
                      -
                      Inheritance
                      -
                      - - - - - -
                      -
                      - -
                      -

                      Constructors

                      - -
                      -
                      - ReminderBuilder(Reminder? reminder) -
                      -
                      - Creates a widget to create or modify a Reminder. -
                      const
                      -
                      -
                      -
                      - -
                      -

                      Properties

                      - -
                      -
                      - hashCode - → int - -
                      -
                      - The hash code for this object. [...] -
                      @nonVirtual, read-only, inherited
                      - -
                      - -
                      - key - Key? - -
                      -
                      - Controls how one widget replaces another widget in the tree. [...] -
                      final, inherited
                      - -
                      - -
                      - reminder - Reminder? - -
                      -
                      - A reminder to modify. [...] -
                      final
                      - -
                      - -
                      - runtimeType - → Type - -
                      -
                      - A representation of the runtime type of the object. -
                      read-only, inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Methods

                      -
                      -
                      - createElement() - StatefulElement - - - -
                      -
                      - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                      inherited
                      - -
                      - -
                      - createState() - ReminderBuilderState - - - -
                      -
                      - Creates the mutable state for this widget at a given location in the tree. [...] -
                      override
                      - -
                      - -
                      - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                      -
                      - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                      @protected, inherited
                      - -
                      - -
                      - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                      -
                      - Add additional properties associated with the node. [...] -
                      inherited
                      - -
                      - -
                      - noSuchMethod(Invocation invocation) - → dynamic - - - -
                      -
                      - Invoked when a non-existent method or property is accessed. [...] -
                      inherited
                      - -
                      - -
                      - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                      -
                      - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                      inherited
                      - -
                      - -
                      - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                      -
                      - A string representation of this object. [...] -
                      inherited
                      - -
                      - -
                      - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a string representation of this node and its descendants. [...] -
                      inherited
                      - -
                      - -
                      - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a one-line detailed description of the object. [...] -
                      inherited
                      - -
                      - -
                      - toStringShort() - → String - - - -
                      -
                      - A short, textual description of this widget. -
                      inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Operators

                      -
                      -
                      - operator ==(Object other) - → bool - - - -
                      -
                      - The equality operator. [...] -
                      @nonVirtual, inherited
                      - -
                      - -
                      -
                      - - -
                      -

                      Static Methods

                      -
                      -
                      - buildReminder(BuildContext context, [Reminder? reminder]) - → Future<Reminder?> - - - -
                      -
                      - Opens a ReminderBuilder pop-up to create or modify a Reminder. - - -
                      - -
                      - trimString(String text, int length) - → String - - - -
                      -
                      - Trims a string down to a certain length. [...] - - -
                      - -
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilder/ReminderBuilder.html b/docs/pages/ReminderBuilder/ReminderBuilder.html deleted file mode 100644 index 493262ada..000000000 --- a/docs/pages/ReminderBuilder/ReminderBuilder.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - ReminderBuilder constructor - ReminderBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      ReminderBuilder
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      ReminderBuilder constructor - Null safety -

                      - -
                      const - ReminderBuilder(
                      1. Reminder? reminder
                      2. -
                      ) -
                      - - -
                      -

                      Creates a widget to create or modify a Reminder.

                      -
                      - - - -
                      -

                      Implementation

                      -
                      const ReminderBuilder(this.reminder);
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilder/buildReminder.html b/docs/pages/ReminderBuilder/buildReminder.html deleted file mode 100644 index 24c7ffa50..000000000 --- a/docs/pages/ReminderBuilder/buildReminder.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - buildReminder method - ReminderBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      buildReminder
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      buildReminder method - Null safety -

                      - -
                      - - -Future<Reminder?> -buildReminder(
                      1. BuildContext context,
                      2. -
                      3. [Reminder? reminder]
                      4. -
                      ) - - - -
                      - -
                      -

                      Opens a ReminderBuilder pop-up to create or modify a Reminder.

                      -
                      - - - -
                      -

                      Implementation

                      -
                      static Future<Reminder?> buildReminder(
                      -	BuildContext context, [Reminder? reminder]
                      -) => showDialog(
                      -	context: context,
                      -	builder: (_) => ReminderBuilder(reminder),
                      -);
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilder/createState.html b/docs/pages/ReminderBuilder/createState.html deleted file mode 100644 index 421240af0..000000000 --- a/docs/pages/ReminderBuilder/createState.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - createState method - ReminderBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      createState
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      createState method - Null safety -

                      - -
                      - -
                      -
                        -
                      1. @override
                      2. -
                      -
                      - -ReminderBuilderState -createState() - -
                      override
                      - -
                      - -
                      -

                      Creates the mutable state for this widget at a given location in the tree.

                      -

                      Subclasses should override this method to return a newly created -instance of their associated State subclass:

                      -
                      @override
                      -_MyState createState() => _MyState();
                      -
                      -

                      The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                      -
                      - - - -
                      -

                      Implementation

                      -
                      @override
                      -ReminderBuilderState createState() => ReminderBuilderState();
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilder/reminder.html b/docs/pages/ReminderBuilder/reminder.html deleted file mode 100644 index 689b1d76b..000000000 --- a/docs/pages/ReminderBuilder/reminder.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - reminder property - ReminderBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      reminder
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      reminder property - Null safety -

                      - -
                      - Reminder? - reminder -
                      final
                      - -
                      - -
                      -

                      A reminder to modify.

                      -

                      A ReminderBuilder can either create a new Reminder from scratch or -modify an existing reminder (auto-fill its properties).

                      -
                      - - -
                      -

                      Implementation

                      -
                      final Reminder? reminder;
                      -
                      -
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilder/trimString.html b/docs/pages/ReminderBuilder/trimString.html deleted file mode 100644 index bf4db75b8..000000000 --- a/docs/pages/ReminderBuilder/trimString.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - trimString method - ReminderBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      trimString
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      trimString method - Null safety -

                      - -
                      - - -String -trimString(
                      1. String text,
                      2. -
                      3. int length
                      4. -
                      ) - - - -
                      - -
                      -

                      Trims a string down to a certain length.

                      -

                      This function is needed since calling String.substring with an end -argument greater than the length of the string will throw an error.

                      -
                      - - - -
                      -

                      Implementation

                      -
                      static String trimString (String text, int length) => text.length > length
                      -	? text.substring(0, length) : text;
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilderState-class.html b/docs/pages/ReminderBuilderState-class.html deleted file mode 100644 index f37e25338..000000000 --- a/docs/pages/ReminderBuilderState-class.html +++ /dev/null @@ -1,484 +0,0 @@ - - - - - - - - ReminderBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      ReminderBuilderState
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      ReminderBuilderState class - Null safety - -

                      - - -
                      -

                      A state for a ReminderBuilder.

                      -

                      State.initState is needed to instantiate a TextEditingController -exactly once.

                      -
                      - - -
                      -
                      -
                      Inheritance
                      -
                      - - - - - -
                      -
                      - -
                      -

                      Constructors

                      - -
                      -
                      - ReminderBuilderState() -
                      -
                      - -
                      -
                      -
                      - -
                      -

                      Properties

                      - -
                      -
                      - context - BuildContext - -
                      -
                      - The location in the tree where this widget builds. [...] -
                      read-only, inherited
                      - -
                      - -
                      - controller - TextEditingController - -
                      -
                      - The text controller to hold the message of the Reminder. -
                      final
                      - -
                      - -
                      - hashCode - → int - -
                      -
                      - The hash code for this object. [...] -
                      read-only, inherited
                      - -
                      - -
                      - mounted - → bool - -
                      -
                      - Whether this State object is currently in a tree. [...] -
                      read-only, inherited
                      - -
                      - -
                      - runtimeType - → Type - -
                      -
                      - A representation of the runtime type of the object. -
                      read-only, inherited
                      - -
                      - -
                      - widget - ReminderBuilder - -
                      -
                      - The current configuration. [...] -
                      read-only, inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Methods

                      -
                      -
                      - build(BuildContext context) - Widget - - - -
                      -
                      - Describes the part of the user interface represented by this widget. [...] -
                      override
                      - -
                      - -
                      - deactivate() - → void - - - -
                      -
                      - Called when this object is removed from the tree. [...] -
                      @mustCallSuper, @protected, inherited
                      - -
                      - -
                      - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                      -
                      - Add additional properties associated with the node. [...] -
                      inherited
                      - -
                      - -
                      - didChangeDependencies() - → void - - - -
                      -
                      - Called when a dependency of this State object changes. [...] -
                      @mustCallSuper, @protected, inherited
                      - -
                      - -
                      - didUpdateWidget(covariant ReminderBuilder oldWidget) - → void - - - -
                      -
                      - Called whenever the widget configuration changes. [...] -
                      @mustCallSuper, @protected, inherited
                      - -
                      - -
                      - dispose() - → void - - - -
                      -
                      - Called when this object is removed from the tree permanently. [...] -
                      @mustCallSuper, @protected, inherited
                      - -
                      - -
                      - initState() - → void - - - -
                      -
                      - Called when this object is inserted into the tree. [...] -
                      override
                      - -
                      - -
                      - noSuchMethod(Invocation invocation) - → dynamic - - - -
                      -
                      - Invoked when a non-existent method or property is accessed. [...] -
                      inherited
                      - -
                      - -
                      - reassemble() - → void - - - -
                      -
                      - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                      @mustCallSuper, @protected, inherited
                      - -
                      - -
                      - setState(VoidCallback fn) - → void - - - -
                      -
                      - Notify the framework that the internal state of this object has changed. [...] -
                      @protected, inherited
                      - -
                      - -
                      - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                      -
                      - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                      inherited
                      - -
                      - -
                      - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                      -
                      - A string representation of this object. [...] -
                      inherited
                      - -
                      - -
                      - toStringShort() - → String - - - -
                      -
                      - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                      inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Operators

                      -
                      -
                      - operator ==(Object other) - → bool - - - -
                      -
                      - The equality operator. [...] -
                      inherited
                      - -
                      - -
                      -
                      - - - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilderState/ReminderBuilderState.html b/docs/pages/ReminderBuilderState/ReminderBuilderState.html deleted file mode 100644 index 827ebe862..000000000 --- a/docs/pages/ReminderBuilderState/ReminderBuilderState.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - ReminderBuilderState constructor - ReminderBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      ReminderBuilderState
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      ReminderBuilderState constructor - Null safety -

                      - -
                      - ReminderBuilderState() -
                      - - - - - - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilderState/build.html b/docs/pages/ReminderBuilderState/build.html deleted file mode 100644 index 5a4933d51..000000000 --- a/docs/pages/ReminderBuilderState/build.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - - - - build method - ReminderBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      build
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      build method - Null safety -

                      - -
                      - -
                      -
                        -
                      1. @override
                      2. -
                      -
                      - -Widget -build(
                      1. BuildContext context
                      2. -
                      ) - -
                      override
                      - -
                      - -
                      -

                      Describes the part of the user interface represented by this widget.

                      -

                      The framework calls this method in a number of different situations. For -example:

                      - -

                      This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                      -

                      The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                      -

                      Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                      -

                      The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                      -

                      Design discussion

                      -

                      Why is the build method on State, and not StatefulWidget?

                      -

                      Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                      -

                      For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                      -

                      Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                      -

                      Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                      -
                      class MyButton extends StatefulWidget {
                      -  ...
                      -  final Color color;
                      -
                      -  @override
                      -  Widget build(BuildContext context, MyButtonState state) {
                      -    ... () { print("color: $color"); } ...
                      -  }
                      -}
                      -
                      -

                      For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                      -

                      In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                      -
                      class MyButtonState extends State<MyButton> {
                      -  ...
                      -  @override
                      -  Widget build(BuildContext context) {
                      -    ... () { print("color: ${widget.color}"); } ...
                      -  }
                      -}
                      -
                      -

                      Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                      -

                      See also:

                      -
                        -
                      • StatefulWidget, which contains the discussion on performance considerations.
                      • -
                      -
                      - - - -
                      -

                      Implementation

                      -
                      @override
                      -Widget build(BuildContext context) => ModelListener<RemindersBuilderModel>(
                      -	model: () => RemindersBuilderModel(widget.reminder),
                      -	// ignore: sort_child_properties_last
                      -	child: TextButton(
                      -		onPressed: Navigator.of(context).pop,
                      -		child: const Text("Cancel"),
                      -	),
                      -	builder: (BuildContext context, RemindersBuilderModel model, Widget? back) =>
                      -		AlertDialog(
                      -			title: Text (widget.reminder == null ? "Create reminder" : "Edit reminder"),
                      -			actions: [
                      -				back!,
                      -				ElevatedButton(
                      -					onPressed: model.ready
                      -						? () => Navigator.of(context).pop(model.build())
                      -						: null,
                      -					child: const Text("Save"),
                      -				)
                      -			],
                      -			content: Column (
                      -				mainAxisSize: MainAxisSize.min,
                      -				children: [
                      -					TextField (
                      -						controller: controller,
                      -						onChanged: model.onMessageChanged,
                      -						textCapitalization: TextCapitalization.sentences,
                      -					),
                      -					const SizedBox (height: 20),
                      -					RadioListTile<ReminderTimeType> (
                      -						value: ReminderTimeType.period,
                      -						groupValue: model.type,
                      -						// if toggleable is false (default), the value can never be null
                      -						onChanged: (value) => model.toggleRepeatType(value!),
                      -						title: Text (
                      -							"${model.shouldRepeat ? 'Repeats every' : 'On'} period"
                      -						),
                      -					),
                      -					RadioListTile<ReminderTimeType> (
                      -						value: ReminderTimeType.subject,
                      -						groupValue: model.type,
                      -						// if toggleable is false (default), the value can never be null
                      -						onChanged: (value) => model.toggleRepeatType(value!),
                      -						title: Text (
                      -							"${model.shouldRepeat ? 'Repeats every' : 'On'} subject"
                      -						),
                      -					),
                      -					const SizedBox (height: 20),
                      -					if (model.type == ReminderTimeType.period) ...[
                      -						ListTile (
                      -							title: const Text ("Day"),
                      -							trailing: DropdownButton<String>(
                      -								items: [
                      -									for (final String dayName in Models.instance.schedule.user.dayNames)
                      -										DropdownMenuItem(
                      -											value: dayName,
                      -											child: Text(dayName),
                      -										),
                      -								],
                      -								onChanged: (String? value) {
                      -									if (value != null) {
                      -										model.changeDay(value);
                      -									}
                      -								},
                      -								value: model.dayName,
                      -								hint: const Text("Day"),
                      -							),
                      -						),
                      -						ListTile (
                      -							title: const Text ("Period"),
                      -							trailing: DropdownButton<String> (
                      -								items: [
                      -									for (final String period in model.periods ?? [])
                      -										DropdownMenuItem(
                      -											value: period,
                      -											child: Text (period),
                      -										)
                      -								],
                      -								onChanged: (String? value) {
                      -									if (value != null) {
                      -										model.changePeriod(value);
                      -									}
                      -								},
                      -								value: model.period,
                      -								hint: const Text ("Period"),
                      -							)
                      -						)
                      -					] else if (model.type == ReminderTimeType.subject)
                      -						ListTile (
                      -							title: const Text ("Class"),
                      -							trailing: DropdownButton<String>(
                      -								items: [
                      -									for (final String course in model.courses)
                      -										DropdownMenuItem(
                      -											value: course,
                      -											child: Text("${ReminderBuilder.trimString(course, 14)}..."),
                      -										)
                      -								],
                      -								onChanged: (String? value) {
                      -									if (value != null) {
                      -										model.changeCourse(value);
                      -									}
                      -								},
                      -								value: model.course,
                      -								isDense: true,
                      -								hint: const Text ("Class"),
                      -							)
                      -						),
                      -					SwitchListTile (
                      -						value: model.shouldRepeat,
                      -						onChanged: model.toggleRepeat,
                      -						title: const Text ("Repeat"),
                      -						secondary: const Icon (Icons.repeat),
                      -					),
                      -				]
                      -			)
                      -		)
                      -);
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilderState/controller.html b/docs/pages/ReminderBuilderState/controller.html deleted file mode 100644 index c6583f0b4..000000000 --- a/docs/pages/ReminderBuilderState/controller.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - controller property - ReminderBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      controller
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      controller property - Null safety -

                      - -
                      - TextEditingController - controller -
                      final
                      - -
                      - -
                      -

                      The text controller to hold the message of the Reminder.

                      -
                      - - -
                      -

                      Implementation

                      -
                      final TextEditingController controller = TextEditingController();
                      -
                      -
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ReminderBuilderState/initState.html b/docs/pages/ReminderBuilderState/initState.html deleted file mode 100644 index d49ad3f8f..000000000 --- a/docs/pages/ReminderBuilderState/initState.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - initState method - ReminderBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      initState
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      initState method - Null safety -

                      - -
                      - -
                      -
                        -
                      1. @override
                      2. -
                      -
                      - -void -initState() - -
                      override
                      - -
                      - -
                      -

                      Called when this object is inserted into the tree.

                      -

                      The framework will call this method exactly once for each State object -it creates.

                      -

                      Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                      -

                      If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                      -
                        -
                      • In initState, subscribe to the object.
                      • -
                      • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                      • -
                      • In dispose, unsubscribe from the object.
                      • -
                      -

                      You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                      -

                      If you override this, make sure your method starts with a call to -super.initState().

                      -
                      - - - -
                      -

                      Implementation

                      -
                      @override
                      -void initState() {
                      -	super.initState();
                      -	controller.text = widget.reminder?.message ?? "";
                      -}
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveReminders-class.html b/docs/pages/ResponsiveReminders-class.html deleted file mode 100644 index 33e53dfc5..000000000 --- a/docs/pages/ResponsiveReminders-class.html +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - - - ResponsiveReminders class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      ResponsiveReminders
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      ResponsiveReminders class - Null safety - -

                      - - - - -
                      -
                      -
                      Inheritance
                      -
                      - - - - - -
                      -
                      - -
                      -

                      Constructors

                      - -
                      -
                      - ResponsiveReminders() -
                      -
                      - -
                      -
                      -
                      - -
                      -

                      Properties

                      - -
                      -
                      - appBar - AppBar - -
                      -
                      - -
                      read-only, override
                      - -
                      - -
                      - bottomNavBar - BottomNavigationBarItem - -
                      -
                      - Generates an item for BottomNavigationBar. -
                      read-only, inherited
                      - -
                      - -
                      - floatingActionButton - Widget - -
                      -
                      - -
                      read-only, override
                      - -
                      - -
                      - floatingActionButtonLocation - FloatingActionButtonLocation? - -
                      -
                      - -
                      read-only, inherited
                      - -
                      - -
                      - hashCode - → int - -
                      -
                      - The hash code for this object. [...] -
                      @nonVirtual, read-only, inherited
                      - -
                      - -
                      - icon - Widget - -
                      -
                      - The icon for this item. -
                      final, inherited
                      - -
                      - -
                      - key - Key? - -
                      -
                      - Controls how one widget replaces another widget in the tree. [...] -
                      final, inherited
                      - -
                      - -
                      - label - → String - -
                      -
                      - The label for this item. [...] -
                      final, inherited
                      - -
                      - -
                      - model - Reminders - -
                      -
                      - -
                      final
                      - -
                      - - -
                      - Generates an item for NavigationRail. -
                      read-only, inherited
                      - -
                      - -
                      - runtimeType - → Type - -
                      -
                      - A representation of the runtime type of the object. -
                      read-only, inherited
                      - -
                      - -
                      - sideSheet - Widget? - -
                      -
                      - -
                      read-only, inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Methods

                      -
                      -
                      - build(BuildContext context) - Widget - - - -
                      -
                      - Describes the part of the user interface represented by this widget. [...] -
                      override
                      - -
                      - -
                      - createElement() - StatelessElement - - - -
                      -
                      - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                      inherited
                      - -
                      - -
                      - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                      -
                      - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                      @protected, inherited
                      - -
                      - -
                      - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                      -
                      - Add additional properties associated with the node. [...] -
                      inherited
                      - -
                      - -
                      - noSuchMethod(Invocation invocation) - → dynamic - - - -
                      -
                      - Invoked when a non-existent method or property is accessed. [...] -
                      inherited
                      - -
                      - -
                      - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                      -
                      - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                      inherited
                      - -
                      - -
                      - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                      -
                      - A string representation of this object. [...] -
                      inherited
                      - -
                      - -
                      - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a string representation of this node and its descendants. [...] -
                      inherited
                      - -
                      - -
                      - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a one-line detailed description of the object. [...] -
                      inherited
                      - -
                      - -
                      - toStringShort() - → String - - - -
                      -
                      - A short, textual description of this widget. -
                      inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Operators

                      -
                      -
                      - operator ==(Object other) - → bool - - - -
                      -
                      - The equality operator. [...] -
                      @nonVirtual, inherited
                      - -
                      - -
                      -
                      - - - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveReminders/ResponsiveReminders.html b/docs/pages/ResponsiveReminders/ResponsiveReminders.html deleted file mode 100644 index 8ccd62f62..000000000 --- a/docs/pages/ResponsiveReminders/ResponsiveReminders.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - ResponsiveReminders constructor - ResponsiveReminders class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      ResponsiveReminders
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      ResponsiveReminders constructor - Null safety -

                      - -
                      - ResponsiveReminders() -
                      - - - - - -
                      -

                      Implementation

                      -
                      ResponsiveReminders() :
                      -	super(label: "Reminders", icon: const Icon(Icons.notifications));
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveReminders/appBar.html b/docs/pages/ResponsiveReminders/appBar.html deleted file mode 100644 index 08220b6a1..000000000 --- a/docs/pages/ResponsiveReminders/appBar.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - appBar property - ResponsiveReminders class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      appBar
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      appBar property - Null safety -

                      - - - -
                      - -
                      - AppBar - appBar -
                      override
                      - -
                      - - - - -
                      -

                      Implementation

                      -
                      @override
                      -AppBar get appBar => AppBar(title: const Text ("Reminders"));
                      -
                      - -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveReminders/build.html b/docs/pages/ResponsiveReminders/build.html deleted file mode 100644 index 554a6107f..000000000 --- a/docs/pages/ResponsiveReminders/build.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - build method - ResponsiveReminders class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      build
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      build method - Null safety -

                      - -
                      - -
                      -
                        -
                      1. @override
                      2. -
                      -
                      - -Widget -build(
                      1. BuildContext context
                      2. -
                      ) - -
                      override
                      - -
                      - -
                      -

                      Describes the part of the user interface represented by this widget.

                      -

                      The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                      -

                      The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                      -

                      Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                      -

                      The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                      -

                      The implementation of this method must only depend on:

                      - -

                      If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                      -

                      See also:

                      -
                        -
                      • StatelessWidget, which contains the discussion on performance considerations.
                      • -
                      -
                      - - - -
                      -

                      Implementation

                      -
                      @override
                      -Widget build(BuildContext context) => ModelListener<Reminders>(
                      -	model: () => Models.instance.reminders,
                      -	dispose: false,
                      -	// ignore: sort_child_properties_last
                      -	child: const Center (
                      -		child: Text (
                      -			"You don't have any reminders yet",
                      -			textScaleFactor: 1.5,
                      -			textAlign: TextAlign.center,
                      -		),
                      -	),
                      -	builder: (_, Reminders model, Widget? empty) => model.reminders.isEmpty
                      -		? empty!  // widget is supplied above
                      -		: ListView.separated (
                      -			itemCount: model.reminders.length,
                      -			separatorBuilder: (_, __) => const Divider(),
                      -			itemBuilder: (BuildContext context, int index) =>
                      -				ReminderTile(index: index),
                      -		)
                      -);
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveReminders/floatingActionButton.html b/docs/pages/ResponsiveReminders/floatingActionButton.html deleted file mode 100644 index 857b932c2..000000000 --- a/docs/pages/ResponsiveReminders/floatingActionButton.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - floatingActionButton property - ResponsiveReminders class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      floatingActionButton
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      floatingActionButton property - Null safety -

                      - - - -
                      - -
                      - Widget - floatingActionButton -
                      override
                      - -
                      - - - - -
                      -

                      Implementation

                      -
                      @override
                      -Widget get floatingActionButton => Builder(
                      -	builder: (BuildContext context) => FloatingActionButton(
                      -		onPressed: () async => model
                      -			.addReminder(await ReminderBuilder.buildReminder(context)),
                      -		child: const Icon (Icons.note_add),
                      -	)
                      -);
                      -
                      - -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveReminders/model.html b/docs/pages/ResponsiveReminders/model.html deleted file mode 100644 index 542cb87a9..000000000 --- a/docs/pages/ResponsiveReminders/model.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - model property - ResponsiveReminders class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      model
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      model property - Null safety -

                      - -
                      - Reminders - model -
                      final
                      - -
                      - - - -
                      -

                      Implementation

                      -
                      final Reminders model = Models.instance.reminders;
                      -
                      -
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveSchedule-class.html b/docs/pages/ResponsiveSchedule-class.html deleted file mode 100644 index bb84193b1..000000000 --- a/docs/pages/ResponsiveSchedule-class.html +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - - - ResponsiveSchedule class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      ResponsiveSchedule
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      ResponsiveSchedule class - Null safety - -

                      - - - - -
                      -
                      -
                      Inheritance
                      -
                      - - - - - -
                      -
                      - -
                      -

                      Constructors

                      - -
                      -
                      - ResponsiveSchedule() -
                      -
                      - -
                      -
                      -
                      - -
                      -

                      Properties

                      - -
                      -
                      - appBar - AppBar - -
                      -
                      - -
                      read-only, override
                      - -
                      - -
                      - bottomNavBar - BottomNavigationBarItem - -
                      -
                      - Generates an item for BottomNavigationBar. -
                      read-only, inherited
                      - -
                      - -
                      - floatingActionButton - Widget? - -
                      -
                      - -
                      read-only, override
                      - -
                      - -
                      - floatingActionButtonLocation - FloatingActionButtonLocation? - -
                      -
                      - -
                      read-only, inherited
                      - -
                      - -
                      - hashCode - → int - -
                      -
                      - The hash code for this object. [...] -
                      @nonVirtual, read-only, inherited
                      - -
                      - -
                      - icon - Widget - -
                      -
                      - The icon for this item. -
                      final, inherited
                      - -
                      - -
                      - key - Key? - -
                      -
                      - Controls how one widget replaces another widget in the tree. [...] -
                      final, inherited
                      - -
                      - -
                      - label - → String - -
                      -
                      - The label for this item. [...] -
                      final, inherited
                      - -
                      - -
                      - model - ScheduleViewModel - -
                      -
                      - -
                      final
                      - -
                      - - -
                      - Generates an item for NavigationRail. -
                      read-only, inherited
                      - -
                      - -
                      - runtimeType - → Type - -
                      -
                      - A representation of the runtime type of the object. -
                      read-only, inherited
                      - -
                      - -
                      - sideSheet - Widget? - -
                      -
                      - -
                      read-only, inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Methods

                      -
                      -
                      - build(BuildContext context) - Widget - - - -
                      -
                      - Describes the part of the user interface represented by this widget. [...] -
                      override
                      - -
                      - -
                      - createElement() - StatelessElement - - - -
                      -
                      - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                      inherited
                      - -
                      - -
                      - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                      -
                      - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                      @protected, inherited
                      - -
                      - -
                      - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                      -
                      - Add additional properties associated with the node. [...] -
                      inherited
                      - -
                      - -
                      - handleInvalidSchedule(BuildContext context) - → void - - - -
                      -
                      - Lets the user know that they chose an invalid schedule combination. - - -
                      - -
                      - noSuchMethod(Invocation invocation) - → dynamic - - - -
                      -
                      - Invoked when a non-existent method or property is accessed. [...] -
                      inherited
                      - -
                      - -
                      - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                      -
                      - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                      inherited
                      - -
                      - -
                      - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                      -
                      - A string representation of this object. [...] -
                      inherited
                      - -
                      - -
                      - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a string representation of this node and its descendants. [...] -
                      inherited
                      - -
                      - -
                      - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a one-line detailed description of the object. [...] -
                      inherited
                      - -
                      - -
                      - toStringShort() - → String - - - -
                      -
                      - A short, textual description of this widget. -
                      inherited
                      - -
                      - -
                      - viewDay(ScheduleViewModel model, BuildContext context) - → Future<void> - - - -
                      -
                      - Allows the user to select a day in the calendar to view. [...] - - -
                      - -
                      -
                      - -
                      -

                      Operators

                      -
                      -
                      - operator ==(Object other) - → bool - - - -
                      -
                      - The equality operator. [...] -
                      @nonVirtual, inherited
                      - -
                      - -
                      -
                      - - - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveSchedule/ResponsiveSchedule.html b/docs/pages/ResponsiveSchedule/ResponsiveSchedule.html deleted file mode 100644 index e76c58cbf..000000000 --- a/docs/pages/ResponsiveSchedule/ResponsiveSchedule.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - ResponsiveSchedule constructor - ResponsiveSchedule class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      ResponsiveSchedule
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      ResponsiveSchedule constructor - Null safety -

                      - -
                      - ResponsiveSchedule() -
                      - - - - - -
                      -

                      Implementation

                      -
                      ResponsiveSchedule() :
                      -	super(label: "Schedule", icon: const Icon(Icons.schedule));
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveSchedule/appBar.html b/docs/pages/ResponsiveSchedule/appBar.html deleted file mode 100644 index 6d5beee53..000000000 --- a/docs/pages/ResponsiveSchedule/appBar.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - appBar property - ResponsiveSchedule class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      appBar
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      appBar property - Null safety -

                      - - - -
                      - -
                      - AppBar - appBar -
                      override
                      - -
                      - - - - -
                      -

                      Implementation

                      -
                      @override
                      -AppBar get appBar => AppBar(title: const Text("Schedule"));
                      -
                      - -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveSchedule/build.html b/docs/pages/ResponsiveSchedule/build.html deleted file mode 100644 index d8a1171ae..000000000 --- a/docs/pages/ResponsiveSchedule/build.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - build method - ResponsiveSchedule class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      build
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      build method - Null safety -

                      - -
                      - -
                      -
                        -
                      1. @override
                      2. -
                      -
                      - -Widget -build(
                      1. BuildContext context
                      2. -
                      ) - -
                      override
                      - -
                      - -
                      -

                      Describes the part of the user interface represented by this widget.

                      -

                      The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                      -

                      The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                      -

                      Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                      -

                      The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                      -

                      The implementation of this method must only depend on:

                      - -

                      If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                      -

                      See also:

                      -
                        -
                      • StatelessWidget, which contains the discussion on performance considerations.
                      • -
                      -
                      - - - -
                      -

                      Implementation

                      -
                      @override
                      -Widget build (BuildContext context) => ModelListener(
                      -	model: () => model,
                      -	dispose: false,
                      -	builder: (_, ScheduleViewModel model, __) => Column(
                      -		children: [
                      -			ListTile (
                      -				title: const Text ("Day"),
                      -				trailing: DropdownButton<String> (
                      -					value: model.day.name,
                      -					onChanged: (String? value) => model.update(
                      -						newName: value,
                      -						onInvalidSchedule: () => handleInvalidSchedule(context),
                      -					),
                      -					items: [
                      -						for (final String dayName in Models.instance.schedule.user.dayNames)
                      -							DropdownMenuItem(
                      -								value: dayName,
                      -								child: Text(dayName),
                      -							)
                      -					]
                      -				)
                      -			),
                      -			ListTile (
                      -				title: const Text ("Schedule"),
                      -				trailing: DropdownButton<Schedule> (
                      -					value: model.day.schedule,
                      -					onChanged: (Schedule? schedule) => model.update(
                      -						newSchedule: schedule,
                      -						onInvalidSchedule: () => handleInvalidSchedule(context),
                      -					),
                      -					items: [
                      -						for (final Schedule schedule in Schedule.schedules)
                      -							DropdownMenuItem(
                      -								value: schedule,
                      -								child: Text (schedule.name),
                      -							),
                      -					]
                      -				)
                      -			),
                      -			const SizedBox (height: 20),
                      -			const Divider(),
                      -			const SizedBox (height: 20),
                      -			Expanded(
                      -				child: ClassList(
                      -					day: model.day,
                      -					periods: Models.instance.user.data.getPeriods(model.day)
                      -				)
                      -			),
                      -		]
                      -	)
                      -);
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveSchedule/floatingActionButton.html b/docs/pages/ResponsiveSchedule/floatingActionButton.html deleted file mode 100644 index 48c27ef53..000000000 --- a/docs/pages/ResponsiveSchedule/floatingActionButton.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - floatingActionButton property - ResponsiveSchedule class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      floatingActionButton
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      floatingActionButton property - Null safety -

                      - - - -
                      - -
                      - Widget? - floatingActionButton -
                      override
                      - -
                      - - - - -
                      -

                      Implementation

                      -
                      @override
                      -Widget? get floatingActionButton => Builder(
                      -	builder: (BuildContext context) => FloatingActionButton(
                      -		onPressed: () => viewDay(model, context),
                      -		child: const Icon(Icons.calendar_today),
                      -	)
                      -);
                      -
                      - -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveSchedule/handleInvalidSchedule.html b/docs/pages/ResponsiveSchedule/handleInvalidSchedule.html deleted file mode 100644 index c7ac4bab6..000000000 --- a/docs/pages/ResponsiveSchedule/handleInvalidSchedule.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - handleInvalidSchedule method - ResponsiveSchedule class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      handleInvalidSchedule
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      handleInvalidSchedule method - Null safety -

                      - -
                      - - -void -handleInvalidSchedule(
                      1. BuildContext context
                      2. -
                      ) - - - -
                      - -
                      -

                      Lets the user know that they chose an invalid schedule combination.

                      -
                      - - - -
                      -

                      Implementation

                      -
                      void handleInvalidSchedule(BuildContext context) =>
                      -	ScaffoldMessenger.of(context).showSnackBar(
                      -		const SnackBar(content: Text("Invalid schedule"))
                      -	);
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveSchedule/model.html b/docs/pages/ResponsiveSchedule/model.html deleted file mode 100644 index 524471a63..000000000 --- a/docs/pages/ResponsiveSchedule/model.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - model property - ResponsiveSchedule class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      model
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      model property - Null safety -

                      - -
                      - ScheduleViewModel - model -
                      final
                      - -
                      - - - -
                      -

                      Implementation

                      -
                      final ScheduleViewModel model = ScheduleViewModel();
                      -
                      -
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/ResponsiveSchedule/viewDay.html b/docs/pages/ResponsiveSchedule/viewDay.html deleted file mode 100644 index 00d30e427..000000000 --- a/docs/pages/ResponsiveSchedule/viewDay.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - viewDay method - ResponsiveSchedule class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      viewDay
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      viewDay method - Null safety -

                      - -
                      - - -Future<void> -viewDay(
                      1. ScheduleViewModel model,
                      2. -
                      3. BuildContext context
                      4. -
                      ) - - - -
                      - -
                      -

                      Allows the user to select a day in the calendar to view.

                      -

                      If there is no school on that day, a SnackBar will be shown.

                      -
                      - - - -
                      -

                      Implementation

                      -
                      Future<void> viewDay(ScheduleViewModel model, BuildContext context) async {
                      -	final DateTime? selected = await pickDate(
                      -		context: context,
                      -		initialDate: model.date,
                      -	);
                      -	if (selected == null) {
                      -		return;
                      -	}
                      -	try {
                      -		model.date = selected;
                      -	} on Exception {  // user picked a day with no school
                      -		ScaffoldMessenger.of(context).showSnackBar(
                      -			const SnackBar (
                      -				content: Text ("There is no school on this day")
                      -			)
                      -		);
                      -	}
                      -}
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/RouteInitializer-class.html b/docs/pages/RouteInitializer-class.html deleted file mode 100644 index f11714a2e..000000000 --- a/docs/pages/RouteInitializer-class.html +++ /dev/null @@ -1,474 +0,0 @@ - - - - - - - - RouteInitializer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      RouteInitializer
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      RouteInitializer class - Null safety - -

                      - - -
                      -

                      A route that performs initialization logic first.

                      -
                      - - -
                      -
                      -
                      Inheritance
                      -
                      - - - - - -
                      -
                      - -
                      -

                      Constructors

                      - -
                      -
                      - RouteInitializer({required Widget child, String onFailure = Routes.login, String? onError = Routes.login, bool isAllowed() = isSignedIn}) -
                      -
                      - Navigation with authorization and error-handling. -
                      const
                      -
                      -
                      -
                      - -
                      -

                      Properties

                      - -
                      -
                      - child - Widget - -
                      -
                      - The contents of the page. -
                      final
                      - -
                      - -
                      - hashCode - → int - -
                      -
                      - The hash code for this object. [...] -
                      @nonVirtual, read-only, inherited
                      - -
                      - -
                      - isAllowed - → bool Function() - -
                      -
                      - Determines if the user is allowed to be on the given page. -
                      final
                      - -
                      - -
                      - key - Key? - -
                      -
                      - Controls how one widget replaces another widget in the tree. [...] -
                      final, inherited
                      - -
                      - -
                      - onError - → String? - -
                      -
                      - The route to navigate to if there is an error. -
                      final
                      - -
                      - -
                      - onFailure - → String - -
                      -
                      - The route to navigate to if the user is not authorized. -
                      final
                      - -
                      - -
                      - runtimeType - → Type - -
                      -
                      - A representation of the runtime type of the object. -
                      read-only, inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Methods

                      -
                      -
                      - createElement() - StatefulElement - - - -
                      -
                      - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                      inherited
                      - -
                      - -
                      - createState() - RouteInitializerState - - - -
                      -
                      - Creates the mutable state for this widget at a given location in the tree. [...] -
                      override
                      - -
                      - -
                      - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                      -
                      - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                      @protected, inherited
                      - -
                      - -
                      - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                      -
                      - Add additional properties associated with the node. [...] -
                      inherited
                      - -
                      - -
                      - noSuchMethod(Invocation invocation) - → dynamic - - - -
                      -
                      - Invoked when a non-existent method or property is accessed. [...] -
                      inherited
                      - -
                      - -
                      - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                      -
                      - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                      inherited
                      - -
                      - -
                      - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                      -
                      - A string representation of this object. [...] -
                      inherited
                      - -
                      - -
                      - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a string representation of this node and its descendants. [...] -
                      inherited
                      - -
                      - -
                      - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                      -
                      - Returns a one-line detailed description of the object. [...] -
                      inherited
                      - -
                      - -
                      - toStringShort() - → String - - - -
                      -
                      - A short, textual description of this widget. -
                      inherited
                      - -
                      - -
                      -
                      - -
                      -

                      Operators

                      -
                      -
                      - operator ==(Object other) - → bool - - - -
                      -
                      - The equality operator. [...] -
                      @nonVirtual, inherited
                      - -
                      - -
                      -
                      - - -
                      -

                      Static Methods

                      -
                      -
                      - isSignedIn() - → bool - - - -
                      -
                      - Checks to see if the user is signed in. [...] - - -
                      - -
                      -
                      - - -
                      - - - -
                      - -
                      - - ramaz - 2.1.1+1 - - - -
                      - - - - - - - - - - - diff --git a/docs/pages/RouteInitializer/RouteInitializer.html b/docs/pages/RouteInitializer/RouteInitializer.html deleted file mode 100644 index 8a8ca3fd2..000000000 --- a/docs/pages/RouteInitializer/RouteInitializer.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - RouteInitializer constructor - RouteInitializer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                      - -
                      - - -
                      RouteInitializer
                      - -
                      - -
                      - - - - -
                      -
                      - -

                      RouteInitializer constructor - Null safety -

                      - -
                      const - RouteInitializer(
                      1. {required Widget child,
                      2. -
                      3. String onFailure = Routes.login,
                      4. -
                      5. String? onError = Routes.login,
                      6. -
                      7. bool isAllowed(
                          -) = isSignedIn}
                        1. -
                        ) -
                        - - -
                        -

                        Navigation with authorization and error-handling.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const RouteInitializer({
                        -	required this.child,
                        -	this.onFailure = Routes.login,
                        -	this.onError = Routes.login,
                        -	this.isAllowed = isSignedIn,
                        -});
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializer/child.html b/docs/pages/RouteInitializer/child.html deleted file mode 100644 index 0a916ba34..000000000 --- a/docs/pages/RouteInitializer/child.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - child property - RouteInitializer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        child
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        child property - Null safety -

                        - -
                        - Widget - child -
                        final
                        - -
                        - -
                        -

                        The contents of the page.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Widget child;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializer/createState.html b/docs/pages/RouteInitializer/createState.html deleted file mode 100644 index e3a4d1ed9..000000000 --- a/docs/pages/RouteInitializer/createState.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - createState method - RouteInitializer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        createState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        createState method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -RouteInitializerState -createState() - -
                        override
                        - -
                        - -
                        -

                        Creates the mutable state for this widget at a given location in the tree.

                        -

                        Subclasses should override this method to return a newly created -instance of their associated State subclass:

                        -
                        @override
                        -_MyState createState() => _MyState();
                        -
                        -

                        The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -RouteInitializerState createState() => RouteInitializerState();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializer/isAllowed.html b/docs/pages/RouteInitializer/isAllowed.html deleted file mode 100644 index e37e07b42..000000000 --- a/docs/pages/RouteInitializer/isAllowed.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - isAllowed property - RouteInitializer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isAllowed
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isAllowed property - Null safety -

                        - -
                        - bool Function() - isAllowed -
                        final
                        - -
                        - -
                        -

                        Determines if the user is allowed to be on the given page.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final bool Function() isAllowed;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializer/isSignedIn.html b/docs/pages/RouteInitializer/isSignedIn.html deleted file mode 100644 index b434592ca..000000000 --- a/docs/pages/RouteInitializer/isSignedIn.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - isSignedIn method - RouteInitializer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isSignedIn
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isSignedIn method - Null safety -

                        - -
                        - - -bool -isSignedIn() - - - -
                        - -
                        -

                        Checks to see if the user is signed in.

                        -

                        This is the default logic to determine if the user can access a page.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        static bool isSignedIn() => Auth.isSignedIn;
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializer/onError.html b/docs/pages/RouteInitializer/onError.html deleted file mode 100644 index 648e2ab53..000000000 --- a/docs/pages/RouteInitializer/onError.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - onError property - RouteInitializer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        onError
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        onError property - Null safety -

                        - -
                        - String? - onError -
                        final
                        - -
                        - -
                        -

                        The route to navigate to if there is an error.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final String? onError;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializer/onFailure.html b/docs/pages/RouteInitializer/onFailure.html deleted file mode 100644 index b06066c30..000000000 --- a/docs/pages/RouteInitializer/onFailure.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - onFailure property - RouteInitializer class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        onFailure
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        onFailure property - Null safety -

                        - -
                        - String - onFailure -
                        final
                        - -
                        - -
                        -

                        The route to navigate to if the user is not authorized.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final String onFailure;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializerState-class.html b/docs/pages/RouteInitializerState-class.html deleted file mode 100644 index 1469476ae..000000000 --- a/docs/pages/RouteInitializerState-class.html +++ /dev/null @@ -1,496 +0,0 @@ - - - - - - - - RouteInitializerState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        RouteInitializerState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        RouteInitializerState class - Null safety - -

                        - - -
                        -

                        The state for a RouteInitializer.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - RouteInitializerState() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - context - BuildContext - -
                        -
                        - The location in the tree where this widget builds. [...] -
                        read-only, inherited
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - initFuture - ↔ Future - -
                        -
                        - The future for initializing the backend. -
                        read / write
                        - -
                        - -
                        - mounted - → bool - -
                        -
                        - Whether this State object is currently in a tree. [...] -
                        read-only, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        - widget - RouteInitializer - -
                        -
                        - The current configuration. [...] -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - deactivate() - → void - - - -
                        -
                        - Called when this object is removed from the tree. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - didChangeDependencies() - → void - - - -
                        -
                        - Called when a dependency of this State object changes. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - didUpdateWidget(covariant RouteInitializer oldWidget) - → void - - - -
                        -
                        - Called whenever the widget configuration changes. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - dispose() - → void - - - -
                        -
                        - Called when this object is removed from the tree permanently. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - init() - → Future<void> - - - -
                        -
                        - Initializes the app's backends. [...] - - -
                        - -
                        - initState() - → void - - - -
                        -
                        - Called when this object is inserted into the tree. [...] -
                        override
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - reassemble() - → void - - - -
                        -
                        - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - setState(VoidCallback fn) - → void - - - -
                        -
                        - Notify the framework that the internal state of this object has changed. [...] -
                        @protected, inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializerState/RouteInitializerState.html b/docs/pages/RouteInitializerState/RouteInitializerState.html deleted file mode 100644 index fafff8e58..000000000 --- a/docs/pages/RouteInitializerState/RouteInitializerState.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - RouteInitializerState constructor - RouteInitializerState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        RouteInitializerState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        RouteInitializerState constructor - Null safety -

                        - -
                        - RouteInitializerState() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializerState/build.html b/docs/pages/RouteInitializerState/build.html deleted file mode 100644 index 1fff078c2..000000000 --- a/docs/pages/RouteInitializerState/build.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - - build method - RouteInitializerState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method in a number of different situations. For -example:

                        - -

                        This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                        -

                        Design discussion

                        -

                        Why is the build method on State, and not StatefulWidget?

                        -

                        Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                        -

                        For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                        -

                        Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                        -

                        Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                        -
                        class MyButton extends StatefulWidget {
                        -  ...
                        -  final Color color;
                        -
                        -  @override
                        -  Widget build(BuildContext context, MyButtonState state) {
                        -    ... () { print("color: $color"); } ...
                        -  }
                        -}
                        -
                        -

                        For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                        -

                        In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                        -
                        class MyButtonState extends State<MyButton> {
                        -  ...
                        -  @override
                        -  Widget build(BuildContext context) {
                        -    ... () { print("color: ${widget.color}"); } ...
                        -  }
                        -}
                        -
                        -

                        Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                        -

                        See also:

                        -
                          -
                        • StatefulWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Widget build(BuildContext context) => FutureBuilder(
                        -	future: initFuture,
                        -	builder: (_, AsyncSnapshot snapshot) =>
                        -		snapshot.connectionState == ConnectionState.done
                        -			? widget.child
                        -			: ResponsiveScaffold(
                        -				appBar: AppBar(title: const Text("Loading...")),
                        -				bodyBuilder: (_) => const Center(child: CircularProgressIndicator()),
                        -				drawer: const NavigationDrawer(),
                        -			),
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializerState/init.html b/docs/pages/RouteInitializerState/init.html deleted file mode 100644 index a0902c1b0..000000000 --- a/docs/pages/RouteInitializerState/init.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - init method - RouteInitializerState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        init
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        init method - Null safety -

                        - -
                        - - -Future<void> -init() - - - -
                        - -
                        -

                        Initializes the app's backends.

                        -

                        No-op if the backend is already initialized.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Future<void> init() async {
                        -	try {
                        -		if (!Services.instance.isReady) {
                        -			await Services.instance.init();
                        -		}
                        -		if (Auth.isSignedIn && !Models.instance.isReady) {
                        -			await Models.instance.init();
                        -		}
                        -	} catch (error) {
                        -		await Services.instance.crashlytics.log("Error. Disposing models");
                        -		Models.instance.dispose();
                        -		if (widget.onError != null) {
                        -			await Navigator.of(context).pushReplacementNamed(widget.onError!);
                        -		}
                        -	}
                        -	if (!widget.isAllowed()) {
                        -		await Navigator.of(context).pushReplacementNamed(widget.onFailure);
                        -	}
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializerState/initFuture.html b/docs/pages/RouteInitializerState/initFuture.html deleted file mode 100644 index 33f3d0895..000000000 --- a/docs/pages/RouteInitializerState/initFuture.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - initFuture property - RouteInitializerState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        initFuture
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        initFuture property - Null safety -

                        - -
                        - Future - initFuture -
                        read / write
                        - -
                        - -
                        -

                        The future for initializing the backend.

                        -
                        - - -
                        -

                        Implementation

                        -
                        late Future initFuture;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/RouteInitializerState/initState.html b/docs/pages/RouteInitializerState/initState.html deleted file mode 100644 index 0b18f5e1b..000000000 --- a/docs/pages/RouteInitializerState/initState.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - initState method - RouteInitializerState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        initState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        initState method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -void -initState() - -
                        override
                        - -
                        - -
                        -

                        Called when this object is inserted into the tree.

                        -

                        The framework will call this method exactly once for each State object -it creates.

                        -

                        Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                        -

                        If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                        -
                          -
                        • In initState, subscribe to the object.
                        • -
                        • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                        • -
                        • In dispose, unsubscribe from the object.
                        • -
                        -

                        You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                        -

                        If you override this, make sure your method starts with a call to -super.initState().

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -void initState() {
                        -	super.initState();
                        -	initFuture = init();
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes-class.html b/docs/pages/Routes-class.html deleted file mode 100644 index da8e0452f..000000000 --- a/docs/pages/Routes-class.html +++ /dev/null @@ -1,398 +0,0 @@ - - - - - - - - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Routes
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Routes class - Null safety - -

                        - - -
                        -

                        Route names for each page in the app.

                        -

                        These would be enums, but Flutter requires Strings.

                        -
                        - - - -
                        -

                        Constructors

                        - -
                        -
                        - Routes() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - -
                        -

                        Constants

                        - -
                        -
                        - calendar - → const String - - -
                        -
                        - The route name for the calendar page. - - -
                        - "calendar" -
                        -
                        - -
                        - feedback - → const String - - -
                        -
                        - The route name for the feedback page. - - -
                        - "feedback" -
                        -
                        - -
                        - home - → const String - - -
                        -
                        - The route name for the home page. - - -
                        - "home" -
                        -
                        - -
                        - login - → const String - - -
                        -
                        - The route name for the login page. - - -
                        - "login" -
                        -
                        - -
                        - reminders - → const String - - -
                        -
                        - The route name for the reminders page. - - -
                        - "reminders" -
                        -
                        - -
                        - schedule - → const String - - -
                        -
                        - The route name for the schedule page. - - -
                        - "schedule" -
                        -
                        - -
                        - schedules - → const String - - -
                        -
                        - The route name for the schedules manager page. - - -
                        - "schedules" -
                        -
                        - -
                        - sports - → const String - - -
                        -
                        - The route name for the sports games page. - - -
                        - "sports" -
                        -
                        - -
                        -
                        - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/Routes.html b/docs/pages/Routes/Routes.html deleted file mode 100644 index 38797673b..000000000 --- a/docs/pages/Routes/Routes.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - Routes constructor - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Routes
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Routes constructor - Null safety -

                        - -
                        - Routes() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/calendar-constant.html b/docs/pages/Routes/calendar-constant.html deleted file mode 100644 index 5d70b18c0..000000000 --- a/docs/pages/Routes/calendar-constant.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - calendar constant - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        calendar
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        calendar constant - Null safety -

                        - -
                        - String - const calendar - - -
                        - -
                        -

                        The route name for the calendar page.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String calendar = "calendar";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/feedback-constant.html b/docs/pages/Routes/feedback-constant.html deleted file mode 100644 index e07f1afbe..000000000 --- a/docs/pages/Routes/feedback-constant.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - feedback constant - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        feedback
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        feedback constant - Null safety -

                        - -
                        - String - const feedback - - -
                        - -
                        -

                        The route name for the feedback page.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String feedback = "feedback";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/hashCode.html b/docs/pages/Routes/hashCode.html deleted file mode 100644 index 641314639..000000000 --- a/docs/pages/Routes/hashCode.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - hashCode property - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/home-constant.html b/docs/pages/Routes/home-constant.html deleted file mode 100644 index b1dee331f..000000000 --- a/docs/pages/Routes/home-constant.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - home constant - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        home
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        home constant - Null safety -

                        - -
                        - String - const home - - -
                        - -
                        -

                        The route name for the home page.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String home = "home";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/login-constant.html b/docs/pages/Routes/login-constant.html deleted file mode 100644 index da4a4bbf8..000000000 --- a/docs/pages/Routes/login-constant.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - login constant - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        login
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        login constant - Null safety -

                        - -
                        - String - const login - - -
                        - -
                        -

                        The route name for the login page.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String login = "login";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/noSuchMethod.html b/docs/pages/Routes/noSuchMethod.html deleted file mode 100644 index 88b55ec2e..000000000 --- a/docs/pages/Routes/noSuchMethod.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - noSuchMethod method - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/operator_equals.html b/docs/pages/Routes/operator_equals.html deleted file mode 100644 index a3c74d376..000000000 --- a/docs/pages/Routes/operator_equals.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - operator == method - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/reminders-constant.html b/docs/pages/Routes/reminders-constant.html deleted file mode 100644 index 875e2fef3..000000000 --- a/docs/pages/Routes/reminders-constant.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - reminders constant - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        reminders
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        reminders constant - Null safety -

                        - -
                        - String - const reminders - - -
                        - -
                        -

                        The route name for the reminders page.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String reminders = "reminders";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/runtimeType.html b/docs/pages/Routes/runtimeType.html deleted file mode 100644 index deb563c78..000000000 --- a/docs/pages/Routes/runtimeType.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - runtimeType property - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/schedule-constant.html b/docs/pages/Routes/schedule-constant.html deleted file mode 100644 index d7b50e1ff..000000000 --- a/docs/pages/Routes/schedule-constant.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - schedule constant - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        schedule
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        schedule constant - Null safety -

                        - -
                        - String - const schedule - - -
                        - -
                        -

                        The route name for the schedule page.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String schedule = "schedule";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/schedules-constant.html b/docs/pages/Routes/schedules-constant.html deleted file mode 100644 index d3c638526..000000000 --- a/docs/pages/Routes/schedules-constant.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - schedules constant - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        schedules
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        schedules constant - Null safety -

                        - -
                        - String - const schedules - - -
                        - -
                        -

                        The route name for the schedules manager page.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String schedules = "schedules";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/sports-constant.html b/docs/pages/Routes/sports-constant.html deleted file mode 100644 index fa60c151c..000000000 --- a/docs/pages/Routes/sports-constant.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - sports constant - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        sports
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        sports constant - Null safety -

                        - -
                        - String - const sports - - -
                        - -
                        -

                        The route name for the sports games page.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String sports = "sports";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/Routes/toString.html b/docs/pages/Routes/toString.html deleted file mode 100644 index 976e012be..000000000 --- a/docs/pages/Routes/toString.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - toString method - Routes class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - -
                        inherited
                        - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external String toString();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilder-class.html b/docs/pages/ScheduleBuilder-class.html deleted file mode 100644 index 18925f13f..000000000 --- a/docs/pages/ScheduleBuilder-class.html +++ /dev/null @@ -1,440 +0,0 @@ - - - - - - - - ScheduleBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ScheduleBuilder
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ScheduleBuilder class - Null safety - -

                        - - -
                        -

                        A widget to guide the admin in creating a Schedule.

                        -

                        The Schedule doesn't have to be created from scratch, it can be based on -an existing schedule by passing it as a parameter to ScheduleBuilder().

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - ScheduleBuilder([Schedule? preset]) -
                        -
                        - Creates a widget to guide the user in creating a schedule. -
                        const
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - preset - Schedule? - -
                        -
                        - The Schedule to base this schedule on. -
                        final
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - createElement() - StatefulElement - - - -
                        -
                        - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - createState() - ScheduleBuilderState - - - -
                        -
                        - Creates the mutable state for this widget at a given location in the tree. [...] -
                        override
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - -
                        -

                        Static Methods

                        -
                        -
                        - buildSchedule(BuildContext context, [Schedule? preset]) - → Future<Schedule?> - - - -
                        -
                        - Returns the Schedule created by this widget. - - -
                        - -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilder/ScheduleBuilder.html b/docs/pages/ScheduleBuilder/ScheduleBuilder.html deleted file mode 100644 index a4ab95c6a..000000000 --- a/docs/pages/ScheduleBuilder/ScheduleBuilder.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - ScheduleBuilder constructor - ScheduleBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ScheduleBuilder
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ScheduleBuilder constructor - Null safety -

                        - -
                        const - ScheduleBuilder(
                        1. [Schedule? preset]
                        2. -
                        ) -
                        - - -
                        -

                        Creates a widget to guide the user in creating a schedule.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const ScheduleBuilder([this.preset]);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilder/buildSchedule.html b/docs/pages/ScheduleBuilder/buildSchedule.html deleted file mode 100644 index d53dcb073..000000000 --- a/docs/pages/ScheduleBuilder/buildSchedule.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - buildSchedule method - ScheduleBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        buildSchedule
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        buildSchedule method - Null safety -

                        - -
                        - - -Future<Schedule?> -buildSchedule(
                        1. BuildContext context,
                        2. -
                        3. [Schedule? preset]
                        4. -
                        ) - - - -
                        - -
                        -

                        Returns the Schedule created by this widget.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        static Future<Schedule?> buildSchedule(
                        -	BuildContext context,
                        -	[Schedule? preset]
                        -) => showDialog(
                        -	context: context,
                        -	builder: (_) => ScheduleBuilder(preset),
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilder/createState.html b/docs/pages/ScheduleBuilder/createState.html deleted file mode 100644 index 20c0482d7..000000000 --- a/docs/pages/ScheduleBuilder/createState.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - createState method - ScheduleBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        createState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        createState method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -ScheduleBuilderState -createState() - -
                        override
                        - -
                        - -
                        -

                        Creates the mutable state for this widget at a given location in the tree.

                        -

                        Subclasses should override this method to return a newly created -instance of their associated State subclass:

                        -
                        @override
                        -_MyState createState() => _MyState();
                        -
                        -

                        The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -ScheduleBuilderState createState() => ScheduleBuilderState();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilder/preset.html b/docs/pages/ScheduleBuilder/preset.html deleted file mode 100644 index 4a660b0c7..000000000 --- a/docs/pages/ScheduleBuilder/preset.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - preset property - ScheduleBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        preset
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        preset property - Null safety -

                        - -
                        - Schedule? - preset -
                        final
                        - -
                        - -
                        -

                        The Schedule to base this schedule on.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Schedule? preset;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilderState-class.html b/docs/pages/ScheduleBuilderState-class.html deleted file mode 100644 index 88a557e09..000000000 --- a/docs/pages/ScheduleBuilderState-class.html +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - - - ScheduleBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ScheduleBuilderState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ScheduleBuilderState class - Null safety - -

                        - - -
                        -

                        A state for a ScheduleBuilder.

                        -

                        A state is needed to keep the TextEditingController from rebuilding.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - ScheduleBuilderState() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - conflicting - ↔ bool - -
                        -
                        - If the name of the schedule conflicts with another one. [...] -
                        read / write
                        - -
                        - -
                        - context - BuildContext - -
                        -
                        - The location in the tree where this widget builds. [...] -
                        read-only, inherited
                        - -
                        - -
                        - controller - TextEditingController - -
                        -
                        - A controller to hold the name of the Schedule. [...] -
                        final
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - mounted - → bool - -
                        -
                        - Whether this State object is currently in a tree. [...] -
                        read-only, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        - widget - ScheduleBuilder - -
                        -
                        - The current configuration. [...] -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - deactivate() - → void - - - -
                        -
                        - Called when this object is removed from the tree. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - didChangeDependencies() - → void - - - -
                        -
                        - Called when a dependency of this State object changes. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - didUpdateWidget(covariant ScheduleBuilder oldWidget) - → void - - - -
                        -
                        - Called whenever the widget configuration changes. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - dispose() - → void - - - -
                        -
                        - Called when this object is removed from the tree permanently. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - initState() - → void - - - -
                        -
                        - Called when this object is inserted into the tree. [...] -
                        override
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - reassemble() - → void - - - -
                        -
                        - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - setState(VoidCallback fn) - → void - - - -
                        -
                        - Notify the framework that the internal state of this object has changed. [...] -
                        @protected, inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilderState/ScheduleBuilderState.html b/docs/pages/ScheduleBuilderState/ScheduleBuilderState.html deleted file mode 100644 index b3f20b206..000000000 --- a/docs/pages/ScheduleBuilderState/ScheduleBuilderState.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - ScheduleBuilderState constructor - ScheduleBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ScheduleBuilderState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ScheduleBuilderState constructor - Null safety -

                        - -
                        - ScheduleBuilderState() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilderState/build.html b/docs/pages/ScheduleBuilderState/build.html deleted file mode 100644 index e5fa5b01d..000000000 --- a/docs/pages/ScheduleBuilderState/build.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - - - build method - ScheduleBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method in a number of different situations. For -example:

                        - -

                        This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                        -

                        Design discussion

                        -

                        Why is the build method on State, and not StatefulWidget?

                        -

                        Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                        -

                        For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                        -

                        Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                        -

                        Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                        -
                        class MyButton extends StatefulWidget {
                        -  ...
                        -  final Color color;
                        -
                        -  @override
                        -  Widget build(BuildContext context, MyButtonState state) {
                        -    ... () { print("color: $color"); } ...
                        -  }
                        -}
                        -
                        -

                        For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                        -

                        In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                        -
                        class MyButtonState extends State<MyButton> {
                        -  ...
                        -  @override
                        -  Widget build(BuildContext context) {
                        -    ... () { print("color: ${widget.color}"); } ...
                        -  }
                        -}
                        -
                        -

                        Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                        -

                        See also:

                        -
                          -
                        • StatefulWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Widget build(BuildContext context) => ModelListener<ScheduleBuilderModel>(
                        -	model: () => ScheduleBuilderModel(widget.preset),
                        -	builder: (_, ScheduleBuilderModel model, Widget? cancel) => Scaffold(
                        -		appBar: AppBar(
                        -			title: const Text("Make new schedule"),
                        -			actions: [
                        -				IconButton(
                        -					icon: const Icon(Icons.sync),
                        -					tooltip: "Use preset",
                        -					onPressed: () async {
                        -						final Schedule? schedule = await showModalBottomSheet<Schedule?>(
                        -							context: context,
                        -							builder: (BuildContext context) => ListView(
                        -								children: [
                        -									const SizedBox(
                        -										width: double.infinity,
                        -										height: 60,
                        -										child: Center(
                        -											child: Text("Use a preset", textScaleFactor: 1.5),
                        -										),
                        -									),
                        -									for (final Schedule schedule in Schedule.schedules)
                        -										ListTile(
                        -											title: Text (schedule.name),
                        -											onTap: () => Navigator.of(context).pop(schedule),
                        -										),
                        -								]
                        -							)
                        -						);
                        -						if (schedule != null) {
                        -							controller.text = schedule.name;
                        -							model.usePreset(schedule);
                        -						}
                        -					}
                        -				),
                        -			]
                        -		),
                        -		floatingActionButton: FloatingActionButton.extended(
                        -			label: const Text("Save"),
                        -			icon: const Icon(Icons.done),
                        -			onPressed: !model.ready ? null :
                        -				() => Navigator.of(context).pop(model.schedule),
                        -			backgroundColor: model.ready
                        -				? Theme.of(context).accentColor
                        -				: Theme.of(context).disabledColor,
                        -		),
                        -		body: ListView(
                        -			padding: const EdgeInsets.all(15),
                        -			children: [
                        -				Padding(
                        -					padding: const EdgeInsets.symmetric(horizontal: 10),
                        -					child: TextField(
                        -						controller: controller,
                        -						onChanged: (String value) {
                        -							conflicting = Schedule.schedules.any(
                        -								(Schedule other) => other.name == value
                        -							);
                        -							model.name = value;
                        -						},
                        -						textInputAction: TextInputAction.done,
                        -						textCapitalization: TextCapitalization.sentences,
                        -						decoration: InputDecoration(
                        -							labelText: "Name",
                        -							hintText: "Name of the schedule",
                        -							errorText: conflicting
                        -								? "Name cannot match an existing schedule's name"
                        -								: null,
                        -						),
                        -					),
                        -				),
                        -				const SizedBox(height: 20),
                        -				for (int index = 0; index < model.numPeriods; index++)
                        -					PeriodTile(
                        -						model: model,
                        -						range: model.periods [index].time,
                        -						index: index,
                        -					),
                        -				Row(
                        -					children: [
                        -						TextButton.icon(
                        -							icon: const Icon (Icons.add),
                        -							label: const Text("Add"),
                        -							onPressed: () => model.numPeriods++,
                        -						),
                        -						if (model.numPeriods > 0)
                        -							TextButton.icon(
                        -								icon: const Icon(Icons.remove),
                        -								label: const Text("Remove"),
                        -								onPressed: () => model.numPeriods--
                        -							),
                        -					]
                        -				),
                        -				if (model.numPeriods == 0)
                        -					const Text(
                        -						"You can also select a preset by clicking the button on top",
                        -						textScaleFactor: 1.5,
                        -						textAlign: TextAlign.center,
                        -					),
                        -			]
                        -		)
                        -	)
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilderState/conflicting.html b/docs/pages/ScheduleBuilderState/conflicting.html deleted file mode 100644 index 7bc231fab..000000000 --- a/docs/pages/ScheduleBuilderState/conflicting.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - conflicting property - ScheduleBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        conflicting
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        conflicting property - Null safety -

                        - -
                        - bool - conflicting -
                        read / write
                        - -
                        - -
                        -

                        If the name of the schedule conflicts with another one.

                        -

                        Names of custom schedules cannot conflict with the default schedules, since -users will be confused when the app displays a familiar schedule name, but -updates at unusual times.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool conflicting = false;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilderState/controller.html b/docs/pages/ScheduleBuilderState/controller.html deleted file mode 100644 index 809ee9b86..000000000 --- a/docs/pages/ScheduleBuilderState/controller.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - controller property - ScheduleBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        controller
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        controller property - Null safety -

                        - -
                        - TextEditingController - controller -
                        final
                        - -
                        - -
                        -

                        A controller to hold the name of the Schedule.

                        -

                        This will be preset with the name of ScheduleBuilder.preset.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final TextEditingController controller = TextEditingController();
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/ScheduleBuilderState/initState.html b/docs/pages/ScheduleBuilderState/initState.html deleted file mode 100644 index 52e415455..000000000 --- a/docs/pages/ScheduleBuilderState/initState.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - initState method - ScheduleBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        initState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        initState method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -void -initState() - -
                        override
                        - -
                        - -
                        -

                        Called when this object is inserted into the tree.

                        -

                        The framework will call this method exactly once for each State object -it creates.

                        -

                        Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                        -

                        If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                        -
                          -
                        • In initState, subscribe to the object.
                        • -
                        • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                        • -
                        • In dispose, unsubscribe from the object.
                        • -
                        -

                        You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                        -

                        If you override this, make sure your method starts with a call to -super.initState().

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -void initState() {
                        -	super.initState();
                        -	controller.text = widget.preset?.name ?? "";
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportBuilderState-class.html b/docs/pages/SportBuilderState-class.html deleted file mode 100644 index 45dbb6406..000000000 --- a/docs/pages/SportBuilderState-class.html +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - - - SportBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        SportBuilderState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        SportBuilderState class - Null safety - -

                        - - -
                        -

                        A state for SportsBuilder.

                        -

                        This state keeps TextEditingControllers intact.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - SportBuilderState() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - context - BuildContext - -
                        -
                        - The location in the tree where this widget builds. [...] -
                        read-only, inherited
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - mounted - → bool - -
                        -
                        - Whether this State object is currently in a tree. [...] -
                        read-only, inherited
                        - -
                        - -
                        - opponentController - TextEditingController - -
                        -
                        - A controller to hold SportsBuilder.parent's opponent. -
                        final
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        - teamController - TextEditingController - -
                        -
                        - A controller to hold SportsBuilder.parent's team name. -
                        final
                        - -
                        - -
                        - widget - SportsBuilder - -
                        -
                        - The current configuration. [...] -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - deactivate() - → void - - - -
                        -
                        - Called when this object is removed from the tree. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - didChangeDependencies() - → void - - - -
                        -
                        - Called when a dependency of this State object changes. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - didUpdateWidget(covariant SportsBuilder oldWidget) - → void - - - -
                        -
                        - Called whenever the widget configuration changes. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - dispose() - → void - - - -
                        -
                        - Called when this object is removed from the tree permanently. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - initState() - → void - - - -
                        -
                        - Called when this object is inserted into the tree. [...] -
                        override
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - reassemble() - → void - - - -
                        -
                        - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - setState(VoidCallback fn) - → void - - - -
                        -
                        - Notify the framework that the internal state of this object has changed. [...] -
                        @protected, inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportBuilderState/SportBuilderState.html b/docs/pages/SportBuilderState/SportBuilderState.html deleted file mode 100644 index ce4ef6ab7..000000000 --- a/docs/pages/SportBuilderState/SportBuilderState.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - SportBuilderState constructor - SportBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        SportBuilderState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        SportBuilderState constructor - Null safety -

                        - -
                        - SportBuilderState() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportBuilderState/build.html b/docs/pages/SportBuilderState/build.html deleted file mode 100644 index 1b120195d..000000000 --- a/docs/pages/SportBuilderState/build.html +++ /dev/null @@ -1,370 +0,0 @@ - - - - - - - - build method - SportBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method in a number of different situations. For -example:

                        - -

                        This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                        -

                        Design discussion

                        -

                        Why is the build method on State, and not StatefulWidget?

                        -

                        Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                        -

                        For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                        -

                        Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                        -

                        Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                        -
                        class MyButton extends StatefulWidget {
                        -  ...
                        -  final Color color;
                        -
                        -  @override
                        -  Widget build(BuildContext context, MyButtonState state) {
                        -    ... () { print("color: $color"); } ...
                        -  }
                        -}
                        -
                        -

                        For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                        -

                        In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                        -
                        class MyButtonState extends State<MyButton> {
                        -  ...
                        -  @override
                        -  Widget build(BuildContext context) {
                        -    ... () { print("color: ${widget.color}"); } ...
                        -  }
                        -}
                        -
                        -

                        Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                        -

                        See also:

                        -
                          -
                        • StatefulWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Widget build(BuildContext context) => ModelListener<SportsBuilderModel>(
                        -	model: () => SportsBuilderModel(widget.parent),
                        -	builder: (_, SportsBuilderModel model, __) => Scaffold(
                        -		appBar: AppBar(title: const Text("Add game")),
                        -		bottomSheet: !model.loading ? null : Container(
                        -			height: 60,
                        -			padding: const EdgeInsets.all(10),
                        -			child: Row(
                        -				mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        -				children: const [Text("Saving..."), CircularProgressIndicator()]
                        -			)
                        -		),
                        -		body: ListView(
                        -			padding: const EdgeInsets.all(20),
                        -			children: [
                        -				FormRow(
                        -					"Sport",
                        -					DropdownButtonFormField<Sport>(
                        -						hint: const Text("Choose a sport"),
                        -						value: model.sport,
                        -						onChanged: (Sport? value) => model.sport = value,
                        -						items: [
                        -							for (final Sport sport in Sport.values)
                        -								DropdownMenuItem<Sport>(
                        -									value: sport,
                        -									child: Text(SportsGame.capitalize(sport))
                        -								)
                        -						],
                        -					),
                        -					sized: true,
                        -				),
                        -				FormRow(
                        -					"Team",
                        -					TextField(
                        -						onChanged: (String value) => model.team = value,
                        -						textCapitalization: TextCapitalization.words,
                        -						controller: teamController,
                        -					),
                        -					sized: true,
                        -				),
                        -				FormRow(
                        -					"Opponent",
                        -					TextField(
                        -						onChanged: (String value) => model.opponent = value,
                        -						textCapitalization: TextCapitalization.words,
                        -						controller: opponentController,
                        -					),
                        -					sized: true,
                        -				),
                        -				FormRow(
                        -					"Away game",
                        -					Checkbox(
                        -						value: model.away,
                        -						// If tristate == false (default), value never be null
                        -						onChanged: (bool? value) => model.away = value!,
                        -					),
                        -				),
                        -				FormRow.editable(
                        -					title: "Date",
                        -					value: SportsTile.formatDate(model.date),
                        -					whenNull: Icons.date_range,
                        -					setNewValue: () async => model.date = await pickDate(
                        -						initialDate: DateTime.now(),
                        -						context: context
                        -					),
                        -				),
                        -				FormRow.editable(
                        -					title: "Start time",
                        -					value: model.start?.format(context),
                        -					whenNull: Icons.access_time,
                        -					setNewValue: () async => model.start = await showTimePicker(
                        -						context: context,
                        -						initialTime: model.start ?? TimeOfDay.now(),
                        -					),
                        -				),
                        -				FormRow.editable(
                        -					title: "End time",
                        -					value: model.end?.format(context),
                        -					whenNull: Icons.access_time,
                        -					setNewValue: () async => model.end = await showTimePicker(
                        -						context: context,
                        -						initialTime: model.end ?? TimeOfDay.now(),
                        -					),
                        -				),
                        -				const SizedBox(height: 10),
                        -				Row(
                        -					mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        -					children: [
                        -						const Text(
                        -							"Tap on the card to change the scores",
                        -							textScaleFactor: 0.9
                        -						),
                        -						TextButton(
                        -							onPressed: () => model.scores = null,
                        -							child: const Text("Clear"),
                        -						)
                        -					]
                        -				),
                        -				const SizedBox(height: 20),
                        -				SportsTile(
                        -					model.game,
                        -					onTap: () async => model.scores =
                        -						await SportsScoreUpdater.updateScores(context, model.game)
                        -							?? model.scores
                        -				),
                        -				ButtonBar(
                        -					children: [
                        -						TextButton(
                        -							onPressed: () => Navigator.of(context).pop(),
                        -							child: const Text("Cancel"),
                        -						),
                        -						ElevatedButton(
                        -							onPressed: !model.ready ? null :
                        -								() => Navigator.of(context).pop(model.game),
                        -							child: const Text("Save"),
                        -						)
                        -					]
                        -				)
                        -			]
                        -		)
                        -	)
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportBuilderState/initState.html b/docs/pages/SportBuilderState/initState.html deleted file mode 100644 index 84bed273b..000000000 --- a/docs/pages/SportBuilderState/initState.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - initState method - SportBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        initState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        initState method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -void -initState() - -
                        override
                        - -
                        - -
                        -

                        Called when this object is inserted into the tree.

                        -

                        The framework will call this method exactly once for each State object -it creates.

                        -

                        Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                        -

                        If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                        -
                          -
                        • In initState, subscribe to the object.
                        • -
                        • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                        • -
                        • In dispose, unsubscribe from the object.
                        • -
                        -

                        You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                        -

                        If you override this, make sure your method starts with a call to -super.initState().

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -void initState() {
                        -	teamController.text = widget.parent?.team ?? "";
                        -	opponentController.text = widget.parent?.opponent ?? "";
                        -	super.initState();
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportBuilderState/opponentController.html b/docs/pages/SportBuilderState/opponentController.html deleted file mode 100644 index 9c791b624..000000000 --- a/docs/pages/SportBuilderState/opponentController.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - opponentController property - SportBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        opponentController
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        opponentController property - Null safety -

                        - -
                        - TextEditingController - opponentController -
                        final
                        - -
                        - -
                        -

                        A controller to hold SportsBuilder.parent's opponent.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final TextEditingController opponentController = TextEditingController();
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportBuilderState/teamController.html b/docs/pages/SportBuilderState/teamController.html deleted file mode 100644 index 27ff58dd4..000000000 --- a/docs/pages/SportBuilderState/teamController.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - teamController property - SportBuilderState class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        teamController
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        teamController property - Null safety -

                        - -
                        - TextEditingController - teamController -
                        final
                        - -
                        - -
                        -

                        A controller to hold SportsBuilder.parent's team name.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final TextEditingController teamController = TextEditingController();
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportsBuilder-class.html b/docs/pages/SportsBuilder-class.html deleted file mode 100644 index 95ea4d442..000000000 --- a/docs/pages/SportsBuilder-class.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - - - - - SportsBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        SportsBuilder
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        SportsBuilder class - Null safety - -

                        - - -
                        -

                        A page to create a Sports game.

                        -

                        This widget is stateful to provide a TextEditingController that has its -text preset to parent's properties (if applicable). All state is still -managed by the view model.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - SportsBuilder([SportsGame? parent]) -
                        -
                        - Creates a page to build a SportsGame. [...] -
                        const
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - parent - SportsGame? - -
                        -
                        - Fills all the properties on this page with the properties of this game. -
                        final
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - createElement() - StatefulElement - - - -
                        -
                        - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - createState() - SportBuilderState - - - -
                        -
                        - Creates the mutable state for this widget at a given location in the tree. [...] -
                        override
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - -
                        -

                        Static Methods

                        -
                        -
                        - createGame(BuildContext context, [SportsGame? parent]) - → Future<SportsGame?> - - - -
                        -
                        - Opens a form for the user to - - -
                        - -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportsBuilder/SportsBuilder.html b/docs/pages/SportsBuilder/SportsBuilder.html deleted file mode 100644 index c19f6a61c..000000000 --- a/docs/pages/SportsBuilder/SportsBuilder.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - SportsBuilder constructor - SportsBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        SportsBuilder
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        SportsBuilder constructor - Null safety -

                        - -
                        const - SportsBuilder(
                        1. [SportsGame? parent]
                        2. -
                        ) -
                        - - -
                        -

                        Creates a page to build a SportsGame.

                        -

                        Passing in parent will fill in the properties of the page with the -properties of parent.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const SportsBuilder([this.parent]);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportsBuilder/createGame.html b/docs/pages/SportsBuilder/createGame.html deleted file mode 100644 index 87395c072..000000000 --- a/docs/pages/SportsBuilder/createGame.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - createGame method - SportsBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        createGame
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        createGame method - Null safety -

                        - -
                        - - -Future<SportsGame?> -createGame(
                        1. BuildContext context,
                        2. -
                        3. [SportsGame? parent]
                        4. -
                        ) - - - -
                        - -
                        -

                        Opens a form for the user to

                        -
                        - - - -
                        -

                        Implementation

                        -
                        static Future<SportsGame?> createGame(
                        -	BuildContext context,
                        -	[SportsGame? parent]
                        -) => Navigator.of(context).push<SportsGame>(
                        -	MaterialPageRoute(
                        -		builder: (BuildContext context) => SportsBuilder(parent),
                        -	)
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportsBuilder/createState.html b/docs/pages/SportsBuilder/createState.html deleted file mode 100644 index 5cec398ca..000000000 --- a/docs/pages/SportsBuilder/createState.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - createState method - SportsBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        createState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        createState method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -SportBuilderState -createState() - -
                        override
                        - -
                        - -
                        -

                        Creates the mutable state for this widget at a given location in the tree.

                        -

                        Subclasses should override this method to return a newly created -instance of their associated State subclass:

                        -
                        @override
                        -_MyState createState() => _MyState();
                        -
                        -

                        The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -SportBuilderState createState() => SportBuilderState();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportsBuilder/parent.html b/docs/pages/SportsBuilder/parent.html deleted file mode 100644 index 308edbaaa..000000000 --- a/docs/pages/SportsBuilder/parent.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - parent property - SportsBuilder class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        parent
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        parent property - Null safety -

                        - -
                        - SportsGame? - parent -
                        final
                        - -
                        - -
                        -

                        Fills all the properties on this page with the properties of this game.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final SportsGame? parent;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportsPage-class.html b/docs/pages/SportsPage-class.html deleted file mode 100644 index 1b6eb5c57..000000000 --- a/docs/pages/SportsPage-class.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - SportsPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        SportsPage
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        SportsPage class - Null safety - -

                        - - -
                        -

                        A page to show recent and upcoming games to the user.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - SportsPage() -
                        -
                        - -
                        const
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - createElement() - StatelessElement - - - -
                        -
                        - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportsPage/SportsPage.html b/docs/pages/SportsPage/SportsPage.html deleted file mode 100644 index 2acbe6aee..000000000 --- a/docs/pages/SportsPage/SportsPage.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - SportsPage constructor - SportsPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        SportsPage
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        SportsPage constructor - Null safety -

                        - -
                        const - SportsPage() -
                        - - - - - -
                        -

                        Implementation

                        -
                        const SportsPage();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/SportsPage/build.html b/docs/pages/SportsPage/build.html deleted file mode 100644 index 6fc37fda7..000000000 --- a/docs/pages/SportsPage/build.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - build method - SportsPage class - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                        -

                        The implementation of this method must only depend on:

                        - -

                        If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                        -

                        See also:

                        -
                          -
                        • StatelessWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Widget build(BuildContext context) => DefaultTabController(
                        -	length: 2,
                        -	child: ModelListener<SportsModel>(
                        -		model: () => SportsModel(Models.instance.sports),
                        -		builder: (_, SportsModel model, __) => ResponsiveScaffold(
                        -			appBar: buildAppBar(model),
                        -			drawer: const NavigationDrawer(),
                        -			bodyBuilder: (_) => getLayout(context, model),
                        -		),
                        -	)
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/buildAppBar.html b/docs/pages/buildAppBar.html deleted file mode 100644 index dc2f7b016..000000000 --- a/docs/pages/buildAppBar.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - buildAppBar function - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        buildAppBar
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        buildAppBar function - Null safety - -

                        - -
                        - - -AppBar -buildAppBar(
                        1. SportsModel model
                        2. -
                        ) - -
                        - - - - -
                        -

                        Implementation

                        -
                        AppBar buildAppBar(SportsModel model) => AppBar(
                        -	title: const Text("Sports"),
                        -	bottom: const TabBar(
                        -		tabs: [
                        -			Tab(text: "Upcoming"),
                        -			Tab(text: "Recent"),
                        -		]
                        -	),
                        -	actions: [
                        -		ModelListener<SportsModel>(
                        -			model: () => model,
                        -			dispose: false,
                        -			builder: (BuildContext context, __, ___) => !model.isAdmin ? Container()
                        -				: IconButton(
                        -					icon: const Icon(Icons.add),
                        -					tooltip: "Add a game",
                        -					onPressed: model.adminFunc(() async =>
                        -						model.data.addGame(await SportsBuilder.createGame(context))
                        -					),
                        -				),
                        -		),
                        -    PopupMenuButton(
                        -      icon: const Icon(Icons.sort),
                        -      onSelected: (SortOption option) => model.sortOption = option,
                        -      tooltip: "Sort games",
                        -      itemBuilder: (_) => [
                        -        const PopupMenuItem(
                        -          value: SortOption.chronological,
                        -          child: Text("By date"),
                        -        ),
                        -        const PopupMenuItem(
                        -          value: SortOption.sport,
                        -          child: Text("By sport"),
                        -        )
                        -      ]
                        -    ),
                        -    IconButton(
                        -    	icon: const Icon(Icons.live_tv),
                        -    	onPressed: () => launch(Urls.sportsLivestream),
                        -    	tooltip: "Watch livestream",
                        -  	)
                        -	]
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/getLayout.html b/docs/pages/getLayout.html deleted file mode 100644 index 7faec9960..000000000 --- a/docs/pages/getLayout.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - getLayout function - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        getLayout
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        getLayout function - Null safety - -

                        - -
                        - - -Widget -getLayout(
                        1. BuildContext context,
                        2. -
                        3. SportsModel model
                        4. -
                        ) - -
                        - -
                        -

                        Creates a GenericSportsView based on the sorting option.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Widget getLayout(BuildContext context, SportsModel model) {
                        -	switch(model.sortOption) {
                        -		case SortOption.chronological:
                        -			return GenericSportsView<int>(
                        -				loading: model.loading,
                        -				onRefresh: model.adminFunc(Services.instance.database.updateSports),
                        -				recents: model.recents,
                        -				upcoming: model.upcoming,
                        -				builder: (int index) => SportsTile(
                        -					model.data.games [index],
                        -					onTap: !model.isAdmin ? null : () => openMenu(
                        -						context: context,
                        -						index: index,
                        -						model: model,
                        -					)
                        -				),
                        -			);
                        -		case SortOption.sport:
                        -			return GenericSportsView<MapEntry<Sport, List<int>>>(
                        -				loading: model.loading,
                        -				onRefresh: model.adminFunc(Services.instance.database.updateSports),
                        -				recents: model.recentBySport.entries.toList(),
                        -				upcoming: model.upcomingBySport.entries.toList(),
                        -				builder: (MapEntry<Sport, List<int>> entry) => Column(
                        -					children: [
                        -						const SizedBox(height: 15),
                        -						Text(SportsGame.capitalize(entry.key)),
                        -						for (final int index in entry.value)
                        -							SportsTile(
                        -								model.data.games [index],
                        -								onTap: !model.isAdmin ? null : () => openMenu(
                        -									context: context,
                        -									index: index,
                        -									model: model
                        -								)
                        -							),
                        -						const SizedBox(height: 20),
                        -					]
                        -				)
                        -			);
                        -	}
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/openMenu.html b/docs/pages/openMenu.html deleted file mode 100644 index c1da585ee..000000000 --- a/docs/pages/openMenu.html +++ /dev/null @@ -1,243 +0,0 @@ - - - - - - - - openMenu function - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        openMenu
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        openMenu function - Null safety - -

                        - -
                        - - -void -openMenu(
                        1. {required BuildContext context,
                        2. -
                        3. required int index,
                        4. -
                        5. required SportsModel model}
                        6. -
                        ) - -
                        - -
                        -

                        Opens a menu with options for the selected game.

                        -

                        This menu can only be accessed by administrators.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        void openMenu({
                        -	required BuildContext context,
                        -	required int index,
                        -	required SportsModel model
                        -}) => showDialog(
                        -	context: context,
                        -	builder: (BuildContext newContext) => SimpleDialog(
                        -		title: Text(model.data.games [index].description),
                        -		children: [
                        -			SimpleDialogOption(
                        -			  onPressed: () async {
                        -			  	Navigator.of(newContext).pop();
                        -			  	final Scores? scores = await SportsScoreUpdater.updateScores(
                        -		  			context, model.data.games [index]
                        -	  			);
                        -			  	if (scores == null) {
                        -			  		return;
                        -			  	}
                        -			  	model.loading = true;
                        -			  	await Models.instance.sports.replace(
                        -				  	index,
                        -				  	model.data.games [index].replaceScores(scores)
                        -		  		);
                        -			  	model.loading = false;
                        -		  	},
                        -			  child: const Text("Edit scores", textScaleFactor: 1.2),
                        -			),
                        -			const SizedBox(height: 10),
                        -			SimpleDialogOption(
                        -				onPressed: () async {
                        -			  	Navigator.of(newContext).pop();
                        -			  	model.loading = true;
                        -			  	await Models.instance.sports.replace(
                        -				  	index,
                        -				  	model.data.games [index].replaceScores(null)
                        -		  		);
                        -			  	model.loading = false;
                        -				},
                        -				child: const Text("Remove scores", textScaleFactor: 1.2),
                        -			),
                        -			const SizedBox(height: 10),
                        -			SimpleDialogOption(
                        -			  onPressed: () async {
                        -			  	Navigator.of(newContext).pop();
                        -			  	model.loading = true;
                        -			  	await Models.instance.sports.replace(
                        -				  	index,
                        -				  	await SportsBuilder.createGame(context, model.data.games [index])
                        -			  	);
                        -			  	model.loading = false;
                        -		  	},
                        -			  child: const Text("Edit game", textScaleFactor: 1.2),
                        -			),
                        -			const SizedBox(height: 10),
                        -			SimpleDialogOption(
                        -			  onPressed: () async {
                        -			  	Navigator.of(newContext).pop();
                        -			  	final bool? confirm = await showDialog(
                        -			  		context: context,
                        -			  		builder: (BuildContext context) => AlertDialog(
                        -			  			title: const Text("Confirm"),
                        -			  			content: const Text("Are you sure you want to delete this game?"),
                        -			  			actions: [
                        -			  				TextButton(
                        -			  					onPressed: () => Navigator.of(context).pop(false),
                        -			  					child: const Text("Cancel"),
                        -		  					),
                        -		  					ElevatedButton(
                        -		  						onPressed: () => Navigator.of(context).pop(true),
                        -		  						child: const Text("Confirm"),
                        -	  						)
                        -			  			]
                        -		  			)
                        -		  		);
                        -		  		if (confirm ?? false) {
                        -		  			model.loading = true;
                        -				  	await Models.instance.sports.delete(index);
                        -		  			model.loading = false;
                        -				  }
                        -			  },
                        -			  child: const Text("Remove game", textScaleFactor: 1.2),
                        -			),
                        -		]
                        -	)
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/pages/pages-library.html b/docs/pages/pages-library.html deleted file mode 100644 index 3889d684f..000000000 --- a/docs/pages/pages-library.html +++ /dev/null @@ -1,410 +0,0 @@ - - - - - - - - pages library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        pages
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        pages library - Null safety - -

                        - - - - -
                        -

                        Classes

                        - -
                        -
                        - AdminCalendarPage - -
                        -
                        - A page for admins to modify the calendar in the database. -
                        - -
                        - AdminCalendarState - -
                        -
                        - -
                        - -
                        - AdminSchedulesPage - -
                        -
                        - A page to show the admin's custom schedules. -
                        - -
                        - DayBuilder - -
                        -
                        - A widget to guide the admin in modifying a day in the calendar. [...] -
                        - -
                        - FeedbackPage - -
                        -
                        - A page to submit feedback. -
                        - -
                        - FormRow - -
                        -
                        - A row in a form. [...] -
                        - -
                        - GenericSportsView<T> - -
                        -
                        - A Swipe to Refresh list of SportsGames. [...] -
                        - -
                        - HomePage - -
                        -
                        - -
                        - -
                        - HomePageState - -
                        -
                        - -
                        - -
                        - Login - -
                        -
                        - The login page. [...] -
                        - -
                        - LoginState - -
                        -
                        - A state for the login page. [...] -
                        - - -
                        - A drawer to show throughout the app. -
                        - -
                        - OldCalendarWidget - -
                        -
                        - A widget to represent a calendar icon. [...] -
                        - -
                        - ReminderBuilder - -
                        -
                        - A widget to help the user create a Reminder. [...] -
                        - -
                        - ReminderBuilderState - -
                        -
                        - A state for a ReminderBuilder. [...] -
                        - -
                        - ResponsiveReminders - -
                        -
                        - -
                        - -
                        - ResponsiveSchedule - -
                        -
                        - -
                        - -
                        - RouteInitializer - -
                        -
                        - A route that performs initialization logic first. -
                        - -
                        - RouteInitializerState - -
                        -
                        - The state for a RouteInitializer. -
                        - -
                        - Routes - -
                        -
                        - Route names for each page in the app. [...] -
                        - -
                        - ScheduleBuilder - -
                        -
                        - A widget to guide the admin in creating a Schedule. [...] -
                        - -
                        - ScheduleBuilderState - -
                        -
                        - A state for a ScheduleBuilder. [...] -
                        - -
                        - SportBuilderState - -
                        -
                        - A state for SportsBuilder. [...] -
                        - -
                        - SportsBuilder - -
                        -
                        - A page to create a Sports game. [...] -
                        - -
                        - SportsPage - -
                        -
                        - A page to show recent and upcoming games to the user. -
                        - -
                        -
                        - - - - - -
                        -

                        Functions

                        - -
                        -
                        - buildAppBar(SportsModel model) - AppBar - - - -
                        -
                        - - - -
                        - -
                        - getLayout(BuildContext context, SportsModel model) - Widget - - - -
                        -
                        - Creates a GenericSportsView based on the sorting option. - - -
                        - -
                        - openMenu({required BuildContext context, required int index, required SportsModel model}) - → void - - - -
                        -
                        - Opens a menu with options for the selected game. [...] - - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth-class.html b/docs/ramaz_services/Auth-class.html deleted file mode 100644 index 671c3b801..000000000 --- a/docs/ramaz_services/Auth-class.html +++ /dev/null @@ -1,444 +0,0 @@ - - - - - - - - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Auth
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Auth class - Null safety - -

                        - - -
                        -

                        An abstraction around FirebaseAuth.

                        -

                        This class handles all authentication operations via static methods. Do -not create an instance of this class; it is not a Service. Instead, use -it from within other services.

                        -
                        - - - -
                        -

                        Constructors

                        - -
                        -
                        - Auth() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Static Properties

                        - -
                        -
                        - adminScopes - → Future<List<String>?> - -
                        -
                        - The scopes of an admin. [...] -
                        read-only
                        - -
                        - -
                        - auth - FirebaseAuth - -
                        -
                        - The FirebaseAuth service. -
                        final
                        - -
                        - -
                        - claims - → Future<Map<String, dynamic>?> - -
                        -
                        - Gets the user's custom claims. [...] -
                        read-only
                        - -
                        - -
                        - email - → String? - -
                        -
                        - The user's email. [...] -
                        read-only
                        - -
                        - -
                        - google - GoogleSignIn - -
                        -
                        - The GoogleSignIn service. -
                        final
                        - -
                        - -
                        - isAdmin - → Future<bool> - -
                        -
                        - Whether the user is an admin. [...] -
                        read-only
                        - -
                        - -
                        - isCalendarAdmin - → Future<bool> - -
                        -
                        - Whether the user is an admin for the calendar. -
                        read-only
                        - -
                        - -
                        - isSignedIn - → bool - -
                        -
                        - Determines whether the user is currently logged -
                        read-only
                        - -
                        - -
                        - isSportsAdmin - → Future<bool> - -
                        -
                        - Whether the user is an admin for sports games. -
                        read-only
                        - -
                        - -
                        - name - → String? - -
                        -
                        - The user's full name. -
                        read-only
                        - -
                        - -
                        -
                        - -
                        -

                        Static Methods

                        -
                        -
                        - signIn() - → Future<void> - - - -
                        -
                        - Signs the user in using Google as a provider. - - -
                        - -
                        - signOut() - → Future<void> - - - -
                        -
                        - Signs out the currently logged in user. - - -
                        - -
                        -
                        - -
                        -

                        Constants

                        - -
                        -
                        - calendarScope - → const String - - -
                        -
                        - The scope for calendar admins. [...] - - -
                        - "calendar" -
                        -
                        - -
                        - sportsScope - → const String - - -
                        -
                        - The scope for sports admins. [...] - - -
                        - "sports" -
                        -
                        - -
                        -
                        - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/Auth.html b/docs/ramaz_services/Auth/Auth.html deleted file mode 100644 index 5e3d8ad9f..000000000 --- a/docs/ramaz_services/Auth/Auth.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - Auth constructor - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Auth
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Auth constructor - Null safety -

                        - -
                        - Auth() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/adminScopes.html b/docs/ramaz_services/Auth/adminScopes.html deleted file mode 100644 index 555d39bc8..000000000 --- a/docs/ramaz_services/Auth/adminScopes.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - adminScopes property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        adminScopes
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        adminScopes property - Null safety -

                        - - - -
                        - -
                        - Future<List<String>?> - adminScopes - - -
                        - - -
                        -

                        The scopes of an admin.

                        -

                        Returns null if the user is not an admin (ie, isAdmin returns false).

                        -
                        - - -
                        -

                        Implementation

                        -
                        static Future<List<String>?> get adminScopes async {
                        -	final Iterable? customClaims = (await claims) ?["scopes"];
                        -	return customClaims == null ? null : [
                        -		for (final String scope in customClaims)
                        -			scope.toString()
                        -	];
                        -}
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/auth.html b/docs/ramaz_services/Auth/auth.html deleted file mode 100644 index 5a8339bba..000000000 --- a/docs/ramaz_services/Auth/auth.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - auth property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        auth
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        auth property - Null safety -

                        - -
                        - FirebaseAuth - auth -
                        final
                        - -
                        - -
                        -

                        The FirebaseAuth service.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static final FirebaseAuth auth = FirebaseAuth.instance;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/calendarScope-constant.html b/docs/ramaz_services/Auth/calendarScope-constant.html deleted file mode 100644 index 82d97a418..000000000 --- a/docs/ramaz_services/Auth/calendarScope-constant.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - calendarScope constant - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        calendarScope
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        calendarScope constant - Null safety -

                        - -
                        - String - const calendarScope - - -
                        - -
                        -

                        The scope for calendar admins.

                        -

                        This string should be found in the user's Firebase custom claims.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String calendarScope = "calendar";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/claims.html b/docs/ramaz_services/Auth/claims.html deleted file mode 100644 index dad274c8f..000000000 --- a/docs/ramaz_services/Auth/claims.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - claims property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        claims
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        claims property - Null safety -

                        - - - -
                        - -
                        - Future<Map<String, dynamic>?> - claims - - -
                        - - -
                        -

                        Gets the user's custom claims.

                        -

                        See the official Firebase docs.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static Future<Map<String, dynamic>?> get claims async => !isSignedIn ? null
                        -	: (await _currentUser!.getIdTokenResult()).claims;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/email.html b/docs/ramaz_services/Auth/email.html deleted file mode 100644 index d2784b291..000000000 --- a/docs/ramaz_services/Auth/email.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - email property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        email
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        email property - Null safety -

                        - - - -
                        - -
                        - String? - email - - -
                        - - -
                        -

                        The user's email.

                        -

                        Since the database is case-sensitive, we standardize the lower case.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static String? get email => _currentUser?.email?.toLowerCase();
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/google.html b/docs/ramaz_services/Auth/google.html deleted file mode 100644 index f3f9822df..000000000 --- a/docs/ramaz_services/Auth/google.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - google property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        google
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        google property - Null safety -

                        - -
                        - GoogleSignIn - google -
                        final
                        - -
                        - -
                        -

                        The GoogleSignIn service.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static final GoogleSignIn google = GoogleSignIn(hostedDomain: "ramaz.org");
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/hashCode.html b/docs/ramaz_services/Auth/hashCode.html deleted file mode 100644 index c80d0a76a..000000000 --- a/docs/ramaz_services/Auth/hashCode.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - hashCode property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/isAdmin.html b/docs/ramaz_services/Auth/isAdmin.html deleted file mode 100644 index abe4ec03f..000000000 --- a/docs/ramaz_services/Auth/isAdmin.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - isAdmin property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isAdmin
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isAdmin property - Null safety -

                        - - - -
                        - -
                        - Future<bool> - isAdmin - - -
                        - - -
                        -

                        Whether the user is an admin.

                        -

                        This works by checking for an "isAdmin" flag in the user's custom claims.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static Future<bool> get isAdmin async {
                        -	final Map? customClaims = await claims;
                        -	return customClaims != null && (customClaims ["isAdmin"] ?? false);
                        -}
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/isCalendarAdmin.html b/docs/ramaz_services/Auth/isCalendarAdmin.html deleted file mode 100644 index b133054c5..000000000 --- a/docs/ramaz_services/Auth/isCalendarAdmin.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - isCalendarAdmin property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isCalendarAdmin
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isCalendarAdmin property - Null safety -

                        - - - -
                        - -
                        - Future<bool> - isCalendarAdmin - - -
                        - - -
                        -

                        Whether the user is an admin for the calendar.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static Future<bool> get isCalendarAdmin async =>
                        -	(await adminScopes)?.contains(calendarScope) ?? false;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/isSignedIn.html b/docs/ramaz_services/Auth/isSignedIn.html deleted file mode 100644 index 26e3e3b69..000000000 --- a/docs/ramaz_services/Auth/isSignedIn.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - isSignedIn property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isSignedIn
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isSignedIn property - Null safety -

                        - - - -
                        - -
                        - bool - isSignedIn - - -
                        - - -
                        -

                        Determines whether the user is currently logged

                        -
                        - - -
                        -

                        Implementation

                        -
                        static bool get isSignedIn => _currentUser != null;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/isSportsAdmin.html b/docs/ramaz_services/Auth/isSportsAdmin.html deleted file mode 100644 index b7010baa5..000000000 --- a/docs/ramaz_services/Auth/isSportsAdmin.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - isSportsAdmin property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isSportsAdmin
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isSportsAdmin property - Null safety -

                        - - - -
                        - -
                        - Future<bool> - isSportsAdmin - - -
                        - - -
                        -

                        Whether the user is an admin for sports games.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static Future<bool> get isSportsAdmin async =>
                        -	(await adminScopes)?.contains(sportsScope) ?? false;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/name.html b/docs/ramaz_services/Auth/name.html deleted file mode 100644 index 2d4f4721b..000000000 --- a/docs/ramaz_services/Auth/name.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - name property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        name
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        name property - Null safety -

                        - - - -
                        - -
                        - String? - name - - -
                        - - -
                        -

                        The user's full name.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static String? get name => _currentUser?.displayName;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/noSuchMethod.html b/docs/ramaz_services/Auth/noSuchMethod.html deleted file mode 100644 index 807a4b9da..000000000 --- a/docs/ramaz_services/Auth/noSuchMethod.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - noSuchMethod method - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/operator_equals.html b/docs/ramaz_services/Auth/operator_equals.html deleted file mode 100644 index fa3b88416..000000000 --- a/docs/ramaz_services/Auth/operator_equals.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - operator == method - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/runtimeType.html b/docs/ramaz_services/Auth/runtimeType.html deleted file mode 100644 index 3005ca09c..000000000 --- a/docs/ramaz_services/Auth/runtimeType.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - runtimeType property - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/signIn.html b/docs/ramaz_services/Auth/signIn.html deleted file mode 100644 index baad314ed..000000000 --- a/docs/ramaz_services/Auth/signIn.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - signIn method - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        signIn
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        signIn method - Null safety -

                        - -
                        - - -Future<void> -signIn() - - - -
                        - -
                        -

                        Signs the user in using Google as a provider.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        static Future<void> signIn() async {
                        -	final GoogleSignInAccount? googleAccount = await google.signIn();
                        -	if (googleAccount == null) {
                        -		throw NoAccountException();
                        -	}
                        -	final GoogleSignInAuthentication googleAuth =
                        -		await googleAccount.authentication;
                        -
                        -	final AuthCredential credential = GoogleAuthProvider.credential(
                        -		accessToken: googleAuth.accessToken,
                        -		idToken: googleAuth.idToken,
                        -	);
                        -
                        -	await auth.signInWithCredential(credential);
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/signOut.html b/docs/ramaz_services/Auth/signOut.html deleted file mode 100644 index ab4175458..000000000 --- a/docs/ramaz_services/Auth/signOut.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - signOut method - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        signOut
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        signOut method - Null safety -

                        - -
                        - - -Future<void> -signOut() - - - -
                        - -
                        -

                        Signs out the currently logged in user.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        static Future<void> signOut() async {
                        -	await google.signOut();
                        -	await google.disconnect();
                        -	await auth.signOut();
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/sportsScope-constant.html b/docs/ramaz_services/Auth/sportsScope-constant.html deleted file mode 100644 index 9842eb82c..000000000 --- a/docs/ramaz_services/Auth/sportsScope-constant.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - sportsScope constant - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        sportsScope
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        sportsScope constant - Null safety -

                        - -
                        - String - const sportsScope - - -
                        - -
                        -

                        The scope for sports admins.

                        -

                        This string should be found in the user's Firebase custom claims.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String sportsScope = "sports";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Auth/toString.html b/docs/ramaz_services/Auth/toString.html deleted file mode 100644 index 3e387fbc5..000000000 --- a/docs/ramaz_services/Auth/toString.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - toString method - Auth class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - -
                        inherited
                        - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external String toString();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics-class.html b/docs/ramaz_services/Crashlytics-class.html deleted file mode 100644 index 5a00d4ac3..000000000 --- a/docs/ramaz_services/Crashlytics-class.html +++ /dev/null @@ -1,374 +0,0 @@ - - - - - - - - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Crashlytics
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Crashlytics class - Null safety - -

                        - - -
                        -

                        A wrapper around the Crashlytics SDK.

                        -

                        Crashlytics is a service that helps report errors from apps already in use. -Crashes and errors can be found in the Firebase console.

                        -

                        This class has a singleton, since there are multiple implementations. Use -Crashlytics.instance.

                        -
                        - - - -
                        -

                        Constructors

                        - -
                        -
                        - Crashlytics() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - didCrashLastTime - ↔ bool - -
                        -
                        - Whether the app crashed last time it ran. [...] -
                        read / write
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - init() - → Future<void> - - - -
                        -
                        - Initializes the service. [...] -
                        inherited
                        - -
                        - -
                        - log(String message) - → Future<void> - - - -
                        -
                        - Logs a message to Crashlytics. [...] - - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - recordError(dynamic exception, StackTrace stack, {dynamic context}) - → Future<void> - - - -
                        -
                        - Records an error to Crashlytics. [...] - - -
                        - -
                        - recordFlutterError(FlutterErrorDetails details) - → Future<void> - - - -
                        -
                        - Records an error in the Flutter framework. - - -
                        - -
                        - setEmail(String email) - → Future<void> - - - -
                        -
                        - Sets the email of the current user. [...] - - -
                        - -
                        - signIn() - → Future<void> - - - -
                        -
                        - A callback that runs when the user signs in. [...] -
                        inherited
                        - -
                        - -
                        - toggle(bool value) - → Future<void> - - - -
                        -
                        - Toggles Crashlytics on or off. [...] - - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Static Properties

                        - -
                        -
                        - instance - Crashlytics - -
                        -
                        - The singleton of this object. -
                        read / write
                        - -
                        - -
                        -
                        - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/Crashlytics.html b/docs/ramaz_services/Crashlytics/Crashlytics.html deleted file mode 100644 index 535f50b16..000000000 --- a/docs/ramaz_services/Crashlytics/Crashlytics.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - Crashlytics constructor - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Crashlytics
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Crashlytics constructor - Null safety -

                        - -
                        - Crashlytics() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/didCrashLastTime.html b/docs/ramaz_services/Crashlytics/didCrashLastTime.html deleted file mode 100644 index 478c90afe..000000000 --- a/docs/ramaz_services/Crashlytics/didCrashLastTime.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - didCrashLastTime property - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        didCrashLastTime
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        didCrashLastTime property - Null safety -

                        - -
                        - bool - didCrashLastTime -
                        read / write
                        - -
                        - -
                        -

                        Whether the app crashed last time it ran.

                        -

                        A "crash" according to Firebase is a fatal-error at the native level. So -most Flutter errors should not trigger this. In the future, however, it -may be helpful.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool didCrashLastTime = false;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/hashCode.html b/docs/ramaz_services/Crashlytics/hashCode.html deleted file mode 100644 index 4ace5ff63..000000000 --- a/docs/ramaz_services/Crashlytics/hashCode.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - hashCode property - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/init.html b/docs/ramaz_services/Crashlytics/init.html deleted file mode 100644 index 525985aa9..000000000 --- a/docs/ramaz_services/Crashlytics/init.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - init method - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        init
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        init method - Null safety -

                        - -
                        - - -Future<void> -init() - -
                        inherited
                        - -
                        - -
                        -

                        Initializes the service.

                        -

                        Override this function with code that needs to be run when the app starts. -A good use for this is registering with plugins that return a Future.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Future<void> init();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/instance.html b/docs/ramaz_services/Crashlytics/instance.html deleted file mode 100644 index 2f8f6a0e7..000000000 --- a/docs/ramaz_services/Crashlytics/instance.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - instance property - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        instance
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        instance property - Null safety -

                        - -
                        - Crashlytics - instance -
                        read / write
                        - -
                        - -
                        -

                        The singleton of this object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static Crashlytics instance = getCrashlytics();
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/log.html b/docs/ramaz_services/Crashlytics/log.html deleted file mode 100644 index f38b19a9f..000000000 --- a/docs/ramaz_services/Crashlytics/log.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - log method - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        log
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        log method - Null safety -

                        - -
                        - - -Future<void> -log(
                        1. String message
                        2. -
                        ) - - - -
                        - -
                        -

                        Logs a message to Crashlytics.

                        -

                        Put these everywhere. That way, if the app does crash, the error report -will be full of context.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Future<void> log(String message);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/noSuchMethod.html b/docs/ramaz_services/Crashlytics/noSuchMethod.html deleted file mode 100644 index feb291ae2..000000000 --- a/docs/ramaz_services/Crashlytics/noSuchMethod.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - noSuchMethod method - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/operator_equals.html b/docs/ramaz_services/Crashlytics/operator_equals.html deleted file mode 100644 index 1460d4047..000000000 --- a/docs/ramaz_services/Crashlytics/operator_equals.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - operator == method - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/recordError.html b/docs/ramaz_services/Crashlytics/recordError.html deleted file mode 100644 index cd83806ca..000000000 --- a/docs/ramaz_services/Crashlytics/recordError.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - recordError method - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        recordError
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        recordError method - Null safety -

                        - -
                        - - -Future<void> -recordError(
                        1. dynamic exception,
                        2. -
                        3. StackTrace stack,
                        4. -
                        5. {dynamic context}
                        6. -
                        ) - - - -
                        - -
                        -

                        Records an error to Crashlytics.

                        -

                        This function is meant for Dart errors. For Flutter errors, use -recordFlutterError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Future<void> recordError(
                        -	dynamic exception,
                        -	StackTrace stack,
                        -	{dynamic context}
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/recordFlutterError.html b/docs/ramaz_services/Crashlytics/recordFlutterError.html deleted file mode 100644 index c99ed9319..000000000 --- a/docs/ramaz_services/Crashlytics/recordFlutterError.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - recordFlutterError method - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        recordFlutterError
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        recordFlutterError method - Null safety -

                        - -
                        - - -Future<void> -recordFlutterError(
                        1. FlutterErrorDetails details
                        2. -
                        ) - - - -
                        - -
                        -

                        Records an error in the Flutter framework.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Future<void> recordFlutterError(FlutterErrorDetails details);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/runtimeType.html b/docs/ramaz_services/Crashlytics/runtimeType.html deleted file mode 100644 index 4ac7405df..000000000 --- a/docs/ramaz_services/Crashlytics/runtimeType.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - runtimeType property - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/setEmail.html b/docs/ramaz_services/Crashlytics/setEmail.html deleted file mode 100644 index 6fd205b20..000000000 --- a/docs/ramaz_services/Crashlytics/setEmail.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - setEmail method - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        setEmail
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        setEmail method - Null safety -

                        - -
                        - - -Future<void> -setEmail(
                        1. String email
                        2. -
                        ) - - - -
                        - -
                        -

                        Sets the email of the current user.

                        -

                        This is helpful when looking through error reports, and enables us to dig -around the database and find corrupted data.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Future<void> setEmail(String email);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/signIn.html b/docs/ramaz_services/Crashlytics/signIn.html deleted file mode 100644 index 4c423932f..000000000 --- a/docs/ramaz_services/Crashlytics/signIn.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - signIn method - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        signIn
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        signIn method - Null safety -

                        - -
                        - - -Future<void> -signIn() - -
                        inherited
                        - -
                        - -
                        -

                        A callback that runs when the user signs in.

                        -

                        Override this function with code that facilitates the sign-in process.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Future<void> signIn();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/toString.html b/docs/ramaz_services/Crashlytics/toString.html deleted file mode 100644 index e5ef32c99..000000000 --- a/docs/ramaz_services/Crashlytics/toString.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - toString method - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - -
                        inherited
                        - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external String toString();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Crashlytics/toggle.html b/docs/ramaz_services/Crashlytics/toggle.html deleted file mode 100644 index a2fa7764d..000000000 --- a/docs/ramaz_services/Crashlytics/toggle.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - toggle method - Crashlytics class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toggle
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        toggle method - Null safety -

                        - -
                        - - -Future<void> -toggle(
                        1. bool value
                        2. -
                        ) - - - -
                        - -
                        -

                        Toggles Crashlytics on or off.

                        -

                        This should always be set to on (and it is by default), except for when -the app is running in dev mode.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        // ignore: avoid_positional_boolean_parameters
                        -Future<void> toggle(bool value);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/NoAccountException-class.html b/docs/ramaz_services/NoAccountException-class.html deleted file mode 100644 index 0ae192c3f..000000000 --- a/docs/ramaz_services/NoAccountException-class.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - - - NoAccountException class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        NoAccountException
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        NoAccountException class - Null safety - -

                        - - -
                        -

                        An exception thrown when no account has been selected.

                        -
                        - - - -
                        -

                        Constructors

                        - -
                        -
                        - NoAccountException() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/NoAccountException/NoAccountException.html b/docs/ramaz_services/NoAccountException/NoAccountException.html deleted file mode 100644 index 63cafa6ce..000000000 --- a/docs/ramaz_services/NoAccountException/NoAccountException.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - NoAccountException constructor - NoAccountException class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        NoAccountException
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        NoAccountException constructor - Null safety -

                        - -
                        - NoAccountException() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/NoAccountException/hashCode.html b/docs/ramaz_services/NoAccountException/hashCode.html deleted file mode 100644 index a08ef61de..000000000 --- a/docs/ramaz_services/NoAccountException/hashCode.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - hashCode property - NoAccountException class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/NoAccountException/noSuchMethod.html b/docs/ramaz_services/NoAccountException/noSuchMethod.html deleted file mode 100644 index 89e19a54d..000000000 --- a/docs/ramaz_services/NoAccountException/noSuchMethod.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - noSuchMethod method - NoAccountException class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/NoAccountException/operator_equals.html b/docs/ramaz_services/NoAccountException/operator_equals.html deleted file mode 100644 index 5a34728b4..000000000 --- a/docs/ramaz_services/NoAccountException/operator_equals.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - operator == method - NoAccountException class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/NoAccountException/runtimeType.html b/docs/ramaz_services/NoAccountException/runtimeType.html deleted file mode 100644 index 1a4cb186b..000000000 --- a/docs/ramaz_services/NoAccountException/runtimeType.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - runtimeType property - NoAccountException class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/NoAccountException/toString.html b/docs/ramaz_services/NoAccountException/toString.html deleted file mode 100644 index 26a476c6d..000000000 --- a/docs/ramaz_services/NoAccountException/toString.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - toString method - NoAccountException class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - -
                        inherited
                        - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external String toString();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification-class.html b/docs/ramaz_services/Notification-class.html deleted file mode 100644 index e79621fc0..000000000 --- a/docs/ramaz_services/Notification-class.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Notification
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Notification class - Null safety - -

                        - - -
                        -

                        A notification.

                        -

                        The notification has a title and a message.

                        -
                        - - -
                        -
                        - - - - - -
                        Annotations
                        -
                        -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - Notification({required String title, required String message}) -
                        -
                        - Creates a notification. -
                        const
                        -
                        -
                        - Notification.reminder({required String title, required String message}) -
                        -
                        - Creates a notification for a reminder. -
                        factory
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - message - → String - -
                        -
                        - The body of this notification. -
                        final
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        - title - → String - -
                        -
                        - The title of this notification. -
                        final
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - -
                        -

                        Constants

                        - -
                        -
                        - id - → const int - - -
                        -
                        - The ID of this notification. [...] - - -
                        - 0 -
                        -
                        - -
                        -
                        - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification/Notification.html b/docs/ramaz_services/Notification/Notification.html deleted file mode 100644 index 34fe00501..000000000 --- a/docs/ramaz_services/Notification/Notification.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - Notification constructor - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Notification
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Notification constructor - Null safety -

                        - -
                        const - Notification(
                        1. {required String title,
                        2. -
                        3. required String message}
                        4. -
                        ) -
                        - - -
                        -

                        Creates a notification.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const Notification({
                        -	required this.title,
                        -	required this.message,
                        -});
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification/Notification.reminder.html b/docs/ramaz_services/Notification/Notification.reminder.html deleted file mode 100644 index d45511476..000000000 --- a/docs/ramaz_services/Notification/Notification.reminder.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - Notification.reminder constructor - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Notification.reminder
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Notification.reminder constructor - Null safety -

                        - -
                        - Notification.reminder(
                        1. {required String title,
                        2. -
                        3. required String message}
                        4. -
                        ) -
                        - - -
                        -

                        Creates a notification for a reminder.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        factory Notification.reminder({
                        -	required String title,
                        -	required String message,
                        -}) => getReminderNotification(title: title, message: message);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification/hashCode.html b/docs/ramaz_services/Notification/hashCode.html deleted file mode 100644 index 7decd389a..000000000 --- a/docs/ramaz_services/Notification/hashCode.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - hashCode property - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification/id-constant.html b/docs/ramaz_services/Notification/id-constant.html deleted file mode 100644 index 972abaa34..000000000 --- a/docs/ramaz_services/Notification/id-constant.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - id constant - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        id
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        id constant - Null safety -

                        - -
                        - int - const id - - -
                        - -
                        -

                        The ID of this notification.

                        -

                        The ID is used for canceling the notifications.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const int id = 0;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification/message.html b/docs/ramaz_services/Notification/message.html deleted file mode 100644 index ee2c1f68a..000000000 --- a/docs/ramaz_services/Notification/message.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - message property - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        message
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        message property - Null safety -

                        - -
                        - String - message -
                        final
                        - -
                        - -
                        -

                        The body of this notification.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final String message;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification/noSuchMethod.html b/docs/ramaz_services/Notification/noSuchMethod.html deleted file mode 100644 index b94cd5692..000000000 --- a/docs/ramaz_services/Notification/noSuchMethod.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - noSuchMethod method - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification/operator_equals.html b/docs/ramaz_services/Notification/operator_equals.html deleted file mode 100644 index 68ffcfa3b..000000000 --- a/docs/ramaz_services/Notification/operator_equals.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - operator == method - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification/runtimeType.html b/docs/ramaz_services/Notification/runtimeType.html deleted file mode 100644 index cd92ab513..000000000 --- a/docs/ramaz_services/Notification/runtimeType.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - runtimeType property - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification/title.html b/docs/ramaz_services/Notification/title.html deleted file mode 100644 index 8c2f062e5..000000000 --- a/docs/ramaz_services/Notification/title.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - title property - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        title
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        title property - Null safety -

                        - -
                        - String - title -
                        final
                        - -
                        - -
                        -

                        The title of this notification.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final String title;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notification/toString.html b/docs/ramaz_services/Notification/toString.html deleted file mode 100644 index f5a63624f..000000000 --- a/docs/ramaz_services/Notification/toString.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - toString method - Notification class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - -
                        inherited
                        - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external String toString();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications-class.html b/docs/ramaz_services/Notifications-class.html deleted file mode 100644 index 25dd05ecd..000000000 --- a/docs/ramaz_services/Notifications-class.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - - - - - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Notifications
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Notifications class - Null safety - -

                        - - -
                        -

                        The notifications service.

                        -

                        There are two types of notifications: local notifications, and push -notifications. Local notifications are sent by the app itself, and -push notifications are sent by the server. These are local notifications.

                        -

                        Local notifications can be customized to appear differently depending on -the type of notification and platform. They can also be scheduled to appear -at certain times.

                        -

                        Currently, Web is not supported.

                        -
                        - - - -
                        -

                        Constructors

                        - -
                        -
                        - Notifications() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - pendingNotifications - → Future<List<String>> - -
                        -
                        - Notifications that are pending delivery. -
                        read-only
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - cancelAll() - → void - - - -
                        -
                        - Cancels all notifications. - - -
                        - -
                        - init() - → Future<void> - - - -
                        -
                        - Initializes the service. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - scheduleNotification({required covariant Notification notification, required DateTime date}) - → void - - - -
                        -
                        - Schedules a notification for date. [...] - - -
                        - -
                        - sendNotification(covariant Notification notification) - → void - - - -
                        -
                        - Sends a notification immediately. - - -
                        - -
                        - signIn() - → Future<void> - - - -
                        -
                        - A callback that runs when the user signs in. [...] -
                        inherited
                        - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Static Properties

                        - -
                        -
                        - instance - Notifications - -
                        -
                        - The singleton instance for this service. -
                        read / write
                        - -
                        - -
                        -
                        - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/Notifications.html b/docs/ramaz_services/Notifications/Notifications.html deleted file mode 100644 index b7b18e474..000000000 --- a/docs/ramaz_services/Notifications/Notifications.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - Notifications constructor - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Notifications
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Notifications constructor - Null safety -

                        - -
                        - Notifications() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/cancelAll.html b/docs/ramaz_services/Notifications/cancelAll.html deleted file mode 100644 index c49b853c7..000000000 --- a/docs/ramaz_services/Notifications/cancelAll.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - cancelAll method - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        cancelAll
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        cancelAll method - Null safety -

                        - -
                        - - -void -cancelAll() - - - -
                        - -
                        -

                        Cancels all notifications.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        void cancelAll();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/hashCode.html b/docs/ramaz_services/Notifications/hashCode.html deleted file mode 100644 index 553f82f13..000000000 --- a/docs/ramaz_services/Notifications/hashCode.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - hashCode property - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/init.html b/docs/ramaz_services/Notifications/init.html deleted file mode 100644 index 2e6d88bf6..000000000 --- a/docs/ramaz_services/Notifications/init.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - init method - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        init
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        init method - Null safety -

                        - -
                        - - -Future<void> -init() - -
                        inherited
                        - -
                        - -
                        -

                        Initializes the service.

                        -

                        Override this function with code that needs to be run when the app starts. -A good use for this is registering with plugins that return a Future.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Future<void> init();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/instance.html b/docs/ramaz_services/Notifications/instance.html deleted file mode 100644 index 85c9dc07d..000000000 --- a/docs/ramaz_services/Notifications/instance.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - instance property - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        instance
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        instance property - Null safety -

                        - -
                        - Notifications - instance -
                        read / write
                        - -
                        - -
                        -

                        The singleton instance for this service.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static Notifications instance = notifications;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/noSuchMethod.html b/docs/ramaz_services/Notifications/noSuchMethod.html deleted file mode 100644 index f9a09e35e..000000000 --- a/docs/ramaz_services/Notifications/noSuchMethod.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - noSuchMethod method - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/operator_equals.html b/docs/ramaz_services/Notifications/operator_equals.html deleted file mode 100644 index 4e66671cb..000000000 --- a/docs/ramaz_services/Notifications/operator_equals.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - operator == method - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/pendingNotifications.html b/docs/ramaz_services/Notifications/pendingNotifications.html deleted file mode 100644 index a20e27a1b..000000000 --- a/docs/ramaz_services/Notifications/pendingNotifications.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - pendingNotifications property - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        pendingNotifications
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        pendingNotifications property - Null safety -

                        - - - -
                        - -
                        - Future<List<String>> - pendingNotifications - - -
                        - - -
                        -

                        Notifications that are pending delivery.

                        -
                        - - -
                        -

                        Implementation

                        -
                        Future<List<String>> get pendingNotifications;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/runtimeType.html b/docs/ramaz_services/Notifications/runtimeType.html deleted file mode 100644 index 27de6e6e3..000000000 --- a/docs/ramaz_services/Notifications/runtimeType.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - runtimeType property - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/scheduleNotification.html b/docs/ramaz_services/Notifications/scheduleNotification.html deleted file mode 100644 index 07225ad6e..000000000 --- a/docs/ramaz_services/Notifications/scheduleNotification.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - scheduleNotification method - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        scheduleNotification
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        scheduleNotification method - Null safety -

                        - -
                        - - -void -scheduleNotification(
                        1. {required covariant Notification notification,
                        2. -
                        3. required DateTime date}
                        4. -
                        ) - - - -
                        - -
                        -

                        Schedules a notification for date.

                        -

                        date must not be in the past.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        void scheduleNotification({
                        -	required covariant Notification notification,
                        -	required DateTime date
                        -});
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/sendNotification.html b/docs/ramaz_services/Notifications/sendNotification.html deleted file mode 100644 index 33745e7da..000000000 --- a/docs/ramaz_services/Notifications/sendNotification.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - sendNotification method - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        sendNotification
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        sendNotification method - Null safety -

                        - -
                        - - -void -sendNotification(
                        1. covariant Notification notification
                        2. -
                        ) - - - -
                        - -
                        -

                        Sends a notification immediately.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        void sendNotification(covariant Notification notification);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/signIn.html b/docs/ramaz_services/Notifications/signIn.html deleted file mode 100644 index d0b9028f1..000000000 --- a/docs/ramaz_services/Notifications/signIn.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - signIn method - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        signIn
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        signIn method - Null safety -

                        - -
                        - - -Future<void> -signIn() - -
                        inherited
                        - -
                        - -
                        -

                        A callback that runs when the user signs in.

                        -

                        Override this function with code that facilitates the sign-in process.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Future<void> signIn();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Notifications/toString.html b/docs/ramaz_services/Notifications/toString.html deleted file mode 100644 index 6f636b166..000000000 --- a/docs/ramaz_services/Notifications/toString.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - toString method - Notifications class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - -
                        inherited
                        - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external String toString();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences-class.html b/docs/ramaz_services/Preferences-class.html deleted file mode 100644 index 1c1b09b00..000000000 --- a/docs/ramaz_services/Preferences-class.html +++ /dev/null @@ -1,334 +0,0 @@ - - - - - - - - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Preferences
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Preferences class - Null safety - -

                        - - -
                        -

                        An abstraction wrapper around the SharedPreferences plugin.

                        -

                        The SharedPreferences plugin allows for quick and small key-value based -storage, which can be very useful.

                        -
                        - - - -
                        -

                        Constructors

                        - -
                        -
                        - Preferences() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - brightness - ↔ bool? - -
                        -
                        - The user's brightness preference. [...] -
                        read / write
                        - -
                        - -
                        - firstTime - → bool - -
                        -
                        - Determines whether this is the first time opening the app. -
                        read-only
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - init() - → Future<void> - - - -
                        -
                        - Initializes the service. [...] - - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - signIn() - → Future<void> - - - -
                        -
                        - A callback that runs when the user signs in. [...] - - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - -
                        -

                        Constants

                        - -
                        -
                        - firstTimeKey - → const String - - -
                        -
                        - The key for if this is the first time or not. - - -
                        - "firstTime" -
                        -
                        - -
                        - lightMode - → const String - - -
                        -
                        - The key for the user brightness preference. - - -
                        - "lightMode" -
                        -
                        - -
                        -
                        - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/Preferences.html b/docs/ramaz_services/Preferences/Preferences.html deleted file mode 100644 index 8ee48233d..000000000 --- a/docs/ramaz_services/Preferences/Preferences.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - Preferences constructor - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Preferences
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Preferences constructor - Null safety -

                        - -
                        - Preferences() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/brightness.html b/docs/ramaz_services/Preferences/brightness.html deleted file mode 100644 index be138c209..000000000 --- a/docs/ramaz_services/Preferences/brightness.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - brightness property - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        brightness
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        brightness property - Null safety -

                        - - - -
                        - -
                        - bool? - brightness - - -
                        - - -
                        -

                        The user's brightness preference.

                        -

                        true means light mode, false means dark mode, and null gets the -system preferences (if not supported -- light mode).

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool? get brightness => _prefs.getBool(lightMode);
                        -
                        - -
                        - - - -
                        - -
                        - void - brightness=(bool? value) - - -
                        - - - - -
                        -

                        Implementation

                        -
                        set brightness (bool? value) => value == null
                        -	? _prefs.remove(lightMode)
                        -	: _prefs.setBool(lightMode, value);
                        -
                        - -
                        - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/firstTime.html b/docs/ramaz_services/Preferences/firstTime.html deleted file mode 100644 index 437b09edd..000000000 --- a/docs/ramaz_services/Preferences/firstTime.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - firstTime property - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        firstTime
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        firstTime property - Null safety -

                        - - - -
                        - -
                        - bool - firstTime - - -
                        - - -
                        -

                        Determines whether this is the first time opening the app.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool get firstTime {
                        -	final bool result = _prefs.getBool(firstTimeKey) ?? true;
                        -	_prefs.setBool(firstTimeKey, false);
                        -	return result;
                        -}
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/firstTimeKey-constant.html b/docs/ramaz_services/Preferences/firstTimeKey-constant.html deleted file mode 100644 index 1f7658340..000000000 --- a/docs/ramaz_services/Preferences/firstTimeKey-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - firstTimeKey constant - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        firstTimeKey
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        firstTimeKey constant - Null safety -

                        - -
                        - String - const firstTimeKey - - -
                        - -
                        -

                        The key for if this is the first time or not.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String firstTimeKey = "firstTime";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/hashCode.html b/docs/ramaz_services/Preferences/hashCode.html deleted file mode 100644 index 2ee642088..000000000 --- a/docs/ramaz_services/Preferences/hashCode.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - hashCode property - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/init.html b/docs/ramaz_services/Preferences/init.html deleted file mode 100644 index 46c29daa4..000000000 --- a/docs/ramaz_services/Preferences/init.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - init method - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        init
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        init method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Future<void> -init() - - - -
                        - -
                        -

                        Initializes the service.

                        -

                        Override this function with code that needs to be run when the app starts. -A good use for this is registering with plugins that return a Future.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Future<void> init() async {
                        -	_prefs = await SharedPreferences.getInstance();
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/lightMode-constant.html b/docs/ramaz_services/Preferences/lightMode-constant.html deleted file mode 100644 index 8b289dad7..000000000 --- a/docs/ramaz_services/Preferences/lightMode-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - lightMode constant - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        lightMode
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        lightMode constant - Null safety -

                        - -
                        - String - const lightMode - - -
                        - -
                        -

                        The key for the user brightness preference.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const String lightMode = "lightMode";
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/noSuchMethod.html b/docs/ramaz_services/Preferences/noSuchMethod.html deleted file mode 100644 index dd25486d5..000000000 --- a/docs/ramaz_services/Preferences/noSuchMethod.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - noSuchMethod method - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/operator_equals.html b/docs/ramaz_services/Preferences/operator_equals.html deleted file mode 100644 index 5835f4360..000000000 --- a/docs/ramaz_services/Preferences/operator_equals.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - operator == method - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/runtimeType.html b/docs/ramaz_services/Preferences/runtimeType.html deleted file mode 100644 index 236cb27f1..000000000 --- a/docs/ramaz_services/Preferences/runtimeType.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - runtimeType property - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/signIn.html b/docs/ramaz_services/Preferences/signIn.html deleted file mode 100644 index 3b0d5a30c..000000000 --- a/docs/ramaz_services/Preferences/signIn.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - signIn method - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        signIn
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        signIn method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Future<void> -signIn() - - - -
                        - -
                        -

                        A callback that runs when the user signs in.

                        -

                        Override this function with code that facilitates the sign-in process.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Future<void> signIn() async {}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Preferences/toString.html b/docs/ramaz_services/Preferences/toString.html deleted file mode 100644 index 1d9eeab85..000000000 --- a/docs/ramaz_services/Preferences/toString.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - toString method - Preferences class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - -
                        inherited
                        - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external String toString();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services-class.html b/docs/ramaz_services/Services-class.html deleted file mode 100644 index 714d7d428..000000000 --- a/docs/ramaz_services/Services-class.html +++ /dev/null @@ -1,375 +0,0 @@ - - - - - - - - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Services
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Services class - Null safety - -

                        - - -
                        -

                        Bundles all the services.

                        -

                        A Service has an init and a signIn function. This service serves -to bundle them all, so that you only need to call the functions of this -service, and they will call all the other services' functions.

                        -
                        - - - -
                        -

                        Constructors

                        - -
                        -
                        - Services() -
                        -
                        - Bundles services together. [...] -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - crashlytics - Crashlytics - -
                        -
                        - The Crashlytics interface. -
                        final
                        - -
                        - -
                        - database - → Databases - -
                        -
                        - The database bundle. -
                        final
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - isReady - ↔ bool - -
                        -
                        - Whether the services are ready to use. -
                        read / write
                        - -
                        - -
                        - notifications - Notifications - -
                        -
                        - The local notifications interface. [...] -
                        final
                        - -
                        - -
                        - prefs - Preferences - -
                        -
                        - The shared preferences interface. [...] -
                        final
                        - -
                        - -
                        - pushNotifications - → PushNotifications - -
                        -
                        - The push notifications interface. [...] -
                        final
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        - services - ↔ List<Service> - -
                        -
                        - All the services in a list. [...] -
                        final, read / write, late
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - init() - → Future<void> - - - -
                        -
                        - Initializes the service. [...] - - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - signIn() - → Future<void> - - - -
                        -
                        - A callback that runs when the user signs in. [...] - - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Static Properties

                        - -
                        -
                        - instance - Services - -
                        -
                        - The singleton instance of this class. -
                        read / write
                        - -
                        - -
                        -
                        - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/Services.html b/docs/ramaz_services/Services/Services.html deleted file mode 100644 index aa4caa1a2..000000000 --- a/docs/ramaz_services/Services/Services.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - Services constructor - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Services
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Services constructor - Null safety -

                        - -
                        - Services() -
                        - - -
                        -

                        Bundles services together.

                        -

                        Also initializes services.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Services() {
                        -	services = [prefs, database, crashlytics, notifications];
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/crashlytics.html b/docs/ramaz_services/Services/crashlytics.html deleted file mode 100644 index 8f5fad340..000000000 --- a/docs/ramaz_services/Services/crashlytics.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - crashlytics property - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        crashlytics
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        crashlytics property - Null safety -

                        - -
                        - Crashlytics - crashlytics -
                        final
                        - -
                        - -
                        -

                        The Crashlytics interface.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Crashlytics crashlytics = Crashlytics.instance;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/database.html b/docs/ramaz_services/Services/database.html deleted file mode 100644 index cb7d80f90..000000000 --- a/docs/ramaz_services/Services/database.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - database property - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        database
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        database property - Null safety -

                        - -
                        - Databases - database -
                        final
                        - -
                        - -
                        -

                        The database bundle.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Databases database = Databases();
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/hashCode.html b/docs/ramaz_services/Services/hashCode.html deleted file mode 100644 index 410235b6d..000000000 --- a/docs/ramaz_services/Services/hashCode.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - hashCode property - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/init.html b/docs/ramaz_services/Services/init.html deleted file mode 100644 index 514eac3eb..000000000 --- a/docs/ramaz_services/Services/init.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - init method - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        init
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        init method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Future<void> -init() - - - -
                        - -
                        -

                        Initializes the service.

                        -

                        Override this function with code that needs to be run when the app starts. -A good use for this is registering with plugins that return a Future.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Future<void> init() async {
                        -	for (final Service service in services) {
                        -		await service.init();
                        -	}
                        -	isReady = true;
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/instance.html b/docs/ramaz_services/Services/instance.html deleted file mode 100644 index dfe9a0c53..000000000 --- a/docs/ramaz_services/Services/instance.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - instance property - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        instance
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        instance property - Null safety -

                        - -
                        - Services - instance -
                        read / write
                        - -
                        - -
                        -

                        The singleton instance of this class.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static Services instance = Services();
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/isReady.html b/docs/ramaz_services/Services/isReady.html deleted file mode 100644 index 1cccfa97e..000000000 --- a/docs/ramaz_services/Services/isReady.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - isReady property - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isReady
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isReady property - Null safety -

                        - -
                        - bool - isReady -
                        read / write
                        - -
                        - -
                        -

                        Whether the services are ready to use.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool isReady = false;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/noSuchMethod.html b/docs/ramaz_services/Services/noSuchMethod.html deleted file mode 100644 index 653316bbd..000000000 --- a/docs/ramaz_services/Services/noSuchMethod.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - noSuchMethod method - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/notifications.html b/docs/ramaz_services/Services/notifications.html deleted file mode 100644 index 3b4c56e61..000000000 --- a/docs/ramaz_services/Services/notifications.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - notifications property - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        notifications
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        notifications property - Null safety -

                        - -
                        - Notifications - notifications -
                        final
                        - -
                        - -
                        -

                        The local notifications interface.

                        -

                        Local notifications come from the app and not a server.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Notifications notifications = Notifications.instance;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/operator_equals.html b/docs/ramaz_services/Services/operator_equals.html deleted file mode 100644 index 9c8a1dcad..000000000 --- a/docs/ramaz_services/Services/operator_equals.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - operator == method - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/prefs.html b/docs/ramaz_services/Services/prefs.html deleted file mode 100644 index 39ab829b7..000000000 --- a/docs/ramaz_services/Services/prefs.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - prefs property - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        prefs
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        prefs property - Null safety -

                        - -
                        - Preferences - prefs -
                        final
                        - -
                        - -
                        -

                        The shared preferences interface.

                        -

                        Useful for storing small key-value pairs.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Preferences prefs = Preferences();
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/pushNotifications.html b/docs/ramaz_services/Services/pushNotifications.html deleted file mode 100644 index d80d5dc15..000000000 --- a/docs/ramaz_services/Services/pushNotifications.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - pushNotifications property - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        pushNotifications
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        pushNotifications property - Null safety -

                        - -
                        - PushNotifications - pushNotifications -
                        final
                        - -
                        - -
                        -

                        The push notifications interface.

                        -

                        Push notifications come from the server.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final PushNotifications pushNotifications = PushNotifications.instance;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/runtimeType.html b/docs/ramaz_services/Services/runtimeType.html deleted file mode 100644 index 3bb8343b5..000000000 --- a/docs/ramaz_services/Services/runtimeType.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - runtimeType property - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/services.html b/docs/ramaz_services/Services/services.html deleted file mode 100644 index 65b03820c..000000000 --- a/docs/ramaz_services/Services/services.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - services property - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        services
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        services property - Null safety -

                        - -
                        - List<Service> - services -
                        final, read / write, late
                        - -
                        - -
                        -

                        All the services in a list.

                        -

                        The functions of this service operate on these services.

                        -
                        - - -
                        -

                        Implementation

                        -
                        late final List<Service> services;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/signIn.html b/docs/ramaz_services/Services/signIn.html deleted file mode 100644 index 97117d5d9..000000000 --- a/docs/ramaz_services/Services/signIn.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - signIn method - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        signIn
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        signIn method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Future<void> -signIn() - - - -
                        - -
                        -

                        A callback that runs when the user signs in.

                        -

                        Override this function with code that facilitates the sign-in process.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Future<void> signIn() async {
                        -	for (final Service service in services) {
                        -		await service.signIn();
                        -	}
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/Services/toString.html b/docs/ramaz_services/Services/toString.html deleted file mode 100644 index 6ed057527..000000000 --- a/docs/ramaz_services/Services/toString.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - toString method - Services class - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - -
                        inherited
                        - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external String toString();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/ramaz_services/ramaz_services-library.html b/docs/ramaz_services/ramaz_services-library.html deleted file mode 100644 index 320f98592..000000000 --- a/docs/ramaz_services/ramaz_services-library.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - ramaz_services library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ramaz_services
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ramaz_services library - Null safety - -

                        - - -
                        -

                        An abstraction over device services and data sources.

                        -

                        The services library serves two purposes:

                        -
                          -
                        1. -

                          To abstract device functions.

                          -

                          For example, device notifications can be abstracted away from the -business logic to provide for a platform-agnostic implementation.

                          -
                        2. -
                        3. -

                          To abstract data sources:

                          -

                          For example, retrieving data from a database or file can be abstracted -to keep the app focused on the content of the data rather than how to -properly access it.

                          -
                        4. -
                        -
                        - - -
                        -

                        Classes

                        - -
                        -
                        - Auth - -
                        -
                        - An abstraction around FirebaseAuth. [...] -
                        - -
                        - Crashlytics - -
                        -
                        - A wrapper around the Crashlytics SDK. [...] -
                        - -
                        - Notification - -
                        -
                        - A notification. [...] -
                        - -
                        - Notifications - -
                        -
                        - The notifications service. [...] -
                        - -
                        - Preferences - -
                        -
                        - An abstraction wrapper around the SharedPreferences plugin. [...] -
                        - -
                        - Services - -
                        -
                        - Bundles all the services. [...] -
                        - -
                        -
                        - - - - - - - - -
                        -

                        Exceptions / Errors

                        - -
                        -
                        - NoAccountException - -
                        -
                        - An exception thrown when no account has been selected. -
                        - -
                        -
                        - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/static-assets/favicon.png b/docs/static-assets/favicon.png deleted file mode 100644 index 6501c9d05c03d8c55d0e2155bdb29c56e72a9abe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5037 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 - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #333; - background: #f8f8f8; -} - -.hljs-comment, -.hljs-quote { - color: #998; - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-subst { - color: #333; - font-weight: bold; -} - -.hljs-number, -.hljs-literal, -.hljs-variable, -.hljs-template-variable, -.hljs-tag .hljs-attr { - color: #008080; -} - -.hljs-string, -.hljs-doctag { - color: #d14; -} - -.hljs-title, -.hljs-section, -.hljs-selector-id { - color: #900; - font-weight: bold; -} - -.hljs-subst { - font-weight: normal; -} - -.hljs-type, -.hljs-class .hljs-title { - color: #458; - font-weight: bold; -} - -.hljs-tag, -.hljs-name, -.hljs-attribute { - color: #000080; - font-weight: normal; -} - -.hljs-regexp, -.hljs-link { - color: #009926; -} - -.hljs-symbol, -.hljs-bullet { - color: #990073; -} - -.hljs-built_in, -.hljs-builtin-name { - color: #0086b3; -} - -.hljs-meta { - color: #999; - font-weight: bold; -} - -.hljs-deletion { - background: #fdd; -} - -.hljs-addition { - background: #dfd; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/docs/static-assets/highlight.pack.js b/docs/static-assets/highlight.pack.js deleted file mode 100644 index de37d4ce5..000000000 --- a/docs/static-assets/highlight.pack.js +++ /dev/null @@ -1,752 +0,0 @@ -/* - Highlight.js 10.6.0 (eb122d3b) - License: BSD-3-Clause - Copyright (c) 2006-2020, Ivan Sagalaev -*/ -var hljs=function(){"use strict";function e(t){ -return t instanceof Map?t.clear=t.delete=t.set=()=>{ -throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ -throw Error("set is read-only") -}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{var s=t[n] -;"object"!=typeof s||Object.isFrozen(s)||e(s)})),t}var t=e,n=e;t.default=n -;class s{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data} -ignoreMatch(){this.ignore=!0}}function r(e){ -return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") -}function a(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] -;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const i=e=>!!e.kind -;class o{constructor(e,t){ -this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ -this.buffer+=r(e)}openNode(e){if(!i(e))return;let t=e.kind -;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){ -i(e)&&(this.buffer+="
                        ")}value(){return this.buffer}span(e){ -this.buffer+=``}}class l{constructor(){this.rootNode={ -children:[]},this.stack=[this.rootNode]}get top(){ -return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ -this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} -;this.add(t),this.stack.push(t)}closeNode(){ -if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ -for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} -walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ -return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), -t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ -"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ -l._collapse(e)})))}}class c extends l{constructor(e){super(),this.options=e} -addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} -addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root -;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ -return new o(this,this.options).value()}finalize(){return!0}}function u(e){ -return e?"string"==typeof e?e:e.source:null} -const g="[a-zA-Z]\\w*",d="[a-zA-Z_]\\w*",h="\\b\\d+(\\.\\d+)?",f="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",p="\\b(0b[01]+)",m={ -begin:"\\\\[\\s\\S]",relevance:0},b={className:"string",begin:"'",end:"'", -illegal:"\\n",contains:[m]},x={className:"string",begin:'"',end:'"', -illegal:"\\n",contains:[m]},E={ -begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ -},v=(e,t,n={})=>{const s=a({className:"comment",begin:e,end:t,contains:[]},n) -;return s.contains.push(E),s.contains.push({className:"doctag", -begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),s -},w=v("//","$"),N=v("/\\*","\\*/"),y=v("#","$");var R=Object.freeze({ -__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:g,UNDERSCORE_IDENT_RE:d, -NUMBER_RE:h,C_NUMBER_RE:f,BINARY_NUMBER_RE:p, -RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", -SHEBANG:(e={})=>{const t=/^#![ ]*\// -;return e.binary&&(e.begin=((...e)=>e.map((e=>u(e))).join(""))(t,/.*\b/,e.binary,/\b.*/)), -a({className:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{ -0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:m,APOS_STRING_MODE:b, -QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:E,COMMENT:v,C_LINE_COMMENT_MODE:w, -C_BLOCK_COMMENT_MODE:N,HASH_COMMENT_MODE:y,NUMBER_MODE:{className:"number", -begin:h,relevance:0},C_NUMBER_MODE:{className:"number",begin:f,relevance:0}, -BINARY_NUMBER_MODE:{className:"number",begin:p,relevance:0},CSS_NUMBER_MODE:{ -className:"number", -begin:h+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", -relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp", -begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[m,{begin:/\[/,end:/\]/, -relevance:0,contains:[m]}]}]},TITLE_MODE:{className:"title",begin:g,relevance:0 -},UNDERSCORE_TITLE_MODE:{className:"title",begin:d,relevance:0},METHOD_GUARD:{ -begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ -"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ -t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function _(e,t){ -"."===e.input[e.index-1]&&t.ignoreMatch()}function k(e,t){ -t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", -e.__beforeBegin=_,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, -void 0===e.relevance&&(e.relevance=0))}function O(e,t){ -Array.isArray(e.illegal)&&(e.illegal=((...e)=>"("+e.map((e=>u(e))).join("|")+")")(...e.illegal)) -}function M(e,t){if(e.match){ -if(e.begin||e.end)throw Error("begin & end are not supported with match") -;e.begin=e.match,delete e.match}}function A(e,t){ -void 0===e.relevance&&(e.relevance=1)} -const L=["of","and","for","in","not","or","if","then","parent","list","value"] -;function B(e,t,n="keyword"){const s={} -;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ -Object.assign(s,B(e[n],t,n))})),s;function r(e,n){ -t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") -;s[n[0]]=[e,I(n[0],n[1])]}))}}function I(e,t){ -return t?Number(t):(e=>L.includes(e.toLowerCase()))(e)?0:1} -function T(e,{plugins:t}){function n(t,n){ -return RegExp(u(t),"m"+(e.case_insensitive?"i":"")+(n?"g":""))}class s{ -constructor(){ -this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} -addRule(e,t){ -t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), -this.matchAt+=(e=>RegExp(e.toString()+"|").exec("").length-1)(e)+1}compile(){ -0===this.regexes.length&&(this.exec=()=>null) -;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(((e,t="|")=>{ -const n=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;let s=0,r="" -;for(let a=0;a0&&(r+=t),r+="(";o.length>0;){const e=n.exec(o);if(null==e){r+=o;break} -r+=o.substring(0,e.index), -o=o.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+i):(r+=e[0], -"("===e[0]&&s++)}r+=")"}return r})(e),!0),this.lastIndex=0}exec(e){ -this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e) -;if(!t)return null -;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),s=this.matchIndexes[n] -;return t.splice(0,n),Object.assign(t,s)}}class r{constructor(){ -this.rules=[],this.multiRegexes=[], -this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ -if(this.multiRegexes[e])return this.multiRegexes[e];const t=new s -;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), -t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ -return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ -this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ -const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex -;let n=t.exec(e) -;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ -const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} -return n&&(this.regexIndex+=n.position+1, -this.regexIndex===this.count&&this.considerAll()),n}} -if(e.compilerExtensions||(e.compilerExtensions=[]), -e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") -;return e.classNameAliases=a(e.classNameAliases||{}),function t(s,i){const o=s -;if(s.compiled)return o -;[M].forEach((e=>e(s,i))),e.compilerExtensions.forEach((e=>e(s,i))), -s.__beforeBegin=null,[k,O,A].forEach((e=>e(s,i))),s.compiled=!0;let l=null -;if("object"==typeof s.keywords&&(l=s.keywords.$pattern, -delete s.keywords.$pattern), -s.keywords&&(s.keywords=B(s.keywords,e.case_insensitive)), -s.lexemes&&l)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ") -;return l=l||s.lexemes||/\w+/, -o.keywordPatternRe=n(l,!0),i&&(s.begin||(s.begin=/\B|\b/), -o.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin), -s.end||s.endsWithParent||(s.end=/\B|\b/), -s.end&&(o.endRe=n(s.end)),o.terminatorEnd=u(s.end)||"", -s.endsWithParent&&i.terminatorEnd&&(o.terminatorEnd+=(s.end?"|":"")+i.terminatorEnd)), -s.illegal&&(o.illegalRe=n(s.illegal)), -s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>a(e,{ -variants:null},t)))),e.cachedVariants?e.cachedVariants:j(e)?a(e,{ -starts:e.starts?a(e.starts):null -}):Object.isFrozen(e)?a(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{t(e,o) -})),s.starts&&t(s.starts,i),o.matcher=(e=>{const t=new r -;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" -}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" -}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(o),o}(e)}function j(e){ -return!!e&&(e.endsWithParent||j(e.starts))}function S(e){const t={ -props:["language","code","autodetect"],data:()=>({detectedLanguage:"", -unknownLanguage:!1}),computed:{className(){ -return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){ -if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`), -this.unknownLanguage=!0,r(this.code);let t={} -;return this.autoDetect?(t=e.highlightAuto(this.code), -this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals), -this.detectedLanguage=this.language),t.value},autoDetect(){ -return!(this.language&&(e=this.autodetect,!e&&""!==e));var e}, -ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{ -class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{ -Component:t,VuePlugin:{install(e){e.component("highlightjs",t)}}}}const P={ -"after:highlightBlock":({block:e,result:t,text:n})=>{const s=C(e) -;if(!s.length)return;const a=document.createElement("div") -;a.innerHTML=t.value,t.value=((e,t,n)=>{let s=0,a="";const i=[];function o(){ -return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset"}function c(e){ -a+=""}function u(e){("start"===e.event?l:c)(e.node)} -for(;e.length||t.length;){let t=o() -;if(a+=r(n.substring(s,t[0].offset)),s=t[0].offset,t===e){i.reverse().forEach(c) -;do{u(t.splice(0,1)[0]),t=o()}while(t===e&&t.length&&t[0].offset===s) -;i.reverse().forEach(l) -}else"start"===t[0].event?i.push(t[0].node):i.pop(),u(t.splice(0,1)[0])} -return a+r(n.substr(s))})(s,C(a),n)}};function D(e){ -return e.nodeName.toLowerCase()}function C(e){const t=[];return function e(n,s){ -for(let r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?s+=r.nodeValue.length:1===r.nodeType&&(t.push({ -event:"start",offset:s,node:r}),s=e(r,s),D(r).match(/br|hr|img|input/)||t.push({ -event:"stop",offset:s,node:r}));return s}(e,0),t}const H=e=>{console.error(e) -},U=(e,...t)=>{console.log("WARN: "+e,...t)},$=(e,t)=>{ -console.log(`Deprecated as of ${e}. ${t}`)},z=r,K=a,G=Symbol("nomatch") -;return(e=>{const n=Object.create(null),r=Object.create(null),a=[];let i=!0 -;const o=/(^(<[^>]+>|\t|)+|\n)/gm,l="Could not find the language '{}', did you forget to load/include a language module?",u={ -disableAutodetect:!0,name:"Plain text",contains:[]};let g={ -noHighlightRe:/^(no-?highlight)$/i, -languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", -tabReplace:null,useBR:!1,languages:null,__emitter:c};function d(e){ -return g.noHighlightRe.test(e)}function h(e,t,n,s){const r={code:t,language:e} -;M("before:highlight",r);const a=r.result?r.result:f(r.language,r.code,n,s) -;return a.code=r.code,M("after:highlight",a),a}function f(e,t,r,o){const c=t -;function u(e,t){const n=w.case_insensitive?t[0].toLowerCase():t[0] -;return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]} -function d(){null!=R.subLanguage?(()=>{if(""===M)return;let e=null -;if("string"==typeof R.subLanguage){ -if(!n[R.subLanguage])return void O.addText(M) -;e=f(R.subLanguage,M,!0,k[R.subLanguage]),k[R.subLanguage]=e.top -}else e=p(M,R.subLanguage.length?R.subLanguage:null) -;R.relevance>0&&(A+=e.relevance),O.addSublanguage(e.emitter,e.language) -})():(()=>{if(!R.keywords)return void O.addText(M);let e=0 -;R.keywordPatternRe.lastIndex=0;let t=R.keywordPatternRe.exec(M),n="";for(;t;){ -n+=M.substring(e,t.index);const s=u(R,t);if(s){const[e,r]=s -;O.addText(n),n="",A+=r;const a=w.classNameAliases[e]||e;O.addKeyword(t[0],a) -}else n+=t[0];e=R.keywordPatternRe.lastIndex,t=R.keywordPatternRe.exec(M)} -n+=M.substr(e),O.addText(n)})(),M=""}function h(e){ -return e.className&&O.openNode(w.classNameAliases[e.className]||e.className), -R=Object.create(e,{parent:{value:R}}),R}function m(e,t,n){let r=((e,t)=>{ -const n=e&&e.exec(t);return n&&0===n.index})(e.endRe,n);if(r){if(e["on:end"]){ -const n=new s(e);e["on:end"](t,n),n.ignore&&(r=!1)}if(r){ -for(;e.endsParent&&e.parent;)e=e.parent;return e}} -if(e.endsWithParent)return m(e.parent,t,n)}function b(e){ -return 0===R.matcher.regexIndex?(M+=e[0],1):(I=!0,0)}function x(e){ -const t=e[0],n=c.substr(e.index),s=m(R,e,n);if(!s)return G;const r=R -;r.skip?M+=t:(r.returnEnd||r.excludeEnd||(M+=t),d(),r.excludeEnd&&(M=t));do{ -R.className&&O.closeNode(),R.skip||R.subLanguage||(A+=R.relevance),R=R.parent -}while(R!==s.parent) -;return s.starts&&(s.endSameAsBegin&&(s.starts.endRe=s.endRe), -h(s.starts)),r.returnEnd?0:t.length}let E={};function v(t,n){const a=n&&n[0] -;if(M+=t,null==a)return d(),0 -;if("begin"===E.type&&"end"===n.type&&E.index===n.index&&""===a){ -if(M+=c.slice(n.index,n.index+1),!i){const t=Error("0 width match regex") -;throw t.languageName=e,t.badRule=E.rule,t}return 1} -if(E=n,"begin"===n.type)return function(e){ -const t=e[0],n=e.rule,r=new s(n),a=[n.__beforeBegin,n["on:begin"]] -;for(const n of a)if(n&&(n(e,r),r.ignore))return b(t) -;return n&&n.endSameAsBegin&&(n.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")), -n.skip?M+=t:(n.excludeBegin&&(M+=t), -d(),n.returnBegin||n.excludeBegin||(M=t)),h(n),n.returnBegin?0:t.length}(n) -;if("illegal"===n.type&&!r){ -const e=Error('Illegal lexeme "'+a+'" for mode "'+(R.className||"")+'"') -;throw e.mode=R,e}if("end"===n.type){const e=x(n);if(e!==G)return e} -if("illegal"===n.type&&""===a)return 1 -;if(B>1e5&&B>3*n.index)throw Error("potential infinite loop, way more iterations than matches") -;return M+=a,a.length}const w=_(e) -;if(!w)throw H(l.replace("{}",e)),Error('Unknown language: "'+e+'"') -;const N=T(w,{plugins:a});let y="",R=o||N;const k={},O=new g.__emitter(g);(()=>{ -const e=[];for(let t=R;t!==w;t=t.parent)t.className&&e.unshift(t.className) -;e.forEach((e=>O.openNode(e)))})();let M="",A=0,L=0,B=0,I=!1;try{ -for(R.matcher.considerAll();;){ -B++,I?I=!1:R.matcher.considerAll(),R.matcher.lastIndex=L -;const e=R.matcher.exec(c);if(!e)break;const t=v(c.substring(L,e.index),e) -;L=e.index+t}return v(c.substr(L)),O.closeAllNodes(),O.finalize(),y=O.toHTML(),{ -relevance:Math.floor(A),value:y,language:e,illegal:!1,emitter:O,top:R}}catch(t){ -if(t.message&&t.message.includes("Illegal"))return{illegal:!0,illegalBy:{ -msg:t.message,context:c.slice(L-100,L+100),mode:t.mode},sofar:y,relevance:0, -value:z(c),emitter:O};if(i)return{illegal:!1,relevance:0,value:z(c),emitter:O, -language:e,top:R,errorRaised:t};throw t}}function p(e,t){ -t=t||g.languages||Object.keys(n);const s=(e=>{const t={relevance:0, -emitter:new g.__emitter(g),value:z(e),illegal:!1,top:u} -;return t.emitter.addText(e),t})(e),r=t.filter(_).filter(O).map((t=>f(t,e,!1))) -;r.unshift(s);const a=r.sort(((e,t)=>{ -if(e.relevance!==t.relevance)return t.relevance-e.relevance -;if(e.language&&t.language){if(_(e.language).supersetOf===t.language)return 1 -;if(_(t.language).supersetOf===e.language)return-1}return 0})),[i,o]=a,l=i -;return l.second_best=o,l}const m={"before:highlightBlock":({block:e})=>{ -g.useBR&&(e.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")) -},"after:highlightBlock":({result:e})=>{ -g.useBR&&(e.value=e.value.replace(/\n/g,"
                        "))}},b=/^(<[^>]+>|\t)+/gm,x={ -"after:highlightBlock":({result:e})=>{ -g.tabReplace&&(e.value=e.value.replace(b,(e=>e.replace(/\t/g,g.tabReplace))))}} -;function E(e){let t=null;const n=(e=>{let t=e.className+" " -;t+=e.parentNode?e.parentNode.className:"";const n=g.languageDetectRe.exec(t) -;if(n){const t=_(n[1]) -;return t||(U(l.replace("{}",n[1])),U("Falling back to no-highlight mode for this block.",e)), -t?n[1]:"no-highlight"}return t.split(/\s+/).find((e=>d(e)||_(e)))})(e) -;if(d(n))return;M("before:highlightBlock",{block:e,language:n}),t=e -;const s=t.textContent,a=n?h(n,s,!0):p(s);M("after:highlightBlock",{block:e, -result:a,text:s}),e.innerHTML=a.value,((e,t,n)=>{const s=t?r[t]:n -;e.classList.add("hljs"),s&&e.classList.add(s)})(e,n,a.language),e.result={ -language:a.language,re:a.relevance,relavance:a.relevance -},a.second_best&&(e.second_best={language:a.second_best.language, -re:a.second_best.relevance,relavance:a.second_best.relevance})}const v=()=>{ -v.called||(v.called=!0, -$("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead."), -document.querySelectorAll("pre code").forEach(E))};let w=!1,N=!1;function y(){ -N?document.querySelectorAll("pre code").forEach(E):w=!0}function _(e){ -return e=(e||"").toLowerCase(),n[e]||n[r[e]]}function k(e,{languageName:t}){ -"string"==typeof e&&(e=[e]),e.forEach((e=>{r[e]=t}))}function O(e){const t=_(e) -;return t&&!t.disableAutodetect}function M(e,t){const n=e;a.forEach((e=>{ -e[n]&&e[n](t)}))} -"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ -N=!0,w&&y()}),!1),Object.assign(e,{highlight:h,highlightAuto:p,highlightAll:y, -fixMarkup:e=>{ -return $("10.2.0","fixMarkup will be removed entirely in v11.0"),$("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"), -t=e, -g.tabReplace||g.useBR?t.replace(o,(e=>"\n"===e?g.useBR?"
                        ":e:g.tabReplace?e.replace(/\t/g,g.tabReplace):e)):t -;var t},highlightBlock:E,configure:e=>{ -e.useBR&&($("10.3.0","'useBR' will be removed entirely in v11.0"), -$("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")), -g=K(g,e)},initHighlighting:v,initHighlightingOnLoad:()=>{ -$("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."), -w=!0},registerLanguage:(t,s)=>{let r=null;try{r=s(e)}catch(e){ -if(H("Language definition for '{}' could not be registered.".replace("{}",t)), -!i)throw e;H(e),r=u} -r.name||(r.name=t),n[t]=r,r.rawDefinition=s.bind(null,e),r.aliases&&k(r.aliases,{ -languageName:t})},listLanguages:()=>Object.keys(n),getLanguage:_, -registerAliases:k,requireLanguage:e=>{ -$("10.4.0","requireLanguage will be removed entirely in v11."), -$("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844") -;const t=_(e);if(t)return t -;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))}, -autoDetection:O,inherit:K,addPlugin:e=>{a.push(e)},vuePlugin:S(e).VuePlugin -}),e.debugMode=()=>{i=!1},e.safeMode=()=>{i=!0},e.versionString="10.6.0" -;for(const e in R)"object"==typeof R[e]&&t(R[e]) -;return Object.assign(e,R),e.addPlugin(m),e.addPlugin(P),e.addPlugin(x),e})({}) -}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("swift",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} -function a(...n){return n.map((n=>e(n))).join("")}function t(...n){ -return"("+n.map((n=>e(n))).join("|")+")"} -const i=e=>a(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["associatedtype",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],d=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],p=t(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=t(p,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=a(p,F,"*"),h=t(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=t(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=a(h,f,"*"),y=a(/[A-Z]/,f,"*"),g=["autoclosure",a(/convention\(/,t("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",a(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] -;return e=>{const p={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ -contains:["self"]}),v=[e.C_LINE_COMMENT_MODE,h],N={className:"keyword", -begin:a(/\./,n(t(...s,...u))),end:t(...s,...u),excludeBegin:!0},A={ -match:a(/\./,t(...r)),relevance:0 -},C=r.filter((e=>"string"==typeof e)).concat(["_|0"]),_={variants:[{ -className:"keyword", -match:t(...r.filter((e=>"string"!=typeof e)).concat(c).map(i),...u)}]},D={ -$pattern:t(/\b\w+/,/#\w+/),keyword:C.concat(m),literal:o},B=[N,A,_],k=[{ -match:a(/\./,t(...d)),relevance:0},{className:"built_in", -match:a(/\b/,t(...d),/(?=\()/)}],M={match:/->/,relevance:0},S=[M,{ -className:"operator",relevance:0,variants:[{match:b},{match:`\\.(\\.|${F})+`}] -}],x="([0-9a-fA-F]_*)+",I={className:"number",relevance:0,variants:[{ -match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ -match:`\\b0x(${x})(\\.(${x}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ -match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},O=(e="")=>({ -className:"subst",variants:[{match:a(/\\/,e,/[0\\tnr"']/)},{ -match:a(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),T=(e="")=>({className:"subst", -match:a(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),L=(e="")=>({className:"subst", -label:"interpol",begin:a(/\\/,e,/\(/),end:/\)/}),P=(e="")=>({begin:a(e,/"""/), -end:a(/"""/,e),contains:[O(e),T(e),L(e)]}),$=(e="")=>({begin:a(e,/"/), -end:a(/"/,e),contains:[O(e),L(e)]}),K={className:"string", -variants:[P(),P("#"),P("##"),P("###"),$(),$("#"),$("##"),$("###")]},j={ -match:a(/`/,w,/`/)},z=[j,{className:"variable",match:/\$\d+/},{ -className:"variable",match:`\\$${f}+`}],q=[{match:/(@|#)available/, -className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:E, -contains:[...S,I,K]}]}},{className:"keyword",match:a(/@/,t(...g))},{ -className:"meta",match:a(/@/,w)}],U={match:n(/\b[A-Z]/),relevance:0,contains:[{ -className:"type", -match:a(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") -},{className:"type",match:y,relevance:0},{match:/[?!]+/,relevance:0},{ -match:/\.\.\./,relevance:0},{match:a(/\s+&\s+/,n(y)),relevance:0}]},Z={ -begin://,keywords:D,contains:[...v,...B,...q,M,U]};U.contains.push(Z) -;const G={begin:/\(/,end:/\)/,relevance:0,keywords:D,contains:["self",{ -match:a(w,/\s*:/),keywords:"_|0",relevance:0 -},...v,...B,...k,...S,I,K,...z,...q,U]},H={beginKeywords:"func",contains:[{ -className:"title",match:t(j.match,w,b),endsParent:!0,relevance:0},p]},R={ -begin://,contains:[...v,U]},V={begin:/\(/,end:/\)/,keywords:D, -contains:[{begin:t(n(a(w,/\s*:/)),n(a(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0, -contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:w}] -},...v,...B,...S,I,K,...q,U,G],endsParent:!0,illegal:/["']/},W={ -className:"function",match:n(/\bfunc\b/),contains:[H,R,V,p],illegal:[/\[/,/%/] -},X={className:"function",match:/\b(subscript|init[?!]?)\s*(?=[<(])/,keywords:{ -keyword:"subscript init init? init!",$pattern:/\w+[?!]?/},contains:[R,V,p], -illegal:/\[|%/},J={beginKeywords:"operator",end:e.MATCH_NOTHING_RE,contains:[{ -className:"title",match:b,endsParent:!0,relevance:0}]},Q={ -beginKeywords:"precedencegroup",end:e.MATCH_NOTHING_RE,contains:[{ -className:"title",match:y,relevance:0},{begin:/{/,end:/}/,relevance:0, -endsParent:!0,keywords:[...l,...o],contains:[U]}]};for(const e of K.variants){ -const n=e.contains.find((e=>"interpol"===e.label));n.keywords=D -;const a=[...B,...k,...S,I,K,...z];n.contains=[...a,{begin:/\(/,end:/\)/, -contains:["self",...a]}]}return{name:"Swift",keywords:D,contains:[...v,W,X,{ -className:"class",beginKeywords:"struct protocol class extension enum", -end:"\\{",excludeEnd:!0,keywords:D,contains:[e.inherit(e.TITLE_MODE,{ -begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...B]},J,Q,{ -beginKeywords:"import",end:/$/,contains:[...v],relevance:0 -},...B,...k,...S,I,K,...z,...q,U,G]}}})());hljs.registerLanguage("c",(()=>{"use strict";function e(e){ -return((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(",e,")?") -}return t=>{const n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}] -}),r="[a-zA-Z_]\\w*::",a="(decltype\\(auto\\)|"+e(r)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",i={ -className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string", -variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", -contains:[t.BACKSLASH_ESCAPE]},{ -begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", -end:"'",illegal:"."},t.END_SAME_AS_BEGIN({ -begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ -className:"number",variants:[{begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" -},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ -"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" -},contains:[{begin:/\\\n/,relevance:0},t.inherit(s,{className:"meta-string"}),{ -className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n" -},n,t.C_BLOCK_COMMENT_MODE]},l={className:"title",begin:e(r)+t.IDENT_RE, -relevance:0},d=e(r)+t.IDENT_RE+"\\s*\\(",u={ -keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", -built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary", -literal:"true false nullptr NULL"},m=[c,i,n,t.C_BLOCK_COMMENT_MODE,o,s],p={ -variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ -beginKeywords:"new throw return else",end:/;/}],keywords:u,contains:m.concat([{ -begin:/\(/,end:/\)/,keywords:u,contains:m.concat(["self"]),relevance:0}]), -relevance:0},_={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d, -returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:u,illegal:/[^\w\s\*&:<>.]/, -contains:[{begin:"decltype\\(auto\\)",keywords:u,relevance:0},{begin:d, -returnBegin:!0,contains:[l],relevance:0},{className:"params",begin:/\(/, -end:/\)/,keywords:u,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,s,o,i,{ -begin:/\(/,end:/\)/,keywords:u,relevance:0, -contains:["self",n,t.C_BLOCK_COMMENT_MODE,s,o,i]}] -},i,n,t.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["c","h"],keywords:u, -disableAutodetect:!0,illegal:"",keywords:u,contains:["self",i]},{begin:t.IDENT_RE+"::",keywords:u},{ -className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, -contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{ -preprocessor:c,strings:s,keywords:u}}}})());hljs.registerLanguage("objectivec",(()=>{"use strict";return e=>{ -const n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n, -keyword:"@interface @class @protocol @implementation"};return{ -name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], -keywords:{$pattern:n, -keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN", -literal:"false true FALSE TRUE nil YES NO NULL", -built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once" -},illegal:"/,end:/$/, -illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ -className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:/(\{|$)/, -excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{ -begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}})());hljs.registerLanguage("kotlin",(()=>{"use strict" -;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ -className:"number",variants:[{ -begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ -begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ -begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ -begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], -relevance:0};return e=>{const n={ -keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", -built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", -literal:"true false null"},i={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" -},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},t={ -className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", -variants:[{begin:'"""',end:'"""(?=[^"])',contains:[t,s]},{begin:"'",end:"'", -illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, -contains:[e.BACKSLASH_ESCAPE,t,s]}]};s.contains.push(r);const l={ -className:"meta", -begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" -},c={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, -end:/\)/,contains:[e.inherit(r,{className:"meta-string"})]}] -},o=a,b=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),E={ -variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, -contains:[]}]},d=E;return d.variants[1].contains=[E],E.variants[1].contains=[d], -{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{ -relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}] -}),e.C_LINE_COMMENT_MODE,b,{className:"keyword", -begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", -begin:/@\w+/}]}},i,l,c,{className:"function",beginKeywords:"fun",end:"[(]|$", -returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ -begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, -contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, -keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, -endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, -endsWithParent:!0,contains:[E,e.C_LINE_COMMENT_MODE,b],relevance:0 -},e.C_LINE_COMMENT_MODE,b,l,c,r,e.C_NUMBER_MODE]},b]},{className:"class", -beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, -illegal:"extends implements",contains:[{ -beginKeywords:"public protected internal private constructor" -},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, -excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/, -excludeBegin:!0,returnEnd:!0},l,c]},r,{className:"meta",begin:"^#!/usr/bin/env", -end:"$",illegal:"\n"},o]}}})());hljs.registerLanguage("xml",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} -function a(...n){return n.map((n=>e(n))).join("")}function s(...n){ -return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ -const t=a(/[A-Z_]/,a("(",/[A-Z0-9_.-]*:/,")?"),/[A-Z0-9_.-]*/),i={ -className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},r={begin:/\s/, -contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] -},c=e.inherit(r,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{ -className:"meta-string"}),g=e.inherit(e.QUOTE_STRING_MODE,{ -className:"meta-string"}),m={endsWithParent:!0,illegal:/`]+/}]}] -}]};return{name:"HTML, XML", -aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], -case_insensitive:!0,contains:[{className:"meta",begin://, -relevance:10,contains:[r,g,l,c,{begin:/\[/,end:/\]/,contains:[{className:"meta", -begin://,contains:[r,c,g,l]}]}]},e.COMMENT(//,{ -relevance:10}),{begin://,relevance:10},i,{ -className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"style"},contains:[m],starts:{ -end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"script"},contains:[m],starts:{ -end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ -className:"tag",begin:/<>|<\/>/},{className:"tag", -begin:a(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name", -begin:t,relevance:0,starts:m}]},{className:"tag",begin:a(/<\//,n(a(t,/>/))), -contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0}]}]}} -})());hljs.registerLanguage("markdown",(()=>{"use strict";function n(...n){ -return n.map((n=>{return(e=n)?"string"==typeof e?e:e.source:null;var e -})).join("")}return e=>{const a={begin:/<\/?[A-Za-z_]/,end:">", -subLanguage:"xml",relevance:0},i={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0 -},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, -relevance:2},{begin:n(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), -relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ -begin:/\[.+?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{ -className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, -returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", -excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", -end:"\\]",excludeBegin:!0,excludeEnd:!0}]},s={className:"strong",contains:[], -variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},c={ -className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{ -begin:/_(?!_)/,end:/_/,relevance:0}]};s.contains.push(c),c.contains.push(s) -;let t=[a,i] -;return s.contains=s.contains.concat(t),c.contains=c.contains.concat(t), -t=t.concat(s,c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ -className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:t},{ -begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", -contains:t}]}]},a,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", -end:"\\s+",excludeEnd:!0},s,c,{className:"quote",begin:"^>\\s+",contains:t, -end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ -begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ -begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", -contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ -begin:"^[-\\*]{3,}",end:"$"},i,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ -className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ -className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})());hljs.registerLanguage("ruby",(()=>{"use strict";function e(...e){ -return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n -})).join("")}return n=>{ -const a="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",i={ -keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__", -built_in:"proc lambda",literal:"true false nil"},s={className:"doctag", -begin:"@[A-Za-z]+"},r={begin:"#<",end:">"},b=[n.COMMENT("#","$",{contains:[s] -}),n.COMMENT("^=begin","^=end",{contains:[s],relevance:10 -}),n.COMMENT("^__END__","\\n$")],c={className:"subst",begin:/#\{/,end:/\}/, -keywords:i},t={className:"string",contains:[n.BACKSLASH_ESCAPE,c],variants:[{ -begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/, -end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{ -begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/, -end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{ -begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{ -begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ -begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ -begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ -begin:/<<[-~]?'?(\w+)\n(?:[^\n]*\n)*?\s*\1\b/,returnBegin:!0,contains:[{ -begin:/<<[-~]?'?/},n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, -contains:[n.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",d={className:"number", -relevance:0,variants:[{ -begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ -begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" -},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ -begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ -begin:"\\b0(_?[0-7])+r?i?\\b"}]},l={className:"params",begin:"\\(",end:"\\)", -endsParent:!0,keywords:i},o=[t,{className:"class",beginKeywords:"class module", -end:"$|;",illegal:/=/,contains:[n.inherit(n.TITLE_MODE,{ -begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{ -begin:"("+n.IDENT_RE+"::)?"+n.IDENT_RE,relevance:0}]}].concat(b)},{ -className:"function",begin:e(/def\s*/,(_=a+"\\s*(\\(|;|$)",e("(?=",_,")"))), -relevance:0,keywords:"def",end:"$|;",contains:[n.inherit(n.TITLE_MODE,{begin:a -}),l].concat(b)},{begin:n.IDENT_RE+"::"},{className:"symbol", -begin:n.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", -begin:":(?!\\s)",contains:[t,{begin:a}],relevance:0},d,{className:"variable", -begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ -className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:i},{ -begin:"("+n.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{ -className:"regexp",contains:[n.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{ -begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(", -end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}] -}].concat(r,b),relevance:0}].concat(r,b);var _;c.contains=o,l.contains=o -;const E=[{begin:/^\s*=>/,starts:{end:"$",contains:o}},{className:"meta", -begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", -starts:{end:"$",contains:o}}];return b.unshift(r),{name:"Ruby", -aliases:["rb","gemspec","podspec","thor","irb"],keywords:i,illegal:/\/\*/, -contains:[n.SHEBANG({binary:"ruby"})].concat(E).concat(b).concat(o)}}})());hljs.registerLanguage("yaml",(()=>{"use strict";return e=>{ -var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={ -className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ -},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", -variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{ -variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={ -end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},t={begin:/\{/, -end:/\}/,contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]", -contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{ -begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ -begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", -relevance:10},{className:"string", -begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ -begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, -relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type", -begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a -},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", -begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", -relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ -className:"number", -begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" -},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,g,s],r=[...b] -;return r.pop(),r.push(i),l.contains=r,{name:"YAML",case_insensitive:!0, -aliases:["yml","YAML"],contains:b}}})());hljs.registerLanguage("java",(()=>{"use strict" -;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ -className:"number",variants:[{ -begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ -begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ -begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ -begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], -relevance:0};return e=>{ -var n="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s={ -className:"meta",begin:"@[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*", -contains:[{begin:/\(/,end:/\)/,contains:["self"]}]};const r=a;return{ -name:"Java",aliases:["jsp"],keywords:n,illegal:/<\/|#/, -contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, -relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ -begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ -className:"class",beginKeywords:"class interface enum",end:/[{;=]/, -excludeEnd:!0,relevance:1,keywords:"class interface enum",illegal:/[:"\[\]]/, -contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ -beginKeywords:"new throw return else",relevance:0},{className:"class", -begin:"record\\s+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,excludeEnd:!0, -end:/[{;=]/,keywords:n,contains:[{beginKeywords:"record"},{ -begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, -contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, -keywords:n,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE] -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"function", -begin:"([\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(<[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(", -returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:n,contains:[{ -begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, -contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, -keywords:n,relevance:0, -contains:[s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,r,e.C_BLOCK_COMMENT_MODE] -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},r,s]}}})());hljs.registerLanguage("dart",(()=>{"use strict";return e=>{const n={ -className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"}]},a={className:"subst", -variants:[{begin:/\$\{/,end:/\}/}],keywords:"true false null this is new super" -},t={className:"string",variants:[{begin:"r'''",end:"'''"},{begin:'r"""', -end:'"""'},{begin:"r'",end:"'",illegal:"\\n"},{begin:'r"',end:'"',illegal:"\\n" -},{begin:"'''",end:"'''",contains:[e.BACKSLASH_ESCAPE,n,a]},{begin:'"""', -end:'"""',contains:[e.BACKSLASH_ESCAPE,n,a]},{begin:"'",end:"'",illegal:"\\n", -contains:[e.BACKSLASH_ESCAPE,n,a]},{begin:'"',end:'"',illegal:"\\n", -contains:[e.BACKSLASH_ESCAPE,n,a]}]};a.contains=[e.C_NUMBER_MODE,t] -;const i=["Comparable","DateTime","Duration","Function","Iterable","Iterator","List","Map","Match","Object","Pattern","RegExp","Set","Stopwatch","String","StringBuffer","StringSink","Symbol","Type","Uri","bool","double","int","num","Element","ElementList"],r=i.map((e=>e+"?")) -;return{name:"Dart",keywords:{ -keyword:"abstract as assert async await break case catch class const continue covariant default deferred do dynamic else enum export extends extension external factory false final finally for Function get hide if implements import in inferface is late library mixin new null on operator part required rethrow return set show static super switch sync this throw true try typedef var void while with yield", -built_in:i.concat(r).concat(["Never","Null","dynamic","print","document","querySelector","querySelectorAll","window"]), -$pattern:/[A-Za-z][A-Za-z0-9_]*\??/}, -contains:[t,e.COMMENT(/\/\*\*(?!\/)/,/\*\//,{subLanguage:"markdown",relevance:0 -}),e.COMMENT(/\/{3,} ?/,/$/,{contains:[{subLanguage:"markdown",begin:".", -end:"$",relevance:0}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{ -className:"class",beginKeywords:"class interface",end:/\{/,excludeEnd:!0, -contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE] -},e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"},{begin:"=>"}]}}})());hljs.registerLanguage("plaintext",(()=>{"use strict";return t=>({ -name:"Plain text",aliases:["text","txt"],disableAutodetect:!0})})());hljs.registerLanguage("bash",(()=>{"use strict";function e(...e){ -return e.map((e=>{return(s=e)?"string"==typeof s?s:s.source:null;var s -})).join("")}return s=>{const n={},t={begin:/\$\{/,end:/\}/,contains:["self",{ -begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{ -begin:e(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={ -className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},i={ -begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/, -end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, -contains:[s.BACKSLASH_ESCAPE,n,a]};a.contains.push(c);const o={begin:/\$\(\(/, -end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,n] -},r=s.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 -}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, -contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ -name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/, -keyword:"if then else elif fi for while in do done case esac function", -literal:"true false", -built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp" -},contains:[r,s.SHEBANG(),l,o,s.HASH_COMMENT_MODE,i,c,{className:"",begin:/\\"/ -},{className:"string",begin:/'/,end:/'/},n]}}})());hljs.registerLanguage("shell",(()=>{"use strict";return s=>({ -name:"Shell Session",aliases:["console"],contains:[{className:"meta", -begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#]/,starts:{end:/[^\\](?=\s*$)/, -subLanguage:"bash"}}]})})());hljs.registerLanguage("css",(()=>{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() -;return n=>{const a=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, -HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, -ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, -illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} -}))(n),l=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS", -case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, -classNameAliases:{keyframePosition:"selector-tag"}, -contains:[n.C_BLOCK_COMMENT_MODE,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ -},n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 -},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 -},a.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ -begin:":("+i.join("|")+")"},{begin:"::("+o.join("|")+")"}]},{ -className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:":",end:"[;}]", -contains:[a.HEXCOLOR,a.IMPORTANT,n.CSS_NUMBER_MODE,...l,{ -begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" -},contains:[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}] -},{className:"built_in",begin:/[\w-]+(?=\()/}]},{ -begin:(s=/@/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",s,")")), -end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword", -begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0, -relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only", -attribute:t.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute" -},...l,n.CSS_NUMBER_MODE]}]},{className:"selector-tag", -begin:"\\b("+e.join("|")+")\\b"}]};var s}})());hljs.registerLanguage("json",(()=>{"use strict";return n=>{const e={ -literal:"true false null" -},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],a=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],l={ -end:",",endsWithParent:!0,excludeEnd:!0,contains:a,keywords:e},t={begin:/\{/, -end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/, -contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(l,{begin:/:/ -})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(l)], -illegal:"\\S"};return a.push(t,s),i.forEach((n=>{a.push(n)})),{name:"JSON", -contains:a,keywords:e,illegal:"\\S"}}})());hljs.registerLanguage("javascript",(()=>{"use strict" -;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) -;function r(e){return t("(?=",e,")")}function t(...e){return e.map((e=>{ -return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ -const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/, -isTrulyOpeningTag:(e,n)=>{const a=e[0].length+e.index,s=e.input[a] -;"<"!==s?">"===s&&(((e,{after:n})=>{const a="", -returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ -begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 -},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:A}]}] -},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ -variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, -end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, -contains:["self"]}]}],relevance:0},{className:"function", -beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, -contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),p],illegal:/%/},{ -beginKeywords:"while if switch catch for"},{className:"function", -begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", -returnBegin:!0,contains:[p,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ -begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", -beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ -beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, -end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",p] -},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", -contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},p]},{begin:/\$[(.]/}] -}}})()); \ No newline at end of file diff --git a/docs/static-assets/play_button.svg b/docs/static-assets/play_button.svg deleted file mode 100644 index c39a2f4a8..000000000 --- a/docs/static-assets/play_button.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/static-assets/readme.md b/docs/static-assets/readme.md deleted file mode 100644 index 9b2d3a781..000000000 --- a/docs/static-assets/readme.md +++ /dev/null @@ -1,21 +0,0 @@ -# highlight.js - -Generated from https://highlightjs.org/download/ on 2021-03-07 - -**Included languages:** - -* bash -* c -* css -* dart -* html, xml -* java -* javascript -* json -* kotlin -* markdown -* objective-c -* plaintext -* shell -* swift -* yaml diff --git a/docs/static-assets/script.js b/docs/static-assets/script.js deleted file mode 100644 index 190a000f1..000000000 --- a/docs/static-assets/script.js +++ /dev/null @@ -1,496 +0,0 @@ -function initSideNav() { - const leftNavToggle = document.getElementById('sidenav-left-toggle'); - const leftDrawer = document.querySelector('.sidebar-offcanvas-left'); - const overlay = document.getElementById('overlay-under-drawer'); - - function toggleBoth() { - if (leftDrawer) { - leftDrawer.classList.toggle('active'); - } - - if (overlay) { - overlay.classList.toggle('active'); - } - } - - if (overlay) { - overlay.addEventListener('click', toggleBoth); - } - - if (leftNavToggle) { - leftNavToggle.addEventListener('click', toggleBoth); - } -} - -function saveLeftScroll() { - const leftSidebar = document.getElementById('dartdoc-sidebar-left'); - sessionStorage.setItem('dartdoc-sidebar-left-scrollt' + window.location.pathname, leftSidebar.scrollTop.toString()); - sessionStorage.setItem('dartdoc-sidebar-left-scrolll' + window.location.pathname, leftSidebar.scrollLeft.toString()); -} - -function saveMainContentScroll() { - const mainContent = document.getElementById('dartdoc-main-content'); - sessionStorage.setItem('dartdoc-main-content-scrollt' + window.location.pathname, mainContent.scrollTop.toString()); - sessionStorage.setItem('dartdoc-main-content-scrolll' + window.location.pathname, mainContent.scrollLeft.toString()); -} - -function saveRightScroll() { - const rightSidebar = document.getElementById('dartdoc-sidebar-right'); - sessionStorage.setItem('dartdoc-sidebar-right-scrollt' + window.location.pathname, rightSidebar.scrollTop.toString()); - sessionStorage.setItem('dartdoc-sidebar-right-scrolll' + window.location.pathname, rightSidebar.scrollLeft.toString()); -} - -function restoreScrolls() { - const leftSidebar = document.getElementById('dartdoc-sidebar-left'); - const mainContent = document.getElementById('dartdoc-main-content'); - const rightSidebar = document.getElementById('dartdoc-sidebar-right'); - - try { - const leftSidebarX = sessionStorage.getItem('dartdoc-sidebar-left-scrolll' + window.location.pathname); - const leftSidebarY = sessionStorage.getItem('dartdoc-sidebar-left-scrollt' + window.location.pathname); - - const mainContentX = sessionStorage.getItem('dartdoc-main-content-scrolll' + window.location.pathname); - const mainContentY = sessionStorage.getItem('dartdoc-main-content-scrollt' + window.location.pathname); - - const rightSidebarX = sessionStorage.getItem('dartdoc-sidebar-right-scrolll' + window.location.pathname); - const rightSidebarY = sessionStorage.getItem('dartdoc-sidebar-right-scrollt' + window.location.pathname); - - leftSidebar.scrollTo(parseFloat(leftSidebarX), parseFloat(leftSidebarY)); - mainContent.scrollTo(parseFloat(mainContentX), parseFloat(mainContentY)); - rightSidebar.scrollTo(parseFloat(rightSidebarX), parseFloat(rightSidebarY)); - } finally { - // Set visibility to visible after scroll to prevent the brief appearance of the - // panel in the wrong position. - leftSidebar.style.visibility = 'visible'; - mainContent.style.visibility = 'visible'; - rightSidebar.style.visibility = 'visible'; - } -} - -function initScrollSave() { - const leftSidebar = document.getElementById('dartdoc-sidebar-left'); - const mainContent = document.getElementById('dartdoc-main-content'); - const rightSidebar = document.getElementById('dartdoc-sidebar-right'); - - leftSidebar.addEventListener("scroll", saveLeftScroll, true); - mainContent.addEventListener("scroll", saveMainContentScroll, true); - rightSidebar.addEventListener("scroll", saveRightScroll, true); -} - -const weights = { - 'library' : 2, - 'class' : 2, - 'mixin' : 3, - 'extension' : 3, - 'typedef' : 3, - 'method' : 4, - 'accessor' : 4, - 'operator' : 4, - 'constant' : 4, - 'property' : 4, - 'constructor' : 4 -}; - -function findMatches(index, query) { - if (query === '') { - return []; - } - - const allMatches = []; - - index.forEach(element => { - function score(value) { - value -= element.overriddenDepth * 10; - const weightFactor = weights[element.type] || 4; - allMatches.push({element: element, score: (value / weightFactor) >> 0}); - } - - const name = element.name; - const qualifiedName = element.qualifiedName; - const lowerName = name.toLowerCase(); - const lowerQualifiedName = qualifiedName.toLowerCase(); - const lowerQuery = query.toLowerCase(); - - if (name === query || qualifiedName === query || name === `dart:${query}`) { - score(2000); - } else if (lowerName === `dart:${lowerQuery}`) { - score(1800); - } else if (lowerName === lowerQuery || lowerQualifiedName === lowerQuery) { - score(1700); - } else if (query.length > 1) { - if (name.startsWith(query) || qualifiedName.startsWith(query)) { - score(750); - } else if (lowerName.startsWith(lowerQuery) || lowerQualifiedName.startsWith(lowerQuery)) { - score(650); - } else if (name.includes(query) || qualifiedName.includes(query)) { - score(500); - } else if (lowerName.includes(lowerQuery) || lowerQualifiedName.includes(query)) { - score(400); - } - } - }); - - allMatches.sort((a, b) => { - const x = b.score - a.score; - if (x === 0) { - return a.element.name.length - b.element.name.length; - } - return x; - }); - - const justElements = []; - - for (let i = 0; i < allMatches.length; i++) { - justElements.push(allMatches[i].element); - } - - return justElements; -} - -let baseHref = ''; - -const minLength = 1; -const suggestionLimit = 10; - -function initializeSearch(input, index) { - input.disabled = false; - input.setAttribute('placeholder', 'Search API Docs'); - - // Handle grabbing focus when the users types / outside of the input - document.addEventListener('keypress', (event) => { - if (event.code === 'Slash' && !(document.activeElement instanceof HTMLInputElement)) { - event.preventDefault(); - input.focus(); - } - }); - - // Prepare elements - - const parentForm = input.parentNode; - const wrapper = document.createElement('div'); - wrapper.classList.add('tt-wrapper'); - - parentForm.replaceChild(wrapper, input); - - const inputHint = document.createElement('input'); - inputHint.setAttribute('type', 'text'); - inputHint.setAttribute('autocomplete', 'off'); - inputHint.setAttribute('readonly', 'true'); - inputHint.setAttribute('spellcheck', 'false'); - inputHint.setAttribute('tabindex', '-1'); - inputHint.classList.add('typeahead', 'tt-hint'); - - wrapper.appendChild(inputHint); - - input.setAttribute('autocomplete', 'off'); - input.setAttribute('spellcheck', 'false'); - input.classList.add('tt-input'); - - wrapper.appendChild(input); - - const listBox = document.createElement('div'); - listBox.setAttribute('role', 'listbox'); - listBox.setAttribute('aria-expanded', 'false'); - listBox.style.display = 'none'; - listBox.classList.add('tt-menu'); - - const presentation = document.createElement('div'); - presentation.classList.add('tt-elements'); - - listBox.appendChild(presentation); - - wrapper.appendChild(listBox); - - // Set up various search functionality - - function highlight(text, query) { - query = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - return text.replace(new RegExp(query, 'gi'), (matched) => { - return `${matched}`; - }); - } - - function createSuggestion(query, match) { - const suggestion = document.createElement('div'); - suggestion.setAttribute('data-href', match.href); - suggestion.classList.add('tt-suggestion'); - - const suggestionTitle = document.createElement('span'); - suggestionTitle.classList.add('tt-suggestion-title'); - suggestionTitle.innerHTML = highlight(`${match.name} ${match.type.toLowerCase()}`, query); - - suggestion.appendChild(suggestionTitle); - - if (match.enclosedBy) { - const fromLib = document.createElement('div'); - fromLib.classList.add('search-from-lib'); - fromLib.innerHTML = `from ${highlight(match.enclosedBy.name, query)}`; - - suggestion.appendChild(fromLib); - } - - suggestion.addEventListener('mousedown', event => { - event.preventDefault(); - }); - - suggestion.addEventListener('click', event => { - if (match.href) { - window.location = baseHref + match.href; - event.preventDefault(); - } - }); - - return suggestion; - } - - let storedValue = null; - let actualValue = ''; - let hint = null; - - let suggestionElements = []; - let suggestionsInfo = []; - let selectedElement = null; - - function setHint(value) { - hint = value; - inputHint.value = value || ''; - } - - function updateSuggestions(query, suggestions) { - suggestionsInfo = []; - suggestionElements = []; - presentation.textContent = ''; - - if (suggestions.length < minLength) { - setHint(null) - hideSuggestions(); - return; - } - - for (let i = 0; i < suggestions.length; i++) { - const element = createSuggestion(query, suggestions[i]); - suggestionElements.push(element); - presentation.appendChild(element); - } - - suggestionsInfo = suggestions; - - setHint(query + suggestions[0].name.slice(query.length)); - selectedElement = null; - - showSuggestions(); - } - - function handle(newValue, forceUpdate) { - if (actualValue === newValue && !forceUpdate) { - return; - } - - if (newValue === null || newValue.length === 0) { - updateSuggestions('', []); - return; - } - - const suggestions = findMatches(index, newValue).slice(0, suggestionLimit); - actualValue = newValue; - - updateSuggestions(newValue, suggestions); - } - - function showSuggestions() { - if (presentation.hasChildNodes()) { - listBox.style.display = 'block'; - listBox.setAttribute('aria-expanded', 'true'); - } - } - - function hideSuggestions() { - listBox.style.display = 'none'; - listBox.setAttribute('aria-expanded', 'false'); - } - - // Hook up events - - input.addEventListener('focus', () => { - handle(input.value, true); - }); - - input.addEventListener('blur', () => { - selectedElement = null; - if (storedValue !== null) { - input.value = storedValue; - storedValue = null; - } - hideSuggestions(); - setHint(null); - }); - - input.addEventListener('input', event => { - handle(event.target.value); - }); - - input.addEventListener('keydown', event => { - if (suggestionElements.length === 0) { - return; - } - - if (event.code === 'Enter') { - const selectingElement = selectedElement || 0; - const href = suggestionElements[selectingElement].dataset.href; - if (href) { - window.location = baseHref + href; - } - return; - } - - if (event.code === 'Tab') { - if (selectedElement === null) { - // The user wants to fill the field with the hint - if (hint !== null) { - input.value = hint; - handle(hint); - event.preventDefault(); - } - } else { - // The user wants to fill the input field with their currently selected suggestion - handle(suggestionsInfo[selectedElement].name); - storedValue = null; - selectedElement = null; - event.preventDefault(); - } - return; - } - - const lastIndex = suggestionElements.length - 1; - const previousSelectedElement = selectedElement; - - if (event.code === 'ArrowUp') { - if (selectedElement === null) { - selectedElement = lastIndex; - } else if (selectedElement === 0) { - selectedElement = null; - } else { - selectedElement--; - } - } else if (event.code === 'ArrowDown') { - if (selectedElement === null) { - selectedElement = 0; - } else if (selectedElement === lastIndex) { - selectedElement = null; - } else { - selectedElement++; - } - } else { - if (storedValue !== null) { - storedValue = null; - handle(input.value); - } - return; - } - - if (previousSelectedElement !== null) { - suggestionElements[previousSelectedElement].classList.remove('tt-cursor'); - } - - if (selectedElement !== null) { - const selected = suggestionElements[selectedElement]; - selected.classList.add('tt-cursor'); - - // Guarantee the selected element is visible - if (selectedElement === 0) { - listBox.scrollTop = 0; - } else if (selectedElement === lastIndex) { - listBox.scrollTop = listBox.scrollHeight; - } else { - const offsetTop = selected.offsetTop; - const parentOffsetHeight = listBox.offsetHeight; - if (offsetTop < parentOffsetHeight || parentOffsetHeight < (offsetTop + selected.offsetHeight)) { - selected.scrollIntoView({behavior: 'auto', block: 'nearest'}); - } - } - - if (storedValue === null) { - // Store the actual input value to display their currently selected item - storedValue = input.value; - } - input.value = suggestionsInfo[selectedElement].name; - setHint(''); - } else if (storedValue !== null && previousSelectedElement !== null) { - // They are moving back to the input field, so return the stored value - input.value = storedValue; - setHint(storedValue + suggestionsInfo[0].name.slice(storedValue.length)); - storedValue = null; - } - - event.preventDefault(); - }); -} - -document.addEventListener('DOMContentLoaded', () => { - // Place this first so that unexpected exceptions in other JavaScript do not block page visibility. - restoreScrolls(); - hljs.highlightAll(); - initSideNav(); - initScrollSave(); - - const searchBox = document.getElementById('search-box'); - const searchBody = document.getElementById('search-body'); - const searchSidebar = document.getElementById('search-sidebar'); - - if (document.body.getAttribute('data-using-base-href') === 'false') { - // If dartdoc did not add a base-href tag, we will need to add the relative - // path ourselves. - baseHref = document.body.getAttribute('data-base-href'); - } - - function disableSearch() { - console.log('Could not activate search functionality.'); - if (searchBox) { - searchBox.placeholder = 'Failed to initialize search'; - } - - if (searchBody) { - searchBody.placeholder = 'Failed to initialize search'; - } - - if (searchSidebar) { - searchSidebar.placeholder = 'Failed to initialize search'; - } - } - - if ('fetch' in window) { - fetch(baseHref + 'index.json', {method: 'GET'}) - .then(response => response.json()) - .then(index => { - // Handle if the user specified a `search` parameter in the URL - if ('URLSearchParams' in window) { - const search = new URLSearchParams(window.location.search).get('search'); - if (search) { - const matches = findMatches(search); - if (matches.length !== 0) { - window.location = baseHref + matches[0].href; - return; - } - } - } - - // Initialize all three search fields - if (searchBox) { - initializeSearch(searchBox, index); - } - - if (searchBody) { - initializeSearch(searchBody, index); - } - - if (searchSidebar) { - initializeSearch(searchSidebar, index); - } - }) - .catch(() => { - disableSearch(); - }); - } else { - disableSearch(); - } -}); diff --git a/docs/static-assets/styles.css b/docs/static-assets/styles.css deleted file mode 100644 index 1c6470225..000000000 --- a/docs/static-assets/styles.css +++ /dev/null @@ -1,1014 +0,0 @@ - -/* Palette generated by Material Palette - materialpalette.com/blue/cyan */ - -.dark-primary-color { background: #1976D2; } -.default-primary-color { background: #2196F3; } -.light-primary-color { background: #BBDEFB; } -.text-primary-color { color: #FFFFFF; } -.accent-color { background: #00BCD4; } -.primary-text-color { color: #212121; } -.secondary-text-color { color: #727272; } -.divider-color { border-color: #B6B6B6; } - -/* for layout */ -html, -body { - margin: 0; - padding: 0; - height: 100%; - width: 100%; - overflow: hidden; - box-sizing: border-box; -} - -*, *:before, *:after { - box-sizing: inherit; -} - -body { - display: flex; - flex-direction: column; - -webkit-overflow-scrolling: touch; -} - -header { - flex: 0 0 50px; - display: flex; - flex-direction: row; - align-items: center; - padding-left: 30px; -} - -header ol { - list-style: none; - margin: 0; - padding: 0; -} - -header ol li { - display: inline; -} - -header form { - display: flex; - flex: 1; - justify-content: flex-end; - padding-right: 30px; -} - -header#header-search-sidebar { - height: 50px; - margin-bottom: 25px; -} - -footer { - flex: 0 0 16px; - text-align: center; - padding: 16px 20px; -} - -main { - flex: 1; - display: flex; - flex-direction: row; - padding: 20px; - min-height: 0; -} - -.sidebar-offcanvas-left { - flex: 0 1 230px; - overflow-y: scroll; - padding: 20px 0 15px 30px; - margin: 5px 20px 0 0; - visibility: hidden; /* shown by Javascript after scroll position restore */ -} - -::-webkit-scrollbar-button{ display: none; height: 13px; border-radius: 0px; background-color: #AAA; } -::-webkit-scrollbar-button:hover{ background-color: #AAA; } -::-webkit-scrollbar-thumb{ background-color: #CCC; } -::-webkit-scrollbar-thumb:hover{ background-color: #CCC; } -::-webkit-scrollbar{ width: 4px; } - -.main-content::-webkit-scrollbar{ width: 8px; } - -.main-content { - flex: 1; - overflow-y: scroll; - padding: 10px 20px 0 20px; - visibility: hidden; /* shown by Javascript after scroll position restore */ -} - -.sidebar-offcanvas-right { - flex: 0 1 12em; - overflow-y: scroll; - padding: 20px 15px 15px 15px; - margin-top: 5px; - margin-right: 20px; - visibility: hidden; /* shown by Javascript after scroll position restore */ -} -/* end for layout */ - -body { - -webkit-text-size-adjust: 100%; - overflow-x: hidden; - font-family: Roboto, sans-serif; - font-size: 16px; - line-height: 1.42857143; - color: #111111; - background-color: #fff; -} - -/* some of this is to reset bootstrap */ -nav.navbar { - background-color: inherit; - min-height: 50px; - border: 0; -} - -@media (max-width: 768px) { - .hidden-xs { - display: none !important; - } -} - -@media (min-width: 769px) { - .hidden-l { - display: none !important; - } -} - -nav.navbar .row { - padding-top: 8px; -} - -nav .container { - white-space: nowrap; -} - -header { - background-color: #eeeeee; - box-shadow: 0 3px 5px rgba(0,0,0,0.1); -} - -header.header-fixed nav.navbar-fixed-top { - box-shadow: 0 3px 5px rgba(0,0,0,0.1); -} - -header.container-fluid { - padding: 0; -} - -header .masthead { - padding-top: 64px; -} - -header .contents { - padding: 0; -} - -@media screen and (max-width:768px) { - header .contents { - padding-left: 15px; - padding-right: 15px; - } -} - -a { - text-decoration: none; -} - -.body { - margin-top: 90px; -} - -section { - margin-bottom: 36px; -} - -dl { - margin: 0; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: Roboto, sans-serif; - font-weight: 400; - margin-top: 1.5em; - color: #111111; -} - -h1.title { - overflow: hidden; - text-overflow: ellipsis; -} - -h1 { - font-size: 37px; - margin-top: 0; - margin-bottom: 0.67em; -} - -h2 { - font-size: 28px; -} - -h5 { - font-size: 16px; -} - -.subtitle { - font-size: 17px; - min-height: 1.4em; -} - -.title-description .subtitle { - white-space: nowrap; - overflow-x: hidden; - text-overflow: ellipsis; -} - -p { - margin-bottom: 1em; - margin-top: 0; -} - -a { - color: #0175C2; -} - -a:hover { - color: #13B9FD; -} - -pre.prettyprint { - font-family: 'Roboto Mono', Menlo, monospace; - color: black; - border-radius: 0; - font-size: 15px; - word-wrap: normal; - line-height: 1.4; - border: 0; - margin: 16px 0 16px 0; - padding: 8px; -} - -pre code { - white-space: pre; - word-wrap: initial; - font-size: 100% -} - -.fixed { - white-space: pre; -} - -pre { - border: 1px solid #ddd; - background-color: #eee; - font-size: 14px; -} - -code { - font-family: 'Roboto Mono', Menlo, monospace; - /* overriding bootstrap */ - color: inherit; - padding: 0.2em 0.4em; - font-size: 85%; - background-color: rgba(27,31,35,0.05); - border-radius: 3px; -} - -@media(max-width: 768px) { - nav .container { - width: 100% - } - - h1 { - font-size: 24px; - } - - pre { - margin: 16px 0; - } -} - -@media (min-width: 768px) { - ul.subnav li { - font-size: 17px; - } -} - -header h1 { - font-weight: 400; - margin-bottom: 16px; -} - -header a, -header p, -header li { - color: #111111; -} - -header a:hover { - color: #0175C2; -} - -header h1 .kind { - color: #555; -} - -dt { - font-weight: normal; -} - -dd { - color: #212121; - margin-bottom: 1em; - margin-left: 0; -} - -dd.callable, dd.constant, dd.property { - margin-bottom: 24px; -} - -dd p { - overflow-x: hidden; - text-overflow: ellipsis; - margin-bottom: 0; -} - -/* Enum values do not have their own pages; their full docs are presented on the - * enum class's page. */ -dt.constant + dd p { - margin-bottom: 1em; -} - -/* indents wrapped lines */ -section.summary dt { - margin-left: 24px; - text-indent: -24px; -} - -.dl-horizontal dd { - margin-left: initial; -} - -dl.dl-horizontal dt { - font-style: normal; - text-align: left; - color: #727272; - margin-right: 20px; - width: initial; -} - -dt .name { - font-weight: 500; -} - -dl dt.callable .name { - float: none; - width: auto; -} - -.parameter { - white-space: nowrap; -} - -.type-parameter { - white-space: nowrap; -} - -.multi-line-signature .type-parameter .parameter { - margin-left: 0px; - display: unset; -} - -.parameter-list { - display: table-cell; - margin-left: 10px; - list-style-type: none; -} - -.signature { - color: #727272; -} - -.signature a { - /* 50% mix of default-primary-color and primary-text-color. */ - color: #4674a2; -} - -.optional { - font-style: italic; -} - -.undocumented { - font-style: italic; -} - -.is-const { - font-style: italic; -} - -.deprecated { - text-decoration: line-through; -} - -.category.linked { - font-weight: bold; - opacity: 1; -} - -/* Colors for category based on categoryOrder in dartdoc_options.config. */ -.category.cp-0 { - background-color: #54b7c4 -} - -.category.cp-1 { - background-color: #54c47f -} - -.category.cp-2 { - background-color: #c4c254 -} - -.category.cp-3 { - background-color: #c49f54 -} - -.category.cp-4 { - background-color: #c45465 -} - -.category.cp-5 { - background-color: #c454c4 -} - -.category a { - color: white; -} - -.category { - padding: 2px 4px; - font-size: 12px; - border-radius: 4px; - background-color: #999; - text-transform: uppercase; - color: white; - opacity: .5; -} - -h1 .category { - vertical-align: middle; -} - -.feature { - display: inline-block; - background: white; - border: 1px solid #0175c2; - border-radius: 20px; - color: #0175c2; - - font-size: 12px; - padding: 1px 6px; - margin: 0 8px 0 0; -} - -a.feature:hover { - border-color: #13B9FD; -} - -h1 .feature { - vertical-align: middle; -} - -.source-link { - padding: 18px 4px; - vertical-align: middle; -} - -.source-link .material-icons { - font-size: 18px; -} - -@media (max-width: 768px) { - .source-link { - padding: 7px 2px; - font-size: 10px; - } -} - -#external-links { - float: right; -} - -.btn-group { - position: relative; - display: inline-flex; - vertical-align: middle; -} - -p.firstline { - font-weight: bold; -} - -footer { - color: #fff; - background-color: #111111; - width: 100%; -} - -footer p { - margin: 0; -} - -footer .no-break { - white-space: nowrap; -} - -footer .container, -footer .container-fluid { - padding-left: 0; - padding-right: 0; -} - -footer a, footer a:hover { - color: #fff; -} - -.markdown.desc { - max-width: 700px; -} - -.markdown h1 { - font-size: 24px; - margin-bottom: 8px; -} - -.markdown h2 { - font-size: 20px; - margin-top: 24px; - margin-bottom: 8px; -} - -.markdown h3 { - font-size: 18px; - margin-bottom: 8px; -} - -.markdown h4 { - font-size: 16px; - margin-bottom: 0; -} - -.markdown li p { - margin: 0; -} - -.gt-separated { - list-style: none; - padding: 0; - margin: 0; -} - -.gt-separated li { - display: inline-block; -} - -.gt-separated li:before { - background-image: url("data:image/svg+xml;utf8,"); - background-position: center; - content: "\00a0"; - margin: 0 6px 0 4px; - padding: 0 3px 0 0; -} - -.gt-separated.dark li:before { - background-image: url("data:image/svg+xml;utf8,"); -} - -.gt-separated li:first-child:before { - background-image: none; - content: ""; - margin: 0; - padding: 0; -} - -/* The slug line under a declaration for things like "const", "read-only", etc. */ -.features { - font-style: italic; - color: #727272; -} - -.multi-line-signature { - font-size: 17px; - color: #727272; -} - -.multi-line-signature .parameter { - margin-left: 24px; - display: block; -} - -.breadcrumbs { - padding: 0; - margin: 8px 0 8px 0; - white-space: nowrap; - line-height: 1; -} - -@media screen and (min-width: 768px) { - nav ol.breadcrumbs { - float: left; - } -} - -@media screen and (max-width: 768px) { - .breadcrumbs { - margin: 0 0 24px 0; - overflow-x: hidden; - } -} - -.self-crumb { - color: #555; -} - -.self-name { - color: #555; - display: none; -} - -.annotation-list { - list-style: none; - padding: 0; - display: inline; -} - -.comma-separated { - list-style: none; - padding: 0; - display: inline; -} - -.comma-separated li { - display: inline; -} - -.comma-separated li:after { - content: ", "; -} - -.comma-separated li:last-child:after { - content: ""; -} - -.end-with-period li:last-child:after { - content: "."; -} - -.container > section:first-child { - border: 0; -} - -.constructor-modifier { - font-style: italic; -} - -section.multi-line-signature div.parameters { - margin-left: 24px; -} - -/* subnav styles */ - -ul.subnav { - overflow: auto; - white-space: nowrap; - padding-left: 0; - min-height: 25px; -} - -ul.subnav::-webkit-scrollbar { - display: none; -} - -ul.subnav li { - display: inline-block; - text-transform: uppercase; -} - -ul.subnav li a { - color: #111; -} - -ul.subnav li { - margin-right: 24px; -} - -ul.subnav li:last-of-type { - margin-right: 0; -} - -@media(max-width: 768px) { - ul.subnav li { - margin-right: 16px; - } -} - -/* sidebar styles */ - -.sidebar ol { - list-style: none; - line-height: 22px; - margin-top: 0; - margin-bottom: 0; - padding: 0 0 15px 0; -} - -.sidebar h5 a, -.sidebar h5 a:hover { - color: #727272; -} - -.sidebar h5, -.sidebar ol li { - text-overflow: ellipsis; - overflow: hidden; - padding: 3px 0 3px 3px; -} - -.sidebar h5 { - color: #727272; - font-size: 18px; - margin: 0 0 22px 0; - padding-top: 0; -} - -.sidebar ol li.section-title { - font-size: 18px; - font-weight: normal; - text-transform: uppercase; - padding-top: 25px; -} - -.sidebar ol li.section-subtitle a { - color: inherit; -} - -.sidebar ol li.section-subtitle { - font-weight: 400; - text-transform: uppercase; -} - -.sidebar ol li.section-subitem { - margin-left: 12px; -} - -.sidebar ol li:first-child { - padding-top: 3px; - margin-top: 0; -} - -button { - padding: 0; -} - -#sidenav-left-toggle { - display: none; - vertical-align: text-bottom; - padding: 0; -} - -/* left-nav disappears, and can transition in from the left */ -@media screen and (max-width:768px) { - #sidenav-left-toggle { - display: inline; - background: no-repeat url("data:image/svg+xml;utf8,"); - background-position: center; - width: 24px; - height: 24px; - border: none; - margin-right: 24px; - } - - #overlay-under-drawer.active { - opacity: 0.4; - height: 100%; - z-index: 1999; - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: black; - display: block; - } - - .sidebar-offcanvas-left { - left: -100%; - position: fixed; - -webkit-transition:all .25s ease-out; - -o-transition:all .25s ease-out; - transition:all .25s ease-out; - z-index: 2000; - top: 0; - width: 280px; /* works all the way down to an iphone 4 */ - height: 90%; - background-color: white; - overflow-y: scroll; /* TODO: how to hide scroll bars? */ - padding: 10px; - margin: 10px 10px; - box-shadow: 5px 5px 5px 5px #444444; - visibility: hidden; /* shown by Javascript after scroll position restore */ - } - - ol#sidebar-nav { - font-size: 18px; - white-space: pre-line; - } - - .sidebar-offcanvas-left.active { - left: 0; /* this animates our drawer into the page */ - } - - .self-name { - display: inline-block; - } -} - -.sidebar-offcanvas-left h5 { - margin-bottom: 10px; -} - -.sidebar-offcanvas-left h5:last-of-type { - border: 0; - margin-bottom: 25px; -} - -/* the right nav disappears out of view when the window shrinks */ -@media screen and (max-width: 992px) { - .sidebar-offcanvas-right { - display: none; - } -} - -#overlay-under-drawer { - display: none; -} - -/* find-as-you-type search box */ - -/* override bootstrap defaults */ -.form-control { - border-radius: 0; - border: 0; -} - -@media screen and (max-width: 768px) { - form.search { - display: none; - } -} - -.typeahead, -.tt-query, -.tt-hint { - width: 200px; - height: 20px; - padding: 2px 7px 1px 7px; - line-height: 20px; - outline: none; -} - -.typeahead { - background-color: #fff; - border-radius: 2px; -} - -.tt-wrapper { - position: relative; - display: inline-block; -} - -.tt-input { - position: relative; - vertical-align: top; - background-color: transparent; -} - -.tt-query { - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.tt-hint { - position: absolute; - top: 0; - left: 0; - box-shadow: none; - background: none 0 0 / auto repeat scroll padding-box border-box rgb(255, 255, 255); - border-color: transparent; - color: #999; - border-width: 0; -} - -.navbar-right .tt-menu { - right:0; - left: inherit !important; - width: 422px; - max-height: 250px; - overflow-y: scroll; -} - -.tt-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 100; - font-size: 14px; - margin: 0; - padding: 8px 0; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2); - -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2); - box-shadow: 0 5px 10px rgba(0,0,0,.2); -} - -.tt-suggestion { - padding: 3px 20px; - color: #212121; -} - -.tt-suggestion:hover { - cursor: pointer; - color: #fff; - background-color: #0097cf; -} - -.tt-suggestion:hover .search-from-lib { - color: #ddd; -} - -.tt-suggestion.tt-cursor { - color: #fff; - background-color: #0097cf; -} - -.tt-suggestion.tt-cursor .search-from-lib { - color: #ddd; -} - -.tt-suggestion p { - margin: 0; -} - -.search-from-lib { - font-style: italic; - color: gray; -} - -.search-body { - border: 1px solid #7f7f7f; - max-width: 400px; - box-shadow: 3px 3px 5px rgba(0,0,0,0.1); -} - -section#setter { - border-top: 1px solid #ddd; - padding-top: 36px; -} - -li.inherited a { - opacity: 0.65; - font-style: italic; -} - -#instance-methods dt.inherited .name, -#instance-properties dt.inherited .name, -#operators dt.inherited .name { - font-weight: 300; - font-style: italic; -} - -#instance-methods dt.inherited .signature, -#instance-properties dt.inherited .signature, -#operators dt.inherited .signature { - font-weight: 300; -} - -@media print { - .subnav, .sidebar { - display:none; - } - - a[href]:after { - content:"" !important; - } -} diff --git a/docs/widgets/ActivityTile-class.html b/docs/widgets/ActivityTile-class.html deleted file mode 100644 index 481152c7e..000000000 --- a/docs/widgets/ActivityTile-class.html +++ /dev/null @@ -1,453 +0,0 @@ - - - - - - - - ActivityTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ActivityTile
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ActivityTile class - Null safety - -

                        - - -
                        -

                        A widget that represents an Activity.

                        -

                        If the activity needs to show more details (ie, Activity.type is in -detailedActivities), tapping on the tile will open a pop-up with -more details.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - ActivityTile(Activity activity) -
                        -
                        - Creates an ActivityTile widget. -
                        const
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - activity - Activity - -
                        -
                        - The activity being represented by this tile. -
                        final
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - createElement() - StatelessElement - - - -
                        -
                        - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - - -
                        -

                        Constants

                        - -
                        -
                        - detailedActivities - → const Set<ActivityType> - - -
                        -
                        - Types of activities that will show more details when tapped. - - -
                        - {ActivityType.grade, ActivityType.misc} -
                        -
                        - -
                        -
                        - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ActivityTile/ActivityTile.html b/docs/widgets/ActivityTile/ActivityTile.html deleted file mode 100644 index f13a4a93e..000000000 --- a/docs/widgets/ActivityTile/ActivityTile.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - ActivityTile constructor - ActivityTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ActivityTile
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ActivityTile constructor - Null safety -

                        - -
                        const - ActivityTile(
                        1. Activity activity
                        2. -
                        ) -
                        - - -
                        -

                        Creates an ActivityTile widget.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const ActivityTile(this.activity);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ActivityTile/activity.html b/docs/widgets/ActivityTile/activity.html deleted file mode 100644 index 719ec9129..000000000 --- a/docs/widgets/ActivityTile/activity.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - activity property - ActivityTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        activity
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        activity property - Null safety -

                        - -
                        - Activity - activity -
                        final
                        - -
                        - -
                        -

                        The activity being represented by this tile.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Activity activity;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ActivityTile/build.html b/docs/widgets/ActivityTile/build.html deleted file mode 100644 index e4f75a617..000000000 --- a/docs/widgets/ActivityTile/build.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - build method - ActivityTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                        -

                        The implementation of this method must only depend on:

                        - -

                        If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                        -

                        See also:

                        -
                          -
                        • StatelessWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Widget build(BuildContext context) => SizedBox(
                        -	height: 65,
                        -	child: Center(
                        -		child: ListTile(
                        -			title: Text(
                        -				activity.type == ActivityType.grade
                        -					? "Activity by grade"
                        -					: "Activity"
                        -			),
                        -			subtitle: Text(
                        -				detailedActivities.contains(activity.type)
                        -					? "Tap to see details"
                        -					: activity.toString(),
                        -			),
                        -			onTap: () => showDialog(
                        -				context: context,
                        -				builder: (_) => AlertDialog(
                        -					title: const Text("Activity"),
                        -					content: SingleChildScrollView(
                        -						child: Text(activity.message),
                        -					)
                        -				)
                        -			)
                        -		)
                        -	)
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ActivityTile/detailedActivities-constant.html b/docs/widgets/ActivityTile/detailedActivities-constant.html deleted file mode 100644 index 52fc419f7..000000000 --- a/docs/widgets/ActivityTile/detailedActivities-constant.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - detailedActivities constant - ActivityTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        detailedActivities
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        detailedActivities constant - Null safety -

                        - -
                        - Set<ActivityType> - const detailedActivities - - -
                        - -
                        -

                        Types of activities that will show more details when tapped.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const Set<ActivityType> detailedActivities = {
                        -	ActivityType.grade,
                        -	ActivityType.misc,
                        -};
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChanger-class.html b/docs/widgets/BrightnessChanger-class.html deleted file mode 100644 index cb45b921e..000000000 --- a/docs/widgets/BrightnessChanger-class.html +++ /dev/null @@ -1,443 +0,0 @@ - - - - - - - - BrightnessChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        BrightnessChanger
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        BrightnessChanger class - Null safety - -

                        - - -
                        -

                        A widget to toggle the app between light mode and dark mode.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - BrightnessChanger({required BrightnessChangerForm form}) -
                        -
                        - Creates a widget to toggle the app brightness. -
                        const
                        -
                        -
                        - BrightnessChanger.dropdown() -
                        -
                        - Creates a BrightnessChanger as a drop-down menu. -
                        factory
                        -
                        -
                        - BrightnessChanger.iconButton() -
                        -
                        - Creates a BrightnessChanger as a toggle button. -
                        factory
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - form - BrightnessChangerForm - -
                        -
                        - The form this widget should take. -
                        final
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - createElement() - StatefulElement - - - -
                        -
                        - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - createState() - BrightnessChangerState - - - -
                        -
                        - Creates the mutable state for this widget at a given location in the tree. [...] -
                        override
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChanger/BrightnessChanger.dropdown.html b/docs/widgets/BrightnessChanger/BrightnessChanger.dropdown.html deleted file mode 100644 index 63f94012d..000000000 --- a/docs/widgets/BrightnessChanger/BrightnessChanger.dropdown.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - BrightnessChanger.dropdown constructor - BrightnessChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        BrightnessChanger.dropdown
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        BrightnessChanger.dropdown constructor - Null safety -

                        - -
                        - BrightnessChanger.dropdown() -
                        - - -
                        -

                        Creates a BrightnessChanger as a drop-down menu.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        factory BrightnessChanger.dropdown() =>
                        -	const BrightnessChanger(form: BrightnessChangerForm.dropdown);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChanger/BrightnessChanger.html b/docs/widgets/BrightnessChanger/BrightnessChanger.html deleted file mode 100644 index 211d5d30e..000000000 --- a/docs/widgets/BrightnessChanger/BrightnessChanger.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - BrightnessChanger constructor - BrightnessChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        BrightnessChanger
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        BrightnessChanger constructor - Null safety -

                        - -
                        const - BrightnessChanger(
                        1. {required BrightnessChangerForm form}
                        2. -
                        ) -
                        - - -
                        -

                        Creates a widget to toggle the app brightness.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const BrightnessChanger({required this.form});
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChanger/BrightnessChanger.iconButton.html b/docs/widgets/BrightnessChanger/BrightnessChanger.iconButton.html deleted file mode 100644 index d07c94aae..000000000 --- a/docs/widgets/BrightnessChanger/BrightnessChanger.iconButton.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - BrightnessChanger.iconButton constructor - BrightnessChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        BrightnessChanger.iconButton
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        BrightnessChanger.iconButton constructor - Null safety -

                        - -
                        - BrightnessChanger.iconButton() -
                        - - -
                        -

                        Creates a BrightnessChanger as a toggle button.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        factory BrightnessChanger.iconButton() =>
                        -	const BrightnessChanger(form: BrightnessChangerForm.button);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChanger/createState.html b/docs/widgets/BrightnessChanger/createState.html deleted file mode 100644 index e12c12dc1..000000000 --- a/docs/widgets/BrightnessChanger/createState.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - createState method - BrightnessChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        createState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        createState method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -BrightnessChangerState -createState() - -
                        override
                        - -
                        - -
                        -

                        Creates the mutable state for this widget at a given location in the tree.

                        -

                        Subclasses should override this method to return a newly created -instance of their associated State subclass:

                        -
                        @override
                        -_MyState createState() => _MyState();
                        -
                        -

                        The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -BrightnessChangerState createState() => BrightnessChangerState();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChanger/form.html b/docs/widgets/BrightnessChanger/form.html deleted file mode 100644 index 48f0cda23..000000000 --- a/docs/widgets/BrightnessChanger/form.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - form property - BrightnessChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        form
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        form property - Null safety -

                        - -
                        - BrightnessChangerForm - form -
                        final
                        - -
                        - -
                        -

                        The form this widget should take.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final BrightnessChangerForm form;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerForm-class.html b/docs/widgets/BrightnessChangerForm-class.html deleted file mode 100644 index c7a7fe7d5..000000000 --- a/docs/widgets/BrightnessChangerForm-class.html +++ /dev/null @@ -1,321 +0,0 @@ - - - - - - - - BrightnessChangerForm enum - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        BrightnessChangerForm
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        BrightnessChangerForm enum - Null safety - -

                        - - -
                        -

                        The form the BrightnessChanger widget should take.

                        -
                        - - - -
                        -

                        Constants

                        - -
                        -
                        - button - → const BrightnessChangerForm - - -
                        -
                        -

                        The widget should appear as a toggle button.

                        - - -
                        - const BrightnessChangerForm(0) -
                        -
                        - - -
                        -

                        The widget should appear as a drop-down menu.

                        - - -
                        - const BrightnessChangerForm(1) -
                        -
                        - -
                        - values - → const List<BrightnessChangerForm> - - -
                        -
                        -

                        A constant List of the values in this enum, in order of their declaration.

                        - - -
                        - const List<BrightnessChangerForm> -
                        -
                        - -
                        -
                        - - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - index - → int - -
                        -
                        -

                        The integer index of this enum.

                        -
                        final
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] - - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerForm/hashCode.html b/docs/widgets/BrightnessChangerForm/hashCode.html deleted file mode 100644 index f0ca90ab2..000000000 --- a/docs/widgets/BrightnessChangerForm/hashCode.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - hashCode property - BrightnessChangerForm extension - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerForm/noSuchMethod.html b/docs/widgets/BrightnessChangerForm/noSuchMethod.html deleted file mode 100644 index 7e341ac2f..000000000 --- a/docs/widgets/BrightnessChangerForm/noSuchMethod.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - noSuchMethod method - BrightnessChangerForm extension - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerForm/operator_equals.html b/docs/widgets/BrightnessChangerForm/operator_equals.html deleted file mode 100644 index 097b3fd28..000000000 --- a/docs/widgets/BrightnessChangerForm/operator_equals.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - operator == method - BrightnessChangerForm extension - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerForm/runtimeType.html b/docs/widgets/BrightnessChangerForm/runtimeType.html deleted file mode 100644 index 3109aee5c..000000000 --- a/docs/widgets/BrightnessChangerForm/runtimeType.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - runtimeType property - BrightnessChangerForm extension - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerForm/toString.html b/docs/widgets/BrightnessChangerForm/toString.html deleted file mode 100644 index 171f6f6ba..000000000 --- a/docs/widgets/BrightnessChangerForm/toString.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - toString method - BrightnessChangerForm extension - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - - - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerState-class.html b/docs/widgets/BrightnessChangerState-class.html deleted file mode 100644 index cacc185d1..000000000 --- a/docs/widgets/BrightnessChangerState-class.html +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - BrightnessChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        BrightnessChangerState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        BrightnessChangerState class - Null safety - -

                        - - - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - BrightnessChangerState() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - context - BuildContext - -
                        -
                        - The location in the tree where this widget builds. [...] -
                        read-only, inherited
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - icon - Icon - -
                        -
                        - The icon for this widget. -
                        read-only
                        - -
                        - -
                        - mounted - → bool - -
                        -
                        - Whether this State object is currently in a tree. [...] -
                        read-only, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        - widget - BrightnessChanger - -
                        -
                        - The current configuration. [...] -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - buttonToggle(BuildContext context) - → void - - - -
                        -
                        - Toggles the brightness of the app. [...] - - -
                        - -
                        - deactivate() - → void - - - -
                        -
                        - Called when this object is removed from the tree. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - didChangeDependencies() - → void - - - -
                        -
                        - Called when a dependency of this State object changes. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - didUpdateWidget(covariant BrightnessChanger oldWidget) - → void - - - -
                        -
                        - Called whenever the widget configuration changes. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - dispose() - → void - - - -
                        -
                        - Called when this object is removed from the tree permanently. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - initState() - → void - - - -
                        -
                        - Called when this object is inserted into the tree. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - reassemble() - → void - - - -
                        -
                        - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - setBrightness(BuildContext context, {required bool? value}) - → void - - - -
                        -
                        - Sets the brightness of the app. [...] - - -
                        - -
                        - setState(VoidCallback fn) - → void - - - -
                        -
                        - Notify the framework that the internal state of this object has changed. [...] -
                        @protected, inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerState/BrightnessChangerState.html b/docs/widgets/BrightnessChangerState/BrightnessChangerState.html deleted file mode 100644 index 0664637f8..000000000 --- a/docs/widgets/BrightnessChangerState/BrightnessChangerState.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - BrightnessChangerState constructor - BrightnessChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        BrightnessChangerState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        BrightnessChangerState constructor - Null safety -

                        - -
                        - BrightnessChangerState() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerState/build.html b/docs/widgets/BrightnessChangerState/build.html deleted file mode 100644 index 1f6317532..000000000 --- a/docs/widgets/BrightnessChangerState/build.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - - build method - BrightnessChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method in a number of different situations. For -example:

                        - -

                        This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                        -

                        Design discussion

                        -

                        Why is the build method on State, and not StatefulWidget?

                        -

                        Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                        -

                        For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                        -

                        Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                        -

                        Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                        -
                        class MyButton extends StatefulWidget {
                        -  ...
                        -  final Color color;
                        -
                        -  @override
                        -  Widget build(BuildContext context, MyButtonState state) {
                        -    ... () { print("color: $color"); } ...
                        -  }
                        -}
                        -
                        -

                        For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                        -

                        In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                        -
                        class MyButtonState extends State<MyButton> {
                        -  ...
                        -  @override
                        -  Widget build(BuildContext context) {
                        -    ... () { print("color: ${widget.color}"); } ...
                        -  }
                        -}
                        -
                        -

                        Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                        -

                        See also:

                        -
                          -
                        • StatefulWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Widget build (BuildContext context) {
                        -	switch (widget.form) {
                        -		case BrightnessChangerForm.button: return IconButton(
                        -			icon: icon,
                        -			onPressed: () => buttonToggle(context),
                        -		);
                        -		case BrightnessChangerForm.dropdown: return ListTile(
                        -			title: const Text ("Theme"),
                        -			leading: icon,
                        -			trailing: DropdownButton<bool?>(
                        -				onChanged: (bool? value) => setBrightness(context, value: value),
                        -				value: _brightness,
                        -          // Workaround until https://github.com/flutter/flutter/pull/77666 is released
                        -          // DropdownButton with null value don't display the menu item.
                        -          // Using a hint works too
                        -          hint: const Text("Auto"),
                        -				items: const [
                        -					DropdownMenuItem<bool?> (
                        -						value: null,
                        -						child: Text ("Auto")
                        -					),
                        -					DropdownMenuItem<bool?> (
                        -						value: true,
                        -						child: Text ("Light")
                        -					),
                        -					DropdownMenuItem<bool?> (
                        -						value: false,
                        -						child: Text ("Dark"),
                        -					),
                        -				],
                        -			)
                        -		);
                        -	}
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerState/buttonToggle.html b/docs/widgets/BrightnessChangerState/buttonToggle.html deleted file mode 100644 index b16a61a9b..000000000 --- a/docs/widgets/BrightnessChangerState/buttonToggle.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - buttonToggle method - BrightnessChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        buttonToggle
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        buttonToggle method - Null safety -

                        - -
                        - - -void -buttonToggle(
                        1. BuildContext context
                        2. -
                        ) - - - -
                        - -
                        -

                        Toggles the brightness of the app.

                        -

                        When the brightness is light, it will be set to dark. -If the brightness is dark, it will be set to auto. -If the brightness is auto, it will be set to light.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        void buttonToggle(BuildContext context) => setBrightness(
                        -	context,
                        -	value: caseConverter<bool?>(
                        -		value: _brightness,
                        -		onTrue: false,
                        -		onFalse: null,
                        -		onNull: true,
                        -	),
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerState/icon.html b/docs/widgets/BrightnessChangerState/icon.html deleted file mode 100644 index fd1ed75e7..000000000 --- a/docs/widgets/BrightnessChangerState/icon.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - icon property - BrightnessChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        icon
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        icon property - Null safety -

                        - - - -
                        - -
                        - Icon - icon - - -
                        - - -
                        -

                        The icon for this widget.

                        -
                        - - -
                        -

                        Implementation

                        -
                        Icon get icon => Icon (
                        -	caseConverter<IconData>(
                        -		value: _brightness,
                        -		onNull: Icons.brightness_auto,
                        -		onTrue: Icons.brightness_high,
                        -		onFalse: Icons.brightness_low,
                        -	)
                        -);
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/BrightnessChangerState/setBrightness.html b/docs/widgets/BrightnessChangerState/setBrightness.html deleted file mode 100644 index f52ada27b..000000000 --- a/docs/widgets/BrightnessChangerState/setBrightness.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - setBrightness method - BrightnessChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        setBrightness
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        setBrightness method - Null safety -

                        - -
                        - - -void -setBrightness(
                        1. BuildContext context,
                        2. -
                        3. {required bool? value}
                        4. -
                        ) - - - -
                        - -
                        -

                        Sets the brightness of the app.

                        -

                        Also saves it to Preferences.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        void setBrightness (BuildContext context, {required bool? value}) {
                        -	ThemeChanger.of(context).brightness = caseConverter<Brightness> (
                        -		value: value,
                        -		onTrue: Brightness.light,
                        -		onFalse: Brightness.dark,
                        -		onNull: MediaQuery.of(context).platformBrightness,
                        -	);
                        -	Services.instance.prefs.brightness = value;
                        -	setState(() => _brightness = value);
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/CalendarTile-class.html b/docs/widgets/CalendarTile-class.html deleted file mode 100644 index 431d86dba..000000000 --- a/docs/widgets/CalendarTile-class.html +++ /dev/null @@ -1,464 +0,0 @@ - - - - - - - - CalendarTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        CalendarTile
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        CalendarTile class - Null safety - -

                        - - -
                        -

                        A cell in a calendar that represents a Day.

                        -

                        This widget is to be used in the admin view of the calendar. Tapping it -will allow the admin to change the day in the database.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - CalendarTile({required Day? day, required DateTime? date}) -
                        -
                        - Creates a widget to update a day in the calendar -
                        const
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - date - → DateTime? - -
                        -
                        - -
                        final
                        - -
                        - -
                        - day - Day? - -
                        -
                        - The Day represented by this tile. -
                        final
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - createElement() - StatelessElement - - - -
                        -
                        - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - - -
                        -

                        Constants

                        - -
                        -
                        - blank - → const CalendarTile - - -
                        -
                        - A blank calendar tile. [...] - - -
                        - CalendarTile(day: null, date: null) -
                        -
                        - -
                        -
                        - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/CalendarTile/CalendarTile.html b/docs/widgets/CalendarTile/CalendarTile.html deleted file mode 100644 index a1ff8ffad..000000000 --- a/docs/widgets/CalendarTile/CalendarTile.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - CalendarTile constructor - CalendarTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        CalendarTile
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        CalendarTile constructor - Null safety -

                        - -
                        const - CalendarTile(
                        1. {required Day? day,
                        2. -
                        3. required DateTime? date}
                        4. -
                        ) -
                        - - -
                        -

                        Creates a widget to update a day in the calendar

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const CalendarTile({required this.day, required this.date});
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/CalendarTile/blank-constant.html b/docs/widgets/CalendarTile/blank-constant.html deleted file mode 100644 index 73fdd1ef9..000000000 --- a/docs/widgets/CalendarTile/blank-constant.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - blank constant - CalendarTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        blank
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        blank constant - Null safety -

                        - -
                        - CalendarTile - const blank - - -
                        - -
                        -

                        A blank calendar tile.

                        -

                        This should not be wrapped in a GestureDetector.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const CalendarTile blank = CalendarTile(day: null, date: null);
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/CalendarTile/build.html b/docs/widgets/CalendarTile/build.html deleted file mode 100644 index 455b73deb..000000000 --- a/docs/widgets/CalendarTile/build.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - build method - CalendarTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                        -

                        The implementation of this method must only depend on:

                        - -

                        If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                        -

                        See also:

                        -
                          -
                        • StatelessWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Widget build(BuildContext context) => Container(
                        -	decoration: BoxDecoration(border: Border.all()),
                        -	child: date == null ? Container() : LayoutBuilder(
                        -		builder: (BuildContext context, BoxConstraints constraints) {
                        -			final double textSize = constraints.biggest.width > 120 ? 1.5 : 1;
                        -			return Column(
                        -				children: [
                        -					Align (
                        -						alignment: Alignment.topLeft,
                        -						child: Text (date!.day.toString(), textScaleFactor: 1),
                        -					),
                        -					const Spacer(),
                        -					if (day == null)
                        -						Expanded(child: Text("No school", textScaleFactor: textSize))
                        -					else ...[
                        -						Expanded(child: Text (day!.name, textScaleFactor: textSize)),
                        -						Expanded(child: Text (day!.schedule.name, textScaleFactor: 0.8)),
                        -					],
                        -					const Spacer(),
                        -				]
                        -			);
                        -		}
                        -	)
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/CalendarTile/date.html b/docs/widgets/CalendarTile/date.html deleted file mode 100644 index 9577be25b..000000000 --- a/docs/widgets/CalendarTile/date.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - date property - CalendarTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        date
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        date property - Null safety -

                        - -
                        - DateTime? - date -
                        final
                        - -
                        - - - -
                        -

                        Implementation

                        -
                        final DateTime? date;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/CalendarTile/day.html b/docs/widgets/CalendarTile/day.html deleted file mode 100644 index f16829b05..000000000 --- a/docs/widgets/CalendarTile/day.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - day property - CalendarTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        day
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        day property - Null safety -

                        - -
                        - Day? - day -
                        final
                        - -
                        - -
                        -

                        The Day represented by this tile.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Day? day;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassList-class.html b/docs/widgets/ClassList-class.html deleted file mode 100644 index b41a8cb89..000000000 --- a/docs/widgets/ClassList-class.html +++ /dev/null @@ -1,466 +0,0 @@ - - - - - - - - ClassList class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ClassList
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ClassList class - Null safety - -

                        - - -
                        -

                        A list of all the classes for a given day.

                        -

                        The list is composed of ClassPanels, one for each period in the day.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - ClassList({required Day day, required Iterable<Period> periods, String? headerText}) -
                        -
                        - Creates a list of ClassPanel widgets to represent periods in a day. -
                        const
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - day - Day - -
                        -
                        - The day whose periods should be represented. -
                        final
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - headerText - → String? - -
                        -
                        - The header for this list. May be null. -
                        final
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - periods - → Iterable<Period> - -
                        -
                        - A list of periods for today. [...] -
                        final
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - createElement() - StatelessElement - - - -
                        -
                        - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - getPanel(Period period) - Widget - - - -
                        -
                        - Creates a ClassPanel for a given period. - - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassList/ClassList.html b/docs/widgets/ClassList/ClassList.html deleted file mode 100644 index 3ecec93d3..000000000 --- a/docs/widgets/ClassList/ClassList.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - ClassList constructor - ClassList class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ClassList
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ClassList constructor - Null safety -

                        - -
                        const - ClassList(
                        1. {required Day day,
                        2. -
                        3. required Iterable<Period> periods,
                        4. -
                        5. String? headerText}
                        6. -
                        ) -
                        - - -
                        -

                        Creates a list of ClassPanel widgets to represent periods in a day.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const ClassList ({
                        -	required this.day,
                        -	required this.periods,
                        -	this.headerText,
                        -});
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassList/build.html b/docs/widgets/ClassList/build.html deleted file mode 100644 index c950cb3c9..000000000 --- a/docs/widgets/ClassList/build.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - build method - ClassList class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                        -

                        The implementation of this method must only depend on:

                        - -

                        If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                        -

                        See also:

                        -
                          -
                        • StatelessWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Widget build(BuildContext context) => ModelListener<Reminders>(
                        -	model: () => Models.instance.reminders,
                        -	dispose: false,
                        -	// ignore: sort_child_properties_last
                        -	child: DrawerHeader (
                        -		child: Center (
                        -			child: Text (
                        -				headerText ?? "",
                        -				textScaleFactor: 2,
                        -				textAlign: TextAlign.center,
                        -			)
                        -		)
                        -	),
                        -	builder: (_, __, Widget? header) => ListView(
                        -		shrinkWrap: true,
                        -		children: [
                        -			if (headerText != null) header!,  // child is supplied
                        -			...[
                        -				for (final Period period in periods)
                        -					getPanel(period)
                        -			],
                        -		]
                        -	)
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassList/day.html b/docs/widgets/ClassList/day.html deleted file mode 100644 index 7ffef3d4e..000000000 --- a/docs/widgets/ClassList/day.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - day property - ClassList class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        day
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        day property - Null safety -

                        - -
                        - Day - day -
                        final
                        - -
                        - -
                        -

                        The day whose periods should be represented.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Day day;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassList/getPanel.html b/docs/widgets/ClassList/getPanel.html deleted file mode 100644 index 631f16d6d..000000000 --- a/docs/widgets/ClassList/getPanel.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - getPanel method - ClassList class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        getPanel
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        getPanel method - Null safety -

                        - -
                        - - -Widget -getPanel(
                        1. Period period
                        2. -
                        ) - - - -
                        - -
                        -

                        Creates a ClassPanel for a given period.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        Widget getPanel(Period period) {
                        -	final Subject? subject = Models.instance.schedule.subjects[period.id];
                        -	return ClassPanel (
                        -		children: [
                        -			for (final String description in period.getInfo(subject))
                        -				if (!description.startsWith("Period:"))
                        -					description,
                        -			if (period.id != null)
                        -				"ID: ${period.id}",
                        -		],
                        -		title: int.tryParse(period.name) == null
                        -			? period.getName(subject)
                        -			: "${period.name}: ${period.getName(subject)}",
                        -		reminders: Models.instance.reminders.getReminders(
                        -			period: period.name,
                        -			dayName: day.name,
                        -			subject: subject?.name,
                        -		),
                        -		activity: period.activity,
                        -	);
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassList/headerText.html b/docs/widgets/ClassList/headerText.html deleted file mode 100644 index ea21052a8..000000000 --- a/docs/widgets/ClassList/headerText.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - headerText property - ClassList class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        headerText
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        headerText property - Null safety -

                        - -
                        - String? - headerText -
                        final
                        - -
                        - -
                        -

                        The header for this list. May be null.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final String? headerText;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassList/periods.html b/docs/widgets/ClassList/periods.html deleted file mode 100644 index 8fd790f03..000000000 --- a/docs/widgets/ClassList/periods.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - periods property - ClassList class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        periods
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        periods property - Null safety -

                        - -
                        - Iterable<Period> - periods -
                        final
                        - -
                        - -
                        -

                        A list of periods for today.

                        -

                        Comes from using day with User.getPeriods.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Iterable<Period> periods;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassPanel-class.html b/docs/widgets/ClassPanel-class.html deleted file mode 100644 index bb4c17b5e..000000000 --- a/docs/widgets/ClassPanel-class.html +++ /dev/null @@ -1,463 +0,0 @@ - - - - - - - - ClassPanel class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ClassPanel
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ClassPanel class - Null safety - -

                        - - -
                        -

                        An ExpansionTile for an individual period in a list.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - ClassPanel({required String title, required List<String> children, required List<int> reminders, Activity? activity}) -
                        -
                        - Creates a widget to represent a period. -
                        const
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - activity - Activity? - -
                        -
                        - An activity for this period. -
                        final
                        - -
                        - -
                        - children - → List<String> - -
                        -
                        - A list of descriptive strings about the period. [...] -
                        final
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - reminders - → List<int> - -
                        -
                        - A list of reminders for this period. [...] -
                        final
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        - title - → String - -
                        -
                        - The title for this panel. [...] -
                        final
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - createElement() - StatelessElement - - - -
                        -
                        - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassPanel/ClassPanel.html b/docs/widgets/ClassPanel/ClassPanel.html deleted file mode 100644 index 529218bb2..000000000 --- a/docs/widgets/ClassPanel/ClassPanel.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - ClassPanel constructor - ClassPanel class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ClassPanel
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ClassPanel constructor - Null safety -

                        - -
                        const - ClassPanel(
                        1. {required String title,
                        2. -
                        3. required List<String> children,
                        4. -
                        5. required List<int> reminders,
                        6. -
                        7. Activity? activity}
                        8. -
                        ) -
                        - - -
                        -

                        Creates a widget to represent a period.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const ClassPanel ({
                        -	required this.title,
                        -	required this.children,
                        -	required this.reminders,
                        -	this.activity,
                        -});
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassPanel/activity.html b/docs/widgets/ClassPanel/activity.html deleted file mode 100644 index 2e2670441..000000000 --- a/docs/widgets/ClassPanel/activity.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - activity property - ClassPanel class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        activity
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        activity property - Null safety -

                        - -
                        - Activity? - activity -
                        final
                        - -
                        - -
                        -

                        An activity for this period.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final Activity? activity;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassPanel/build.html b/docs/widgets/ClassPanel/build.html deleted file mode 100644 index 4a7d368ee..000000000 --- a/docs/widgets/ClassPanel/build.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - - - build method - ClassPanel class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                        -

                        The implementation of this method must only depend on:

                        - -

                        If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                        -

                        See also:

                        -
                          -
                        • StatelessWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Widget build (BuildContext context) => ExpansionTile (
                        -	title: SizedBox (
                        -		height: 50,
                        -		child: Center (
                        -			child: ListTile (
                        -				title: Text (title),
                        -				contentPadding: EdgeInsets.zero,
                        -				trailing: reminders.isEmpty ? null : const Icon(Icons.note),
                        -				leading: activity == null ? null : const Icon(Icons.announcement),
                        -			)
                        -		)
                        -	),
                        -	children: [
                        -		Padding (
                        -			padding: const EdgeInsets.only(left: 30),
                        -			child: Align (
                        -				alignment: Alignment.centerLeft,
                        -				child: Column (
                        -					crossAxisAlignment: CrossAxisAlignment.start,
                        -					children: [
                        -						for (final String label in children)
                        -							Padding (
                        -								padding: const EdgeInsets.symmetric(vertical: 5),
                        -								child: LinkText(
                        -									label,
                        -									shouldTrimParams: true,
                        -									linkStyle: const TextStyle(color: Color(0xff0000EE))
                        -								)
                        -							),
                        -						if (activity != null)
                        -							ActivityTile(activity!),  // already checked for null
                        -						for (final int index in reminders)
                        -							ReminderTile (
                        -								index: index,
                        -								height: 60,
                        -							)
                        -					]
                        -				)
                        -			)
                        -		)
                        -	]
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassPanel/children.html b/docs/widgets/ClassPanel/children.html deleted file mode 100644 index 3eb1c23e5..000000000 --- a/docs/widgets/ClassPanel/children.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - children property - ClassPanel class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        children
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        children property - Null safety -

                        - -
                        - List<String> - children -
                        final
                        - -
                        - -
                        -

                        A list of descriptive strings about the period.

                        -

                        Can include the time, room, or teacher of the period. Really any property -of Period is good.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final List<String> children;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassPanel/reminders.html b/docs/widgets/ClassPanel/reminders.html deleted file mode 100644 index 10f1e1707..000000000 --- a/docs/widgets/ClassPanel/reminders.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - reminders property - ClassPanel class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        reminders
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        reminders property - Null safety -

                        - -
                        - List<int> - reminders -
                        final
                        - -
                        - -
                        -

                        A list of reminders for this period.

                        -

                        This list holds the indices of the reminders for this period in -Reminders.reminders.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final List<int> reminders;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ClassPanel/title.html b/docs/widgets/ClassPanel/title.html deleted file mode 100644 index 0ecc6018b..000000000 --- a/docs/widgets/ClassPanel/title.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - title property - ClassPanel class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        title
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        title property - Null safety -

                        - -
                        - String - title -
                        final
                        - -
                        - -
                        -

                        The title for this panel.

                        -

                        It should be the name of the period (usually a number).

                        -
                        - - -
                        -

                        Implementation

                        -
                        final String title;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Footer-class.html b/docs/widgets/Footer-class.html deleted file mode 100644 index 0d1011c6d..000000000 --- a/docs/widgets/Footer-class.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - - - - - Footer class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Footer
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Footer class - Null safety - -

                        - - -
                        -

                        A footer to display all around the app.

                        -

                        The footer displays the next period, and alerts the user if there is a -reminder or activity.

                        -

                        The footer should be displayed on every page where the current schedule is -not being shown.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        - -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - createElement() - StatelessElement - - - -
                        -
                        - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - - -
                        -

                        Constants

                        - -
                        -
                        - textScale - → const double - - -
                        -
                        - A scale factor for the footer text. - - -
                        - 1.25 -
                        -
                        - -
                        -
                        - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Footer/Footer.html b/docs/widgets/Footer/Footer.html deleted file mode 100644 index 19dc75fc2..000000000 --- a/docs/widgets/Footer/Footer.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - Footer constructor - Footer class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Footer
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Footer constructor - Null safety -

                        - -
                        - Footer() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Footer/build.html b/docs/widgets/Footer/build.html deleted file mode 100644 index 7c97cd62e..000000000 --- a/docs/widgets/Footer/build.html +++ /dev/null @@ -1,243 +0,0 @@ - - - - - - - - build method - Footer class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                        -

                        The implementation of this method must only depend on:

                        - -

                        If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                        -

                        See also:

                        -
                          -
                        • StatelessWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -Widget build (BuildContext context) => ModelListener<ScheduleModel>(
                        -	model: () => Models.instance.schedule,
                        -	dispose: false,
                        -	// ignore: sort_child_properties_last
                        -	child: Container(height: 0, width: 0),
                        -	builder: (_, ScheduleModel schedule, Widget? blank) =>
                        -		schedule.nextPeriod == null ? blank! : BottomSheet (
                        -			enableDrag: false,
                        -			onClosing: () {},
                        -			builder: (BuildContext context) => GestureDetector(
                        -				onTap: !Models.instance.reminders.hasNextReminder ? null :
                        -					() {
                        -						final NavigatorState nav = Navigator.of(context);
                        -						if (nav.canPop()) {
                        -							nav.pop();
                        -						}
                        -						nav.pushReplacementNamed(Routes.home);
                        -					},
                        -				child: SizedBox (
                        -					height: 70,
                        -					child: Align (
                        -						child: Column (
                        -							mainAxisAlignment: MainAxisAlignment.center,
                        -							children: [
                        -								Text (
                        -									// ternary already checked for schedule.nextPeriod == null
                        -									"Next: ${schedule.nextPeriod!.getName(schedule.nextSubject)}",
                        -									textScaleFactor: textScale
                        -								),
                        -								Text (
                        -									// ternary already checked for schedule.nextPeriod == null
                        -									(schedule.nextPeriod!
                        -										.getInfo(schedule.nextSubject)
                        -										..removeWhere(
                        -											(String str) => (
                        -												str.startsWith("Period: ") ||
                        -												str.startsWith("Teacher: ")
                        -											)
                        -										)
                        -									).join (". "),
                        -									textScaleFactor: textScale,
                        -								),
                        -								if (schedule.nextPeriod?.activity != null)
                        -									const Text("There is an activity"),
                        -								if (Models.instance.reminders.hasNextReminder)
                        -									const Text ("Click to see reminder"),
                        -							]
                        -						)
                        -					)
                        -				)
                        -			)
                        -		)
                        -	);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Footer/textScale-constant.html b/docs/widgets/Footer/textScale-constant.html deleted file mode 100644 index 3ce6666f3..000000000 --- a/docs/widgets/Footer/textScale-constant.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - textScale constant - Footer class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        textScale
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        textScale constant - Null safety -

                        - -
                        - double - const textScale - - -
                        - -
                        -

                        A scale factor for the footer text.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const double textScale = 1.25;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo-class.html b/docs/widgets/LayoutInfo-class.html deleted file mode 100644 index 5eaa1f7eb..000000000 --- a/docs/widgets/LayoutInfo-class.html +++ /dev/null @@ -1,395 +0,0 @@ - - - - - - - - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        LayoutInfo
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        LayoutInfo class - Null safety - -

                        - - -
                        -

                        Provides info about how this scaffold should be laid out.

                        -

                        Uses getWindowType from Material's adaptive_breakpoints package to -determine which layout should be built and exposes getters such as -hasNavRail to define how the layout should look.

                        -
                        - - -
                        -
                        - - - - - -
                        Annotations
                        -
                        -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - LayoutInfo(BuildContext context) -
                        -
                        - Stores info about the layout based on Material Design breakpoints. -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hasBottomNavBar - → bool - -
                        -
                        - Whether the app should use a BottomNavigationBar. -
                        read-only
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - hasNavRail - → bool - -
                        -
                        - Whether the app should use a NavigationRail. -
                        read-only
                        - -
                        - -
                        - hasStandardDrawer - → bool - -
                        -
                        - Whether the app should have a persistent Drawer. -
                        read-only
                        - -
                        - -
                        - hasStandardSideSheet - → bool - -
                        -
                        - Whether the app should have a persistent Scaffold.endDrawer. -
                        read-only
                        - -
                        - -
                        - isDesktop - → bool - -
                        -
                        - Whether the app is running on a desktop. -
                        read-only
                        - -
                        - -
                        - isMobile - → bool - -
                        -
                        - Whether the app is running on a phone. -
                        read-only
                        - -
                        - -
                        - isTabletLandscape - → bool - -
                        -
                        - Whether the app is running on a tablet in landscape mode. -
                        read-only
                        - -
                        - -
                        - isTabletPortrait - → bool - -
                        -
                        - Whether the app is running on a tablet in portrait mode (or a large phone). -
                        read-only
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        - windowType - AdaptiveWindowType - -
                        -
                        - The breakpoint as defined by material.io -
                        final
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/LayoutInfo.html b/docs/widgets/LayoutInfo/LayoutInfo.html deleted file mode 100644 index 49734d1de..000000000 --- a/docs/widgets/LayoutInfo/LayoutInfo.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - LayoutInfo constructor - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        LayoutInfo
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        LayoutInfo constructor - Null safety -

                        - -
                        - LayoutInfo(
                        1. BuildContext context
                        2. -
                        ) -
                        - - -
                        -

                        Stores info about the layout based on Material Design breakpoints.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        LayoutInfo(BuildContext context) :
                        -	windowType = getWindowType(context);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/hasBottomNavBar.html b/docs/widgets/LayoutInfo/hasBottomNavBar.html deleted file mode 100644 index 53b9302eb..000000000 --- a/docs/widgets/LayoutInfo/hasBottomNavBar.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - hasBottomNavBar property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hasBottomNavBar
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        hasBottomNavBar property - Null safety -

                        - - - -
                        - -
                        - bool - hasBottomNavBar - - -
                        - - -
                        -

                        Whether the app should use a BottomNavigationBar.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool get hasBottomNavBar => isMobile;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/hasNavRail.html b/docs/widgets/LayoutInfo/hasNavRail.html deleted file mode 100644 index f436d7d17..000000000 --- a/docs/widgets/LayoutInfo/hasNavRail.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - hasNavRail property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hasNavRail
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        hasNavRail property - Null safety -

                        - - - -
                        - -
                        - bool - hasNavRail - - -
                        - - -
                        -

                        Whether the app should use a NavigationRail.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool get hasNavRail => isTabletPortrait || isTabletLandscape;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/hasStandardDrawer.html b/docs/widgets/LayoutInfo/hasStandardDrawer.html deleted file mode 100644 index 9dd8c5889..000000000 --- a/docs/widgets/LayoutInfo/hasStandardDrawer.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - hasStandardDrawer property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hasStandardDrawer
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        hasStandardDrawer property - Null safety -

                        - - - -
                        - -
                        - bool - hasStandardDrawer - - -
                        - - -
                        -

                        Whether the app should have a persistent Drawer.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool get hasStandardDrawer => isDesktop;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/hasStandardSideSheet.html b/docs/widgets/LayoutInfo/hasStandardSideSheet.html deleted file mode 100644 index a4f0a6c10..000000000 --- a/docs/widgets/LayoutInfo/hasStandardSideSheet.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - hasStandardSideSheet property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hasStandardSideSheet
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        hasStandardSideSheet property - Null safety -

                        - - - -
                        - -
                        - bool - hasStandardSideSheet - - -
                        - - -
                        -

                        Whether the app should have a persistent Scaffold.endDrawer.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool get hasStandardSideSheet => isTabletLandscape || isDesktop;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/hashCode.html b/docs/widgets/LayoutInfo/hashCode.html deleted file mode 100644 index 7ea84590c..000000000 --- a/docs/widgets/LayoutInfo/hashCode.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - hashCode property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/isDesktop.html b/docs/widgets/LayoutInfo/isDesktop.html deleted file mode 100644 index e26da5627..000000000 --- a/docs/widgets/LayoutInfo/isDesktop.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - isDesktop property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isDesktop
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isDesktop property - Null safety -

                        - - - -
                        - -
                        - bool - isDesktop - - -
                        - - -
                        -

                        Whether the app is running on a desktop.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool get isDesktop => windowType == AdaptiveWindowType.large
                        -	|| windowType == AdaptiveWindowType.xlarge;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/isMobile.html b/docs/widgets/LayoutInfo/isMobile.html deleted file mode 100644 index 267270bca..000000000 --- a/docs/widgets/LayoutInfo/isMobile.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - isMobile property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isMobile
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isMobile property - Null safety -

                        - - - -
                        - -
                        - bool - isMobile - - -
                        - - -
                        -

                        Whether the app is running on a phone.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool get isMobile => windowType == AdaptiveWindowType.xsmall;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/isTabletLandscape.html b/docs/widgets/LayoutInfo/isTabletLandscape.html deleted file mode 100644 index 216a4190d..000000000 --- a/docs/widgets/LayoutInfo/isTabletLandscape.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - isTabletLandscape property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isTabletLandscape
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isTabletLandscape property - Null safety -

                        - - - -
                        - -
                        - bool - isTabletLandscape - - -
                        - - -
                        -

                        Whether the app is running on a tablet in landscape mode.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool get isTabletLandscape => windowType == AdaptiveWindowType.medium;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/isTabletPortrait.html b/docs/widgets/LayoutInfo/isTabletPortrait.html deleted file mode 100644 index 652887ebd..000000000 --- a/docs/widgets/LayoutInfo/isTabletPortrait.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - isTabletPortrait property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        isTabletPortrait
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        isTabletPortrait property - Null safety -

                        - - - -
                        - -
                        - bool - isTabletPortrait - - -
                        - - -
                        -

                        Whether the app is running on a tablet in portrait mode (or a large phone).

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool get isTabletPortrait => windowType == AdaptiveWindowType.small;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/noSuchMethod.html b/docs/widgets/LayoutInfo/noSuchMethod.html deleted file mode 100644 index 6cf1efbe6..000000000 --- a/docs/widgets/LayoutInfo/noSuchMethod.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - noSuchMethod method - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/operator_equals.html b/docs/widgets/LayoutInfo/operator_equals.html deleted file mode 100644 index 2d279f309..000000000 --- a/docs/widgets/LayoutInfo/operator_equals.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - operator == method - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/runtimeType.html b/docs/widgets/LayoutInfo/runtimeType.html deleted file mode 100644 index e6a14e096..000000000 --- a/docs/widgets/LayoutInfo/runtimeType.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - runtimeType property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/toString.html b/docs/widgets/LayoutInfo/toString.html deleted file mode 100644 index 0900915eb..000000000 --- a/docs/widgets/LayoutInfo/toString.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - toString method - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - -
                        inherited
                        - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external String toString();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LayoutInfo/windowType.html b/docs/widgets/LayoutInfo/windowType.html deleted file mode 100644 index 950aa606c..000000000 --- a/docs/widgets/LayoutInfo/windowType.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - windowType property - LayoutInfo class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        windowType
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        windowType property - Null safety -

                        - -
                        - AdaptiveWindowType - windowType -
                        final
                        - -
                        - -
                        -

                        The breakpoint as defined by material.io

                        -
                        - - -
                        -

                        Implementation

                        -
                        final AdaptiveWindowType windowType;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LinkIcon-class.html b/docs/widgets/LinkIcon-class.html deleted file mode 100644 index c294e3a05..000000000 --- a/docs/widgets/LinkIcon-class.html +++ /dev/null @@ -1,439 +0,0 @@ - - - - - - - - LinkIcon class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        LinkIcon
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        LinkIcon class - Null safety - -

                        - - -
                        -

                        An icon that opens a link when tapped.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - LinkIcon({required String path, required String url}) -
                        -
                        - Creates an icon that opens a web page. -
                        const
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - path - → String - -
                        -
                        - The image to show as the icon. -
                        final
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        - url - → String - -
                        -
                        - The URL to open when tapped. -
                        final
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - createElement() - StatelessElement - - - -
                        -
                        - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LinkIcon/LinkIcon.html b/docs/widgets/LinkIcon/LinkIcon.html deleted file mode 100644 index 05c3f1e00..000000000 --- a/docs/widgets/LinkIcon/LinkIcon.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - LinkIcon constructor - LinkIcon class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        LinkIcon
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        LinkIcon constructor - Null safety -

                        - -
                        const - LinkIcon(
                        1. {required String path,
                        2. -
                        3. required String url}
                        4. -
                        ) -
                        - - -
                        -

                        Creates an icon that opens a web page.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const LinkIcon ({required this.path, required this.url});
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LinkIcon/build.html b/docs/widgets/LinkIcon/build.html deleted file mode 100644 index 51447c8ac..000000000 --- a/docs/widgets/LinkIcon/build.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - build method - LinkIcon class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                        -

                        The implementation of this method must only depend on:

                        - -

                        If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                        -

                        See also:

                        -
                          -
                        • StatelessWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override Widget build(BuildContext context) => IconButton (
                        -	iconSize: 45,
                        -	onPressed: () => launch (url),
                        -	icon: CircleAvatar(backgroundImage: AssetImage(path)),
                        -);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LinkIcon/path.html b/docs/widgets/LinkIcon/path.html deleted file mode 100644 index ca5956900..000000000 --- a/docs/widgets/LinkIcon/path.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - path property - LinkIcon class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        path
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        path property - Null safety -

                        - -
                        - String - path -
                        final
                        - -
                        - -
                        -

                        The image to show as the icon.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final String path;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LinkIcon/url.html b/docs/widgets/LinkIcon/url.html deleted file mode 100644 index dae8122e6..000000000 --- a/docs/widgets/LinkIcon/url.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - url property - LinkIcon class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        url
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        url property - Null safety -

                        - -
                        - String - url -
                        final
                        - -
                        - -
                        -

                        The URL to open when tapped.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final String url;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImage-class.html b/docs/widgets/LoadingImage-class.html deleted file mode 100644 index a077e9dbf..000000000 --- a/docs/widgets/LoadingImage-class.html +++ /dev/null @@ -1,461 +0,0 @@ - - - - - - - - LoadingImage class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        LoadingImage
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        LoadingImage class - Null safety - -

                        - - -
                        -

                        An image that displays a CircularProgressIndicator while loading.

                        -

                        This widget helps keep the same shape as the image so that when the image -finishes loading the other widgets won't move around. This is accomplished -by providing the aspect ratio of the image. To get the aspect ratio, if -it's not already known, there is a two-step process:

                        -

                        Setup:

                        -
                          -
                        1. Install devtools: flutter packages pub global activate devtools
                        2. -
                        3. Start devtools: flutter packages pub global run devtools
                        4. -
                        5. Start app: flutter run --track-widget-creation
                        6. -
                        7. Open the URL devtools gives with the URL from flutter
                        8. -
                        -

                        Usage:

                        -
                          -
                        1. Replace Image.asset with LoadingImage(String path)
                        2. -
                        3. In devTools: -
                            -
                          1. Go to the corresponding LoadingImage widget
                          2. -
                          3. Expand Image.semantics.renderObject.size
                          4. -
                          -
                        4. -
                        5. Enter the aspect ratio as parameters to LoadingImage() constructor
                        6. -
                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - LoadingImage({required ImageProvider<Object> image, required double? aspectRatio}) -
                        -
                        - Creates an image with a placeholder while it loads. -
                        const
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - aspectRatio - → double? - -
                        -
                        - The aspect ratio of the image. [...] -
                        final
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - image - ImageProvider<Object> - -
                        -
                        - The image being loaded. -
                        final
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - createElement() - StatefulElement - - - -
                        -
                        - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - createState() - LoadingImageState - - - -
                        -
                        - Creates the mutable state for this widget at a given location in the tree. [...] -
                        override
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImage/LoadingImage.html b/docs/widgets/LoadingImage/LoadingImage.html deleted file mode 100644 index 4ea728279..000000000 --- a/docs/widgets/LoadingImage/LoadingImage.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - LoadingImage constructor - LoadingImage class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        LoadingImage
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        LoadingImage constructor - Null safety -

                        - -
                        const - LoadingImage(
                        1. {required ImageProvider<Object> image,
                        2. -
                        3. required double? aspectRatio}
                        4. -
                        ) -
                        - - -
                        -

                        Creates an image with a placeholder while it loads.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        const LoadingImage({
                        -	required this.image,
                        -	required this.aspectRatio
                        -});
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImage/aspectRatio.html b/docs/widgets/LoadingImage/aspectRatio.html deleted file mode 100644 index baacf284a..000000000 --- a/docs/widgets/LoadingImage/aspectRatio.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - aspectRatio property - LoadingImage class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        aspectRatio
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        aspectRatio property - Null safety -

                        - -
                        - double? - aspectRatio -
                        final
                        - -
                        - -
                        -

                        The aspect ratio of the image.

                        -

                        This is used to size the CircularProgressIndicator so that it is -roughly the same size as the image will be when it loads.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final double? aspectRatio;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImage/createState.html b/docs/widgets/LoadingImage/createState.html deleted file mode 100644 index aa80a5696..000000000 --- a/docs/widgets/LoadingImage/createState.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - createState method - LoadingImage class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        createState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        createState method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -LoadingImageState -createState() - -
                        override
                        - -
                        - -
                        -

                        Creates the mutable state for this widget at a given location in the tree.

                        -

                        Subclasses should override this method to return a newly created -instance of their associated State subclass:

                        -
                        @override
                        -_MyState createState() => _MyState();
                        -
                        -

                        The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override
                        -LoadingImageState createState() => LoadingImageState();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImage/image.html b/docs/widgets/LoadingImage/image.html deleted file mode 100644 index 13b1cefc5..000000000 --- a/docs/widgets/LoadingImage/image.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - image property - LoadingImage class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        image
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        image property - Null safety -

                        - -
                        - ImageProvider<Object> - image -
                        final
                        - -
                        - -
                        -

                        The image being loaded.

                        -
                        - - -
                        -

                        Implementation

                        -
                        final ImageProvider image;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImageState-class.html b/docs/widgets/LoadingImageState-class.html deleted file mode 100644 index c65f01416..000000000 --- a/docs/widgets/LoadingImageState-class.html +++ /dev/null @@ -1,543 +0,0 @@ - - - - - - - - LoadingImageState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        LoadingImageState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        LoadingImageState class - Null safety - -

                        - - -
                        -

                        A state for a LoadingImage.

                        -

                        This state handles loading the image in the background and switching -out the placeholder animation with the actual image when it loads.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - LoadingImageState() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - aspectRatio - ↔ double - -
                        -
                        - The aspect ratio of the image. -
                        read / write
                        - -
                        - -
                        - context - BuildContext - -
                        -
                        - The location in the tree where this widget builds. [...] -
                        read-only, inherited
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - listener - ImageStreamListener - -
                        -
                        - A listener that will notify when the image has loaded. -
                        read / write
                        - -
                        - -
                        - loading - ↔ bool - -
                        -
                        - Whether the image is still loading. -
                        read / write
                        - -
                        - -
                        - mounted - → bool - -
                        -
                        - Whether this State object is currently in a tree. [...] -
                        read-only, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        - stream - ImageStream - -
                        -
                        - The stream of bytes in the image. -
                        read / write
                        - -
                        - -
                        - widget - LoadingImage - -
                        -
                        - The current configuration. [...] -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - build(BuildContext context) - Widget - - - -
                        -
                        - Describes the part of the user interface represented by this widget. [...] -
                        override
                        - -
                        - -
                        - deactivate() - → void - - - -
                        -
                        - Called when this object is removed from the tree. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - didChangeDependencies() - → void - - - -
                        -
                        - Called when a dependency of this State object changes. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - didUpdateWidget(covariant LoadingImage oldWidget) - → void - - - -
                        -
                        - Called whenever the widget configuration changes. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - dispose() - → void - - - -
                        -
                        - Called when this object is removed from the tree permanently. [...] -
                        override
                        - -
                        - -
                        - initState() - → void - - - -
                        -
                        - Called when this object is inserted into the tree. [...] -
                        override
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - onLoad(ImageInfo info, bool _) - → void - - - -
                        -
                        - Rebuilds the widget tree to include the image. [...] - - -
                        - -
                        - reassemble() - → void - - - -
                        -
                        - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                        @mustCallSuper, @protected, inherited
                        - -
                        - -
                        - setState(VoidCallback fn) - → void - - - -
                        -
                        - Notify the framework that the internal state of this object has changed. [...] -
                        @protected, inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImageState/LoadingImageState.html b/docs/widgets/LoadingImageState/LoadingImageState.html deleted file mode 100644 index c1cfc2bd6..000000000 --- a/docs/widgets/LoadingImageState/LoadingImageState.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - LoadingImageState constructor - LoadingImageState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        LoadingImageState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        LoadingImageState constructor - Null safety -

                        - -
                        - LoadingImageState() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImageState/aspectRatio.html b/docs/widgets/LoadingImageState/aspectRatio.html deleted file mode 100644 index fbee2c9c6..000000000 --- a/docs/widgets/LoadingImageState/aspectRatio.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - aspectRatio property - LoadingImageState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        aspectRatio
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        aspectRatio property - Null safety -

                        - -
                        - double - aspectRatio -
                        read / write
                        - -
                        - -
                        -

                        The aspect ratio of the image.

                        -
                        - - -
                        -

                        Implementation

                        -
                        late double aspectRatio;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImageState/build.html b/docs/widgets/LoadingImageState/build.html deleted file mode 100644 index 1b74fe1d0..000000000 --- a/docs/widgets/LoadingImageState/build.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - - build method - LoadingImageState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        build
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        build method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -Widget -build(
                        1. BuildContext context
                        2. -
                        ) - -
                        override
                        - -
                        - -
                        -

                        Describes the part of the user interface represented by this widget.

                        -

                        The framework calls this method in a number of different situations. For -example:

                        - -

                        This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                        -

                        The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                        -

                        Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                        -

                        The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                        -

                        Design discussion

                        -

                        Why is the build method on State, and not StatefulWidget?

                        -

                        Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                        -

                        For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                        -

                        Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                        -

                        Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                        -
                        class MyButton extends StatefulWidget {
                        -  ...
                        -  final Color color;
                        -
                        -  @override
                        -  Widget build(BuildContext context, MyButtonState state) {
                        -    ... () { print("color: $color"); } ...
                        -  }
                        -}
                        -
                        -

                        For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                        -

                        In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                        -
                        class MyButtonState extends State<MyButton> {
                        -  ...
                        -  @override
                        -  Widget build(BuildContext context) {
                        -    ... () { print("color: ${widget.color}"); } ...
                        -  }
                        -}
                        -
                        -

                        Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                        -

                        See also:

                        -
                          -
                        • StatefulWidget, which contains the discussion on performance considerations.
                        • -
                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override Widget build(BuildContext context) => loading
                        -	? AspectRatio (
                        -		aspectRatio: widget.aspectRatio ?? 1,
                        -		child: const Center (child: CircularProgressIndicator()),
                        -	)
                        -	: AspectRatio (
                        -		aspectRatio: aspectRatio,
                        -		child: Image (image: widget.image)
                        -	);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImageState/dispose.html b/docs/widgets/LoadingImageState/dispose.html deleted file mode 100644 index 71b4c1f75..000000000 --- a/docs/widgets/LoadingImageState/dispose.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - dispose method - LoadingImageState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        dispose
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        dispose method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -void -dispose() - -
                        override
                        - -
                        - -
                        -

                        Called when this object is removed from the tree permanently.

                        -

                        The framework calls this method when this State object will never -build again. After the framework calls dispose, the State object is -considered unmounted and the mounted property is false. It is an error -to call setState at this point. This stage of the lifecycle is terminal: -there is no way to remount a State object that has been disposed.

                        -

                        Subclasses should override this method to release any resources retained -by this object (e.g., stop any active animations).

                        -

                        If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                        -
                          -
                        • In initState, subscribe to the object.
                        • -
                        • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                        • -
                        • In dispose, unsubscribe from the object.
                        • -
                        -

                        If you override this, make sure to end your method with a call to -super.dispose().

                        -

                        See also:

                        - -
                        - - - -
                        -

                        Implementation

                        -
                        @override void dispose () {
                        -	stream.removeListener(listener);
                        -	super.dispose();
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImageState/initState.html b/docs/widgets/LoadingImageState/initState.html deleted file mode 100644 index 679288520..000000000 --- a/docs/widgets/LoadingImageState/initState.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - initState method - LoadingImageState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        initState
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        initState method - Null safety -

                        - -
                        - -
                        -
                          -
                        1. @override
                        2. -
                        -
                        - -void -initState() - -
                        override
                        - -
                        - -
                        -

                        Called when this object is inserted into the tree.

                        -

                        The framework will call this method exactly once for each State object -it creates.

                        -

                        Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                        -

                        If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                        -
                          -
                        • In initState, subscribe to the object.
                        • -
                        • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                        • -
                        • In dispose, unsubscribe from the object.
                        • -
                        -

                        You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                        -

                        If you override this, make sure your method starts with a call to -super.initState().

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @override void initState() {
                        -	super.initState();
                        -	stream = widget.image.resolve(const ImageConfiguration());
                        -	listener = ImageStreamListener(onLoad);
                        -	stream.addListener(listener);
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImageState/listener.html b/docs/widgets/LoadingImageState/listener.html deleted file mode 100644 index fa7ffa2c0..000000000 --- a/docs/widgets/LoadingImageState/listener.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - listener property - LoadingImageState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        listener
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        listener property - Null safety -

                        - -
                        - ImageStreamListener - listener -
                        read / write
                        - -
                        - -
                        -

                        A listener that will notify when the image has loaded.

                        -
                        - - -
                        -

                        Implementation

                        -
                        late ImageStreamListener listener;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImageState/loading.html b/docs/widgets/LoadingImageState/loading.html deleted file mode 100644 index d875fa395..000000000 --- a/docs/widgets/LoadingImageState/loading.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - loading property - LoadingImageState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        loading
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        loading property - Null safety -

                        - -
                        - bool - loading -
                        read / write
                        - -
                        - -
                        -

                        Whether the image is still loading.

                        -
                        - - -
                        -

                        Implementation

                        -
                        bool loading = true;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImageState/onLoad.html b/docs/widgets/LoadingImageState/onLoad.html deleted file mode 100644 index cd3d3e23a..000000000 --- a/docs/widgets/LoadingImageState/onLoad.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - onLoad method - LoadingImageState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        onLoad
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        onLoad method - Null safety -

                        - -
                        - - -void -onLoad(
                        1. ImageInfo info,
                        2. -
                        3. bool _
                        4. -
                        ) - - - -
                        - -
                        -

                        Rebuilds the widget tree to include the image.

                        -

                        Also prints out the aspect ratio as a convenience to the developer.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        // this is a Flutter function override
                        -// BUG: Check if this actually works.
                        -// ignore: avoid_positional_boolean_parameters
                        -void onLoad (ImageInfo info, bool _) {
                        -	aspectRatio = Size (
                        -		info.image.width.toDouble(),
                        -		info.image.height.toDouble()
                        -	).aspectRatio;
                        -	if (widget.aspectRatio == null) {
                        -		debugPrint("LoadingImage: Aspect ratio for ${widget.image} is $aspectRatio");
                        -	}
                        -	setState(() => loading = false);
                        -}
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/LoadingImageState/stream.html b/docs/widgets/LoadingImageState/stream.html deleted file mode 100644 index f1fe4c0fc..000000000 --- a/docs/widgets/LoadingImageState/stream.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - stream property - LoadingImageState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        stream
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        stream property - Null safety -

                        - -
                        - ImageStream - stream -
                        read / write
                        - -
                        - -
                        -

                        The stream of bytes in the image.

                        -
                        - - -
                        -

                        Implementation

                        -
                        late ImageStream stream;
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos-class.html b/docs/widgets/Logos-class.html deleted file mode 100644 index 4af9e9a00..000000000 --- a/docs/widgets/Logos-class.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - - - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Logos
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Logos class - Null safety - -

                        - - -
                        -

                        Brand logos used throughout the app.

                        -

                        Ram Life does not claim ownership of any brand -(except for the Ramaz logo).

                        -
                        - - - -
                        -

                        Constructors

                        - -
                        -
                        - Logos() -
                        -
                        - -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        read-only, inherited
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toString() - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        inherited
                        - -
                        - -
                        -
                        - - - -
                        -

                        Constants

                        - -
                        -
                        - drive - → const Widget - - -
                        -
                        - The Google Drive logo. - - -
                        - LinkIcon(path: "images/logos/drive.png", url: Urls.googleDrive) -
                        -
                        - -
                        - google - → const Widget - - -
                        -
                        - The Google logo. - - -
                        - CircleAvatar(backgroundColor: Colors.transparent, backgroundImage: AssetImage("images/logos/google_sign_in.png")) -
                        -
                        - -
                        - outlook - → const Widget - - -
                        -
                        - The Microsoft Outlook logo. - - -
                        - LinkIcon(path: "images/logos/outlook.jpg", url: Urls.email) -
                        -
                        - -
                        - ramazIcon - → const Widget - - -
                        -
                        - The Ramaz website logo. - - -
                        - LinkIcon(path: "images/logos/ramaz/teal.jpg", url: Urls.ramaz) -
                        -
                        - -
                        - schoology - → const Widget - - -
                        -
                        - The Schoology logo. - - -
                        - LinkIcon(path: "images/logos/schoology.png", url: Urls.schoology) -
                        -
                        - -
                        - seniorSystems - → const LinkIcon - - -
                        -
                        - The Senior Systems (My Backpack) logo. - - -
                        - LinkIcon(path: "images/logos/senior_systems.png", url: Urls.seniorSystems) -
                        -
                        - -
                        -
                        - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/Logos.html b/docs/widgets/Logos/Logos.html deleted file mode 100644 index 53ebd1e22..000000000 --- a/docs/widgets/Logos/Logos.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - Logos constructor - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        Logos
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        Logos constructor - Null safety -

                        - -
                        - Logos() -
                        - - - - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/drive-constant.html b/docs/widgets/Logos/drive-constant.html deleted file mode 100644 index 327fd4daa..000000000 --- a/docs/widgets/Logos/drive-constant.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - drive constant - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        drive
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        drive constant - Null safety -

                        - -
                        - Widget - const drive - - -
                        - -
                        -

                        The Google Drive logo.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const Widget drive = LinkIcon (
                        -	path: "images/logos/drive.png",
                        -	url: Urls.googleDrive
                        -);
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/google-constant.html b/docs/widgets/Logos/google-constant.html deleted file mode 100644 index 2e39a8113..000000000 --- a/docs/widgets/Logos/google-constant.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - google constant - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        google
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        google constant - Null safety -

                        - -
                        - Widget - const google - - -
                        - -
                        -

                        The Google logo.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const Widget google = CircleAvatar (
                        -	backgroundColor: Colors.transparent,
                        -	backgroundImage: AssetImage(
                        -		"images/logos/google_sign_in.png",
                        -	),
                        -);
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/hashCode.html b/docs/widgets/Logos/hashCode.html deleted file mode 100644 index 04af1ee43..000000000 --- a/docs/widgets/Logos/hashCode.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - hashCode property - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        hashCode
                        - -
                        - -
                        - - - - -
                        -
                        -

                        hashCode property - Null safety -

                        - - - -
                        - -
                        - int - hashCode -
                        inherited
                        - -
                        - - -
                        -

                        The hash code for this object.

                        -

                        A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                        -

                        All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                        -

                        If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                        -

                        Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                        -

                        Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                        -

                        If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external int get hashCode;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/noSuchMethod.html b/docs/widgets/Logos/noSuchMethod.html deleted file mode 100644 index 772544640..000000000 --- a/docs/widgets/Logos/noSuchMethod.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - noSuchMethod method - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        noSuchMethod
                        - -
                        - -
                        - - - - -
                        -
                        -

                        noSuchMethod method - Null safety -

                        - -
                        - - -dynamic -noSuchMethod(
                        1. Invocation invocation
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        Invoked when a non-existent method or property is accessed.

                        -

                        A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                        -
                        dynamic object = 1;
                        -object.add(42); // Statically allowed, run-time error
                        -
                        -

                        This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                        -

                        Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                        -

                        A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                        -
                        class MockList<T> implements List<T> {
                        -  noSuchMethod(Invocation invocation) {
                        -    log(invocation);
                        -    super.noSuchMethod(invocation); // Will throw.
                        -  }
                        -}
                        -void main() {
                        -  MockList().add(42);
                        -}
                        -
                        -

                        This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                        -

                        If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                        -

                        The default behavior is to throw a NoSuchMethodError.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        @pragma("vm:entry-point")
                        -external dynamic noSuchMethod(Invocation invocation);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/operator_equals.html b/docs/widgets/Logos/operator_equals.html deleted file mode 100644 index f2cc6720c..000000000 --- a/docs/widgets/Logos/operator_equals.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - operator == method - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        operator ==
                        - -
                        - -
                        - - - - -
                        -
                        -

                        operator == method - Null safety -

                        - -
                        - - -bool -operator ==(
                        1. Object other
                        2. -
                        ) - -
                        inherited
                        - -
                        - -
                        -

                        The equality operator.

                        -

                        The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                        -

                        Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                        -
                          -
                        • -

                          Total: It must return a boolean for all arguments. It should never throw.

                          -
                        • -
                        • -

                          Reflexive: For all objects o, o == o must be true.

                          -
                        • -
                        • -

                          Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                          -
                        • -
                        • -

                          Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                          -
                        • -
                        -

                        The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                        -

                        If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external bool operator ==(Object other);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/outlook-constant.html b/docs/widgets/Logos/outlook-constant.html deleted file mode 100644 index 97cbf0673..000000000 --- a/docs/widgets/Logos/outlook-constant.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - outlook constant - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        outlook
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        outlook constant - Null safety -

                        - -
                        - Widget - const outlook - - -
                        - -
                        -

                        The Microsoft Outlook logo.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const Widget outlook = LinkIcon (
                        -	path: "images/logos/outlook.jpg",
                        -	url: Urls.email
                        -);
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/ramazIcon-constant.html b/docs/widgets/Logos/ramazIcon-constant.html deleted file mode 100644 index 3d676dc14..000000000 --- a/docs/widgets/Logos/ramazIcon-constant.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - ramazIcon constant - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ramazIcon
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ramazIcon constant - Null safety -

                        - -
                        - Widget - const ramazIcon - - -
                        - -
                        -

                        The Ramaz website logo.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const Widget ramazIcon = LinkIcon (
                        -	path: "images/logos/ramaz/teal.jpg",
                        -	url: Urls.ramaz
                        -);
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/runtimeType.html b/docs/widgets/Logos/runtimeType.html deleted file mode 100644 index 1dd95d1d3..000000000 --- a/docs/widgets/Logos/runtimeType.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - runtimeType property - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        runtimeType
                        - -
                        - -
                        - - - - -
                        -
                        -

                        runtimeType property - Null safety -

                        - - - -
                        - -
                        - Type - runtimeType -
                        inherited
                        - -
                        - - -
                        -

                        A representation of the runtime type of the object.

                        -
                        - - -
                        -

                        Implementation

                        -
                        external Type get runtimeType;
                        -
                        - -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/schoology-constant.html b/docs/widgets/Logos/schoology-constant.html deleted file mode 100644 index f5982a041..000000000 --- a/docs/widgets/Logos/schoology-constant.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - schoology constant - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        schoology
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        schoology constant - Null safety -

                        - -
                        - Widget - const schoology - - -
                        - -
                        -

                        The Schoology logo.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const Widget schoology = LinkIcon (
                        -	path: "images/logos/schoology.png",
                        -	url: Urls.schoology
                        -);
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/seniorSystems-constant.html b/docs/widgets/Logos/seniorSystems-constant.html deleted file mode 100644 index c616a3e9d..000000000 --- a/docs/widgets/Logos/seniorSystems-constant.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - seniorSystems constant - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        seniorSystems
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        seniorSystems constant - Null safety -

                        - -
                        - LinkIcon - const seniorSystems - - -
                        - -
                        -

                        The Senior Systems (My Backpack) logo.

                        -
                        - - -
                        -

                        Implementation

                        -
                        static const seniorSystems = LinkIcon (
                        -	path: "images/logos/senior_systems.png",
                        -	url: Urls.seniorSystems
                        -);
                        -
                        -
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/Logos/toString.html b/docs/widgets/Logos/toString.html deleted file mode 100644 index bb6191c87..000000000 --- a/docs/widgets/Logos/toString.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - toString method - Logos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        toString
                        - -
                        - -
                        - - - - -
                        -
                        -

                        toString method - Null safety -

                        - -
                        - - -String -toString() - -
                        inherited
                        - -
                        - -
                        -

                        A string representation of this object.

                        -

                        Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                        -

                        Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                        -
                        - - - -
                        -

                        Implementation

                        -
                        external String toString();
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ModelBuilder.html b/docs/widgets/ModelBuilder.html deleted file mode 100644 index bf7952425..000000000 --- a/docs/widgets/ModelBuilder.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - ModelBuilder typedef - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ModelBuilder
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ModelBuilder<T extends ChangeNotifier> typedef - Null safety - -

                        - -
                        - - - -Widget -ModelBuilder<T>(
                        1. BuildContext context,
                        2. -
                        3. T model,
                        4. -
                        5. Widget? child
                        6. -
                        ) - - -
                        - - -
                        -

                        A function to build a widget with a ChangeNotifier subclass.

                        -
                        - - -
                        -

                        Implementation

                        -
                        typedef ModelBuilder<T extends ChangeNotifier> =
                        -  Widget Function(BuildContext context, T model, Widget? child);
                        -
                        - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ModelListener-class.html b/docs/widgets/ModelListener-class.html deleted file mode 100644 index a2d80d779..000000000 --- a/docs/widgets/ModelListener-class.html +++ /dev/null @@ -1,464 +0,0 @@ - - - - - - - - ModelListener class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ModelListener
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ModelListener<Model extends ChangeNotifier> class - Null safety - -

                        - - -
                        -

                        A widget that listens to a ChangeNotifier and rebuilds the widget tree -when ChangeNotifier.notifyListeners.

                        -
                        - - -
                        -
                        -
                        Inheritance
                        -
                        - - - - - -
                        -
                        - -
                        -

                        Constructors

                        - -
                        -
                        - ModelListener({required Model model(), required ModelBuilder<Model> builder, Widget? child, bool dispose = true}) -
                        -
                        - Creates a widget that listens to a ChangeNotifier. -
                        const
                        -
                        -
                        -
                        - -
                        -

                        Properties

                        - -
                        -
                        - builder - ModelBuilder<Model> - -
                        -
                        - The function to build the widget tree underneath this. -
                        final
                        - -
                        - -
                        - child - Widget? - -
                        -
                        - An optional child to cache. [...] -
                        final
                        - -
                        - -
                        - dispose - → bool - -
                        -
                        - Whether or not to dispose the model. [...] -
                        final
                        - -
                        - -
                        - hashCode - → int - -
                        -
                        - The hash code for this object. [...] -
                        @nonVirtual, read-only, inherited
                        - -
                        - -
                        - key - Key? - -
                        -
                        - Controls how one widget replaces another widget in the tree. [...] -
                        final, inherited
                        - -
                        - -
                        - model - → Model Function() - -
                        -
                        - A function to create the model to listen to. [...] -
                        final
                        - -
                        - -
                        - runtimeType - → Type - -
                        -
                        - A representation of the runtime type of the object. -
                        read-only, inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Methods

                        -
                        -
                        - createElement() - StatefulElement - - - -
                        -
                        - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                        inherited
                        - -
                        - -
                        - createState() - ModelListenerState<ChangeNotifier> - - - -
                        -
                        - Creates the mutable state for this widget at a given location in the tree. [...] -
                        override
                        - -
                        - -
                        - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                        -
                        - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                        @protected, inherited
                        - -
                        - -
                        - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                        -
                        - Add additional properties associated with the node. [...] -
                        inherited
                        - -
                        - -
                        - noSuchMethod(Invocation invocation) - → dynamic - - - -
                        -
                        - Invoked when a non-existent method or property is accessed. [...] -
                        inherited
                        - -
                        - -
                        - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                        -
                        - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                        inherited
                        - -
                        - -
                        - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                        -
                        - A string representation of this object. [...] -
                        inherited
                        - -
                        - -
                        - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a string representation of this node and its descendants. [...] -
                        inherited
                        - -
                        - -
                        - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                        -
                        - Returns a one-line detailed description of the object. [...] -
                        inherited
                        - -
                        - -
                        - toStringShort() - → String - - - -
                        -
                        - A short, textual description of this widget. -
                        inherited
                        - -
                        - -
                        -
                        - -
                        -

                        Operators

                        -
                        -
                        - operator ==(Object other) - → bool - - - -
                        -
                        - The equality operator. [...] -
                        @nonVirtual, inherited
                        - -
                        - -
                        -
                        - - - - -
                        - - - -
                        - -
                        - - ramaz - 2.1.1+1 - - - -
                        - - - - - - - - - - - diff --git a/docs/widgets/ModelListener/ModelListener.html b/docs/widgets/ModelListener/ModelListener.html deleted file mode 100644 index 7861f0e4a..000000000 --- a/docs/widgets/ModelListener/ModelListener.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - ModelListener constructor - ModelListener class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                        - -
                        - - -
                        ModelListener
                        - -
                        - -
                        - - - - -
                        -
                        - -

                        ModelListener<Model extends ChangeNotifier> constructor - Null safety -

                        - -
                        const - ModelListener<Model extends ChangeNotifier>(
                        1. {required Model model(
                            -),
                          1. -
                          2. required ModelBuilder<Model> builder,
                          3. -
                          4. Widget? child,
                          5. -
                          6. bool dispose = true}
                          7. -
                          ) -
                          - - -
                          -

                          Creates a widget that listens to a ChangeNotifier.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const ModelListener ({
                          -  required this.model,
                          -  required this.builder,
                          -  this.child,
                          -  this.dispose = true
                          -});
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListener/builder.html b/docs/widgets/ModelListener/builder.html deleted file mode 100644 index da55be59f..000000000 --- a/docs/widgets/ModelListener/builder.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - builder property - ModelListener class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          builder
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          builder property - Null safety -

                          - -
                          - ModelBuilder<Model> - builder -
                          final
                          - -
                          - -
                          -

                          The function to build the widget tree underneath this.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final ModelBuilder<Model> builder;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListener/child.html b/docs/widgets/ModelListener/child.html deleted file mode 100644 index 080654e0c..000000000 --- a/docs/widgets/ModelListener/child.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - child property - ModelListener class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          child
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          child property - Null safety -

                          - -
                          - Widget? - child -
                          final
                          - -
                          - -
                          -

                          An optional child to cache.

                          -

                          This child is never re-built, so if there is an expensive widget that -does not depend on model, it would go here and can be -re-used in builder.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Widget? child;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListener/createState.html b/docs/widgets/ModelListener/createState.html deleted file mode 100644 index f88c43e92..000000000 --- a/docs/widgets/ModelListener/createState.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - createState method - ModelListener class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          createState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          createState method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -ModelListenerState<ChangeNotifier> -createState() - -
                          override
                          - -
                          - -
                          -

                          Creates the mutable state for this widget at a given location in the tree.

                          -

                          Subclasses should override this method to return a newly created -instance of their associated State subclass:

                          -
                          @override
                          -_MyState createState() => _MyState();
                          -
                          -

                          The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -ModelListenerState createState() => ModelListenerState<Model>();
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListener/dispose.html b/docs/widgets/ModelListener/dispose.html deleted file mode 100644 index 9f3bcf404..000000000 --- a/docs/widgets/ModelListener/dispose.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - dispose property - ModelListener class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          dispose
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          dispose property - Null safety -

                          - -
                          - bool - dispose -
                          final
                          - -
                          - -
                          -

                          Whether or not to dispose the model.

                          -

                          Some models are used elsewhere in the app (like data models) while other -models (like view models) are only used in one screen.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final bool dispose;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListener/model.html b/docs/widgets/ModelListener/model.html deleted file mode 100644 index c4324b430..000000000 --- a/docs/widgets/ModelListener/model.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - model property - ModelListener class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          model
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          model property - Null safety -

                          - -
                          - Model Function() - model -
                          final
                          - -
                          - -
                          -

                          A function to create the model to listen to.

                          -

                          It is important that this be a function and not an instance, because -otherwise the model will be recreated every time the widget tree -is updated. With a function, this widget can choose when to create -the model.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Model Function() model;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListenerState-class.html b/docs/widgets/ModelListenerState-class.html deleted file mode 100644 index 49ca7cf1e..000000000 --- a/docs/widgets/ModelListenerState-class.html +++ /dev/null @@ -1,505 +0,0 @@ - - - - - - - - ModelListenerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ModelListenerState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ModelListenerState<Model extends ChangeNotifier> class - Null safety - -

                          - - -
                          -

                          A state for a ModelListener.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - ModelListenerState() -
                          -
                          - -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - context - BuildContext - -
                          -
                          - The location in the tree where this widget builds. [...] -
                          read-only, inherited
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          read-only, inherited
                          - -
                          - -
                          - model - ↔ Model - -
                          -
                          - The model to listen to. [...] -
                          final, read / write, late
                          - -
                          - -
                          - mounted - → bool - -
                          -
                          - Whether this State object is currently in a tree. [...] -
                          read-only, inherited
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          - widget - ModelListener<Model> - -
                          -
                          - The current configuration. [...] -
                          read-only, inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - deactivate() - → void - - - -
                          -
                          - Called when this object is removed from the tree. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - didChangeDependencies() - → void - - - -
                          -
                          - Called when a dependency of this State object changes. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - didUpdateWidget(covariant ModelListener<Model> oldWidget) - → void - - - -
                          -
                          - Called whenever the widget configuration changes. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - dispose() - → void - - - -
                          -
                          - Called when this object is removed from the tree permanently. [...] -
                          override
                          - -
                          - -
                          - initState() - → void - - - -
                          -
                          - Called when this object is inserted into the tree. [...] -
                          override
                          - -
                          - -
                          - listener() - → void - - - -
                          -
                          - Rebuilds the widget tree whenever model updates. - - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - reassemble() - → void - - - -
                          -
                          - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - setState(VoidCallback fn) - → void - - - -
                          -
                          - Notify the framework that the internal state of this object has changed. [...] -
                          @protected, inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListenerState/ModelListenerState.html b/docs/widgets/ModelListenerState/ModelListenerState.html deleted file mode 100644 index 9040753e9..000000000 --- a/docs/widgets/ModelListenerState/ModelListenerState.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - ModelListenerState constructor - ModelListenerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ModelListenerState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ModelListenerState<Model extends ChangeNotifier> constructor - Null safety -

                          - -
                          - ModelListenerState<Model extends ChangeNotifier>() -
                          - - - - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListenerState/build.html b/docs/widgets/ModelListenerState/build.html deleted file mode 100644 index a470d5a9b..000000000 --- a/docs/widgets/ModelListenerState/build.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - - build method - ModelListenerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method in a number of different situations. For -example:

                          - -

                          This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                          -

                          Design discussion

                          -

                          Why is the build method on State, and not StatefulWidget?

                          -

                          Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                          -

                          For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                          -

                          Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                          -

                          Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                          -
                          class MyButton extends StatefulWidget {
                          -  ...
                          -  final Color color;
                          -
                          -  @override
                          -  Widget build(BuildContext context, MyButtonState state) {
                          -    ... () { print("color: $color"); } ...
                          -  }
                          -}
                          -
                          -

                          For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                          -

                          In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                          -
                          class MyButtonState extends State<MyButton> {
                          -  ...
                          -  @override
                          -  Widget build(BuildContext context) {
                          -    ... () { print("color: ${widget.color}"); } ...
                          -  }
                          -}
                          -
                          -

                          Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                          -

                          See also:

                          -
                            -
                          • StatefulWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build (BuildContext context) => widget.builder (
                          -  context, model, widget.child
                          -);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListenerState/dispose.html b/docs/widgets/ModelListenerState/dispose.html deleted file mode 100644 index 225c464bc..000000000 --- a/docs/widgets/ModelListenerState/dispose.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - dispose method - ModelListenerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          dispose
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          dispose method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -void -dispose() - -
                          override
                          - -
                          - -
                          -

                          Called when this object is removed from the tree permanently.

                          -

                          The framework calls this method when this State object will never -build again. After the framework calls dispose, the State object is -considered unmounted and the mounted property is false. It is an error -to call setState at this point. This stage of the lifecycle is terminal: -there is no way to remount a State object that has been disposed.

                          -

                          Subclasses should override this method to release any resources retained -by this object (e.g., stop any active animations).

                          -

                          If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                          -
                            -
                          • In initState, subscribe to the object.
                          • -
                          • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                          • -
                          • In dispose, unsubscribe from the object.
                          • -
                          -

                          If you override this, make sure to end your method with a call to -super.dispose().

                          -

                          See also:

                          - -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -void dispose() {
                          -  try {
                          -    model.removeListener(listener);
                          -  } catch(_) {  // ignore: avoid_catches_without_on_clauses
                          -    // The model may have already been disposed. If so, we're good.
                          -  }
                          -  if (widget.dispose) {
                          -    model.dispose();
                          -  }
                          -  super.dispose();
                          -}
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListenerState/initState.html b/docs/widgets/ModelListenerState/initState.html deleted file mode 100644 index afea43ac8..000000000 --- a/docs/widgets/ModelListenerState/initState.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - initState method - ModelListenerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          initState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          initState method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -void -initState() - -
                          override
                          - -
                          - -
                          -

                          Called when this object is inserted into the tree.

                          -

                          The framework will call this method exactly once for each State object -it creates.

                          -

                          Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                          -

                          If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                          -
                            -
                          • In initState, subscribe to the object.
                          • -
                          • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                          • -
                          • In dispose, unsubscribe from the object.
                          • -
                          -

                          You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                          -

                          If you override this, make sure your method starts with a call to -super.initState().

                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -void initState() {
                          -  super.initState();
                          -  model = widget.model()..addListener(listener);
                          -}
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListenerState/listener.html b/docs/widgets/ModelListenerState/listener.html deleted file mode 100644 index 2c173869a..000000000 --- a/docs/widgets/ModelListenerState/listener.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - listener method - ModelListenerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          listener
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          listener method - Null safety -

                          - -
                          - - -void -listener() - - - -
                          - -
                          -

                          Rebuilds the widget tree whenever model updates.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          void listener() => setState(() {});
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ModelListenerState/model.html b/docs/widgets/ModelListenerState/model.html deleted file mode 100644 index b3bb8d2f7..000000000 --- a/docs/widgets/ModelListenerState/model.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - model property - ModelListenerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          model
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          model property - Null safety -

                          - -
                          - Model - model -
                          final, read / write, late
                          - -
                          - -
                          -

                          The model to listen to.

                          -

                          This is different than ModelListener.model, which is a function that is -called to create the model. Here is where the result of that function is -actually stored.

                          -
                          - - -
                          -

                          Implementation

                          -
                          late final Model model;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NavigationItem-class.html b/docs/widgets/NavigationItem-class.html deleted file mode 100644 index 552c35276..000000000 --- a/docs/widgets/NavigationItem-class.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - - - NavigationItem class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          NavigationItem
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          NavigationItem class - Null safety - -

                          - - -
                          -

                          Defines a common interface for BottomNavigationBar and NavigationRail.

                          -

                          This class maps to both BottomNavigationBarItem and -NavigationRailDestination with an icon and label property.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - -
                          Implementers
                          -
                          - - -
                          Annotations
                          -
                          -
                          -
                          - -
                          -

                          Constructors

                          - -
                          - -
                          - Creates an abstraction for a navigation item. -
                          const
                          -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - appBar - AppBar - -
                          -
                          - -
                          read-only
                          - -
                          - -
                          - bottomNavBar - BottomNavigationBarItem - -
                          -
                          - Generates an item for BottomNavigationBar. -
                          read-only
                          - -
                          - -
                          - floatingActionButton - Widget? - -
                          -
                          - -
                          read-only
                          - -
                          - -
                          - floatingActionButtonLocation - FloatingActionButtonLocation? - -
                          -
                          - -
                          read-only
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - icon - Widget - -
                          -
                          - The icon for this item. -
                          final
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - -
                          - label - → String - -
                          -
                          - The label for this item. [...] -
                          final
                          - -
                          - - -
                          - Generates an item for NavigationRail. -
                          read-only
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          - sideSheet - Widget? - -
                          -
                          - -
                          read-only
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          @protected, inherited
                          - -
                          - -
                          - createElement() - StatelessElement - - - -
                          -
                          - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NavigationItem/NavigationItem.html b/docs/widgets/NavigationItem/NavigationItem.html deleted file mode 100644 index ef155e9e2..000000000 --- a/docs/widgets/NavigationItem/NavigationItem.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - NavigationItem constructor - NavigationItem class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          NavigationItem
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          NavigationItem constructor - Null safety -

                          - -
                          const - NavigationItem(
                          1. {required Widget icon,
                          2. -
                          3. required String label}
                          4. -
                          ) -
                          - - -
                          -

                          Creates an abstraction for a navigation item.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const NavigationItem({required this.icon, required this.label});
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NavigationItem/appBar.html b/docs/widgets/NavigationItem/appBar.html deleted file mode 100644 index 653e2edcb..000000000 --- a/docs/widgets/NavigationItem/appBar.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - appBar property - NavigationItem class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          appBar
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          appBar property - Null safety -

                          - - - -
                          - -
                          - AppBar - appBar - - -
                          - - - - -
                          -

                          Implementation

                          -
                          AppBar get appBar;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NavigationItem/bottomNavBar.html b/docs/widgets/NavigationItem/bottomNavBar.html deleted file mode 100644 index 8bfbe162b..000000000 --- a/docs/widgets/NavigationItem/bottomNavBar.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - bottomNavBar property - NavigationItem class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          bottomNavBar
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          bottomNavBar property - Null safety -

                          - - - -
                          - -
                          - BottomNavigationBarItem - bottomNavBar - - -
                          - - -
                          -

                          Generates an item for BottomNavigationBar.

                          -
                          - - -
                          -

                          Implementation

                          -
                          BottomNavigationBarItem get bottomNavBar =>
                          -	BottomNavigationBarItem(icon: icon, label: label);
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NavigationItem/floatingActionButton.html b/docs/widgets/NavigationItem/floatingActionButton.html deleted file mode 100644 index 67d240d02..000000000 --- a/docs/widgets/NavigationItem/floatingActionButton.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - floatingActionButton property - NavigationItem class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          floatingActionButton
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          floatingActionButton property - Null safety -

                          - - - -
                          - -
                          - Widget? - floatingActionButton - - -
                          - - - - -
                          -

                          Implementation

                          -
                          Widget? get floatingActionButton => null;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NavigationItem/floatingActionButtonLocation.html b/docs/widgets/NavigationItem/floatingActionButtonLocation.html deleted file mode 100644 index 7baf6fdd5..000000000 --- a/docs/widgets/NavigationItem/floatingActionButtonLocation.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - floatingActionButtonLocation property - NavigationItem class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          floatingActionButtonLocation
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          floatingActionButtonLocation property - Null safety -

                          - - - -
                          - -
                          - FloatingActionButtonLocation? - floatingActionButtonLocation - - -
                          - - - - -
                          -

                          Implementation

                          -
                          FloatingActionButtonLocation? get floatingActionButtonLocation => null;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NavigationItem/icon.html b/docs/widgets/NavigationItem/icon.html deleted file mode 100644 index 20f966b6f..000000000 --- a/docs/widgets/NavigationItem/icon.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - icon property - NavigationItem class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          icon
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          icon property - Null safety -

                          - -
                          - Widget - icon -
                          final
                          - -
                          - -
                          -

                          The icon for this item.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Widget icon;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NavigationItem/label.html b/docs/widgets/NavigationItem/label.html deleted file mode 100644 index e10aaa380..000000000 --- a/docs/widgets/NavigationItem/label.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - label property - NavigationItem class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          label
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          label property - Null safety -

                          - -
                          - String - label -
                          final
                          - -
                          - -
                          -

                          The label for this item.

                          -

                          May also be used as semantics and tooltips.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final String label;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NavigationItem/navRail.html b/docs/widgets/NavigationItem/navRail.html deleted file mode 100644 index f25238aaa..000000000 --- a/docs/widgets/NavigationItem/navRail.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - navRail property - NavigationItem class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          navRail
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          navRail property - Null safety -

                          - - - -
                          - -
                          - NavigationRailDestination - navRail - - -
                          - - -
                          -

                          Generates an item for NavigationRail.

                          -
                          - - -
                          -

                          Implementation

                          -
                          NavigationRailDestination get navRail =>
                          -	NavigationRailDestination(icon: icon, label: Text(label));
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NavigationItem/sideSheet.html b/docs/widgets/NavigationItem/sideSheet.html deleted file mode 100644 index 28c395cfc..000000000 --- a/docs/widgets/NavigationItem/sideSheet.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - sideSheet property - NavigationItem class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          sideSheet
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          sideSheet property - Null safety -

                          - - - -
                          - -
                          - Widget? - sideSheet - - -
                          - - - - -
                          -

                          Implementation

                          -
                          Widget? get sideSheet => null;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NextClass-class.html b/docs/widgets/NextClass-class.html deleted file mode 100644 index 3ce27106e..000000000 --- a/docs/widgets/NextClass-class.html +++ /dev/null @@ -1,463 +0,0 @@ - - - - - - - - NextClass class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          NextClass
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          NextClass class - Null safety - -

                          - - -
                          -

                          A widget to represent the next class.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - NextClass({required List<int> reminders, Period? period, Subject? subject, bool next = false}) -
                          -
                          - Creates an info tile to represent a period. -
                          const
                          -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - -
                          - next - → bool - -
                          -
                          - Whether this is the next period or not. [...] -
                          final
                          - -
                          - -
                          - period - Period? - -
                          -
                          - The period to represent. -
                          final
                          - -
                          - -
                          - reminders - → List<int> - -
                          -
                          - The reminders that apply for this period. [...] -
                          final
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          - subject - Subject? - -
                          -
                          - The subject associated with period. -
                          final
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - createElement() - StatelessElement - - - -
                          -
                          - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NextClass/NextClass.html b/docs/widgets/NextClass/NextClass.html deleted file mode 100644 index 70784cef2..000000000 --- a/docs/widgets/NextClass/NextClass.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - NextClass constructor - NextClass class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          NextClass
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          NextClass constructor - Null safety -

                          - -
                          const - NextClass(
                          1. {required List<int> reminders,
                          2. -
                          3. Period? period,
                          4. -
                          5. Subject? subject,
                          6. -
                          7. bool next = false}
                          8. -
                          ) -
                          - - -
                          -

                          Creates an info tile to represent a period.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const NextClass({
                          -	required this.reminders,
                          -	this.period,
                          -	this.subject,
                          -	this.next = false,
                          -});
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NextClass/build.html b/docs/widgets/NextClass/build.html deleted file mode 100644 index 305b41299..000000000 --- a/docs/widgets/NextClass/build.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - build method - NextClass class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                          -

                          The implementation of this method must only depend on:

                          - -

                          If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                          -

                          See also:

                          -
                            -
                          • StatelessWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build (BuildContext context) => Column(
                          -	children: [
                          -		InfoCard(
                          -			icon: next ? Icons.restore : Icons.school,
                          -			children: period?.getInfo(subject),
                          -			page: Routes.schedule,
                          -			title: period == null
                          -				? "School is over"
                          -				: "${next ? 'Up next' : 'Right now'}: ${period!.getName(subject)}"
                          -		),
                          -		if (period?.activity != null)
                          -			SpecialTile(child: ActivityTile(period!.activity!)),
                          -		for (final int index in reminders)
                          -			SpecialTile(child: ReminderTile(index: index))
                          -	]
                          -);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NextClass/next.html b/docs/widgets/NextClass/next.html deleted file mode 100644 index df0cf96d5..000000000 --- a/docs/widgets/NextClass/next.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - next property - NextClass class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          next
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          next property - Null safety -

                          - -
                          - bool - next -
                          final
                          - -
                          - -
                          -

                          Whether this is the next period or not.

                          -

                          This changes the text from "Right now" to "Up next".

                          -
                          - - -
                          -

                          Implementation

                          -
                          final bool next;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NextClass/period.html b/docs/widgets/NextClass/period.html deleted file mode 100644 index 7ba06cf56..000000000 --- a/docs/widgets/NextClass/period.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - period property - NextClass class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          period
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          period property - Null safety -

                          - -
                          - Period? - period -
                          final
                          - -
                          - -
                          -

                          The period to represent.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Period? period;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NextClass/reminders.html b/docs/widgets/NextClass/reminders.html deleted file mode 100644 index 7530ebeac..000000000 --- a/docs/widgets/NextClass/reminders.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - reminders property - NextClass class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          reminders
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          reminders property - Null safety -

                          - -
                          - List<int> - reminders -
                          final
                          - -
                          - -
                          -

                          The reminders that apply for this period.

                          -

                          These are indices in the reminders data model.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final List<int> reminders;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/NextClass/subject.html b/docs/widgets/NextClass/subject.html deleted file mode 100644 index a3a494452..000000000 --- a/docs/widgets/NextClass/subject.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - subject property - NextClass class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          subject
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          subject property - Null safety -

                          - -
                          - Subject? - subject -
                          final
                          - -
                          - -
                          -

                          The subject associated with period.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Subject? subject;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/PeriodTile-class.html b/docs/widgets/PeriodTile-class.html deleted file mode 100644 index 2cedcc4aa..000000000 --- a/docs/widgets/PeriodTile-class.html +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - - - PeriodTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          PeriodTile
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          PeriodTile class - Null safety - -

                          - - -
                          -

                          A widget to represent a Period when creating a Schedule.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - PeriodTile({required ScheduleBuilderModel model, required Range range, required int index}) -
                          -
                          - Creates a widget to edit a period in a Schedule. -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - activity - Activity? - -
                          -
                          - The Activity for this period. -
                          final
                          - -
                          - -
                          - end - TimeOfDay - -
                          -
                          - Allows range to be formatted according to the user's locale. -
                          final
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - index - → int - -
                          -
                          - The index of this period in ScheduleBuilderModel.periods. -
                          final
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - -
                          - model - ScheduleBuilderModel - -
                          -
                          - The view model to decide the properties of this period. -
                          final
                          - -
                          - -
                          - range - Range - -
                          -
                          - The times for this period. -
                          final
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          - start - TimeOfDay - -
                          -
                          - Allows range to be formatted according to the user's locale. -
                          final
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - createElement() - StatelessElement - - - -
                          -
                          - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - getRange(TimeOfDay time, {required bool start}) - Range - - - -
                          -
                          - Creates a Range from a TimeOfDay. [...] - - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/PeriodTile/PeriodTile.html b/docs/widgets/PeriodTile/PeriodTile.html deleted file mode 100644 index e17f8c172..000000000 --- a/docs/widgets/PeriodTile/PeriodTile.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - PeriodTile constructor - PeriodTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          PeriodTile
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          PeriodTile constructor - Null safety -

                          - -
                          - PeriodTile(
                          1. {required ScheduleBuilderModel model,
                          2. -
                          3. required Range range,
                          4. -
                          5. required int index}
                          6. -
                          ) -
                          - - -
                          -

                          Creates a widget to edit a period in a Schedule.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          PeriodTile({
                          -	required this.model,
                          -	required this.range,
                          -	required this.index,
                          -}) :
                          -	activity = null,
                          -	start = range.start.asTimeOfDay,
                          -	end = range.end.asTimeOfDay;
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/PeriodTile/activity.html b/docs/widgets/PeriodTile/activity.html deleted file mode 100644 index 30ce02b43..000000000 --- a/docs/widgets/PeriodTile/activity.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - activity property - PeriodTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          activity
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          activity property - Null safety -

                          - -
                          - Activity? - activity -
                          final
                          - -
                          - -
                          -

                          The Activity for this period.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Activity? activity;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/PeriodTile/build.html b/docs/widgets/PeriodTile/build.html deleted file mode 100644 index 621269b61..000000000 --- a/docs/widgets/PeriodTile/build.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - - - build method - PeriodTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                          -

                          The implementation of this method must only depend on:

                          - -

                          If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                          -

                          See also:

                          -
                            -
                          • StatelessWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build(BuildContext context) => SizedBox(
                          -	height: 55,
                          -	child: Stack (
                          -		children: [
                          -			ListTile(
                          -				subtitle: Text(model.periods [index].name),
                          -				title: Text.rich(
                          -					TextSpan(
                          -						children: [
                          -							WidgetSpan(
                          -								child: InkWell(
                          -									onTap: () async => model.replaceTime(
                          -										index,
                          -										getRange(
                          -											await showTimePicker(
                          -												context: context,
                          -												initialTime: start,
                          -											) ?? start,
                          -											start: true,
                          -										)
                          -									),
                          -									child: Text(
                          -										start.format(context),
                          -										style: const TextStyle(color: Colors.blue)
                          -									),
                          -								),
                          -							),
                          -							const TextSpan(text: " -- "),
                          -							WidgetSpan(
                          -								child: InkWell(
                          -									onTap: () async => model.replaceTime(
                          -										index,
                          -										getRange(
                          -											await showTimePicker(
                          -												context: context,
                          -												initialTime: end,
                          -											) ?? end,
                          -											start: false,
                          -										)
                          -									),
                          -									child: Text(
                          -										end.format(context),
                          -										style: const TextStyle(color: Colors.blue)
                          -									),
                          -								),
                          -							),
                          -						]
                          -					)
                          -				),
                          -			)
                          -		]
                          -	)
                          -);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/PeriodTile/end.html b/docs/widgets/PeriodTile/end.html deleted file mode 100644 index 8fbadb5f6..000000000 --- a/docs/widgets/PeriodTile/end.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - end property - PeriodTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          end
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          end property - Null safety -

                          - -
                          - TimeOfDay - end -
                          final
                          - -
                          - -
                          -

                          Allows range to be formatted according to the user's locale.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final TimeOfDay start, end;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/PeriodTile/getRange.html b/docs/widgets/PeriodTile/getRange.html deleted file mode 100644 index af6016999..000000000 --- a/docs/widgets/PeriodTile/getRange.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - getRange method - PeriodTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          getRange
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          getRange method - Null safety -

                          - -
                          - - -Range -getRange(
                          1. TimeOfDay time,
                          2. -
                          3. {required bool start}
                          4. -
                          ) - - - -
                          - -
                          -

                          Creates a Range from a TimeOfDay.

                          -

                          start determines if the range starts with time or not.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          Range getRange(TimeOfDay time, {required bool start}) => Range(
                          -	start ? time.asTime : range.start,
                          -	start ? range.end : time.asTime,
                          -);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/PeriodTile/index.html b/docs/widgets/PeriodTile/index.html deleted file mode 100644 index 5d596381c..000000000 --- a/docs/widgets/PeriodTile/index.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - index property - PeriodTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          index
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          index property - Null safety -

                          - -
                          - int - index -
                          final
                          - -
                          - -
                          -

                          The index of this period in ScheduleBuilderModel.periods.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final int index;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/PeriodTile/model.html b/docs/widgets/PeriodTile/model.html deleted file mode 100644 index 91f2937a5..000000000 --- a/docs/widgets/PeriodTile/model.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - model property - PeriodTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          model
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          model property - Null safety -

                          - -
                          - ScheduleBuilderModel - model -
                          final
                          - -
                          - -
                          -

                          The view model to decide the properties of this period.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final ScheduleBuilderModel model;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/PeriodTile/range.html b/docs/widgets/PeriodTile/range.html deleted file mode 100644 index de896283b..000000000 --- a/docs/widgets/PeriodTile/range.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - range property - PeriodTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          range
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          range property - Null safety -

                          - -
                          - Range - range -
                          final
                          - -
                          - -
                          -

                          The times for this period.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Range range;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/PeriodTile/start.html b/docs/widgets/PeriodTile/start.html deleted file mode 100644 index 9c33f3a53..000000000 --- a/docs/widgets/PeriodTile/start.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - start property - PeriodTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          start
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          start property - Null safety -

                          - -
                          - TimeOfDay - start -
                          final
                          - -
                          - -
                          -

                          Allows range to be formatted according to the user's locale.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final TimeOfDay start, end;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos-class.html b/docs/widgets/RamazLogos-class.html deleted file mode 100644 index 56a5bca89..000000000 --- a/docs/widgets/RamazLogos-class.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          RamazLogos
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          RamazLogos class - Null safety - -

                          - - -
                          -

                          Logos belonging to ramaz.

                          -
                          - - - -
                          -

                          Constructors

                          - -
                          -
                          - RamazLogos() -
                          -
                          - -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          read-only, inherited
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toString() - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          inherited
                          - -
                          - -
                          -
                          - - - -
                          -

                          Constants

                          - -
                          -
                          - ramRectangle - → const Widget - - -
                          -
                          - The Ramaz Ram with the word Ramaz to its right. [...] - - -
                          - LoadingImage(image: AssetImage("images/logos/ramaz/ram_rectangle.png"), aspectRatio: 2.8915864378401004) -
                          -
                          - -
                          - ramSquare - → const Widget - - -
                          -
                          - A ram head. [...] - - -
                          - LoadingImage(image: AssetImage("images/logos/ramaz/ram_square.png"), aspectRatio: 1.0666666666666667) -
                          -
                          - -
                          - ramSquareWords - → const Widget - - -
                          -
                          - The Ramaz logo with a Ram head and the words Ramaz underneath. [...] - - -
                          - LoadingImage(image: AssetImage("images/logos/ramaz/ram_square_words.png"), aspectRatio: 0.9276218611521418) -
                          -
                          - -
                          - teal - → const Widget - - -
                          -
                          - The light blue, square Ramaz logo. [...] - - -
                          - LoadingImage(image: AssetImage("images/logos/ramaz/teal.jpg"), aspectRatio: 1) -
                          -
                          - -
                          -
                          - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos/RamazLogos.html b/docs/widgets/RamazLogos/RamazLogos.html deleted file mode 100644 index 78acbdf2f..000000000 --- a/docs/widgets/RamazLogos/RamazLogos.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - RamazLogos constructor - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          RamazLogos
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          RamazLogos constructor - Null safety -

                          - -
                          - RamazLogos() -
                          - - - - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos/hashCode.html b/docs/widgets/RamazLogos/hashCode.html deleted file mode 100644 index e01e309b2..000000000 --- a/docs/widgets/RamazLogos/hashCode.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - hashCode property - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          hashCode
                          - -
                          - -
                          - - - - -
                          -
                          -

                          hashCode property - Null safety -

                          - - - -
                          - -
                          - int - hashCode -
                          inherited
                          - -
                          - - -
                          -

                          The hash code for this object.

                          -

                          A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                          -

                          All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                          -

                          If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                          -

                          Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                          -

                          Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                          -

                          If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                          -
                          - - -
                          -

                          Implementation

                          -
                          external int get hashCode;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos/noSuchMethod.html b/docs/widgets/RamazLogos/noSuchMethod.html deleted file mode 100644 index 08c87e4d3..000000000 --- a/docs/widgets/RamazLogos/noSuchMethod.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - noSuchMethod method - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          noSuchMethod
                          - -
                          - -
                          - - - - -
                          -
                          -

                          noSuchMethod method - Null safety -

                          - -
                          - - -dynamic -noSuchMethod(
                          1. Invocation invocation
                          2. -
                          ) - -
                          inherited
                          - -
                          - -
                          -

                          Invoked when a non-existent method or property is accessed.

                          -

                          A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                          -
                          dynamic object = 1;
                          -object.add(42); // Statically allowed, run-time error
                          -
                          -

                          This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                          -

                          Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                          -

                          A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                          -
                          class MockList<T> implements List<T> {
                          -  noSuchMethod(Invocation invocation) {
                          -    log(invocation);
                          -    super.noSuchMethod(invocation); // Will throw.
                          -  }
                          -}
                          -void main() {
                          -  MockList().add(42);
                          -}
                          -
                          -

                          This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                          -

                          If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                          -

                          The default behavior is to throw a NoSuchMethodError.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          @pragma("vm:entry-point")
                          -external dynamic noSuchMethod(Invocation invocation);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos/operator_equals.html b/docs/widgets/RamazLogos/operator_equals.html deleted file mode 100644 index fa6174852..000000000 --- a/docs/widgets/RamazLogos/operator_equals.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - operator == method - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          operator ==
                          - -
                          - -
                          - - - - -
                          -
                          -

                          operator == method - Null safety -

                          - -
                          - - -bool -operator ==(
                          1. Object other
                          2. -
                          ) - -
                          inherited
                          - -
                          - -
                          -

                          The equality operator.

                          -

                          The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                          -

                          Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                          -
                            -
                          • -

                            Total: It must return a boolean for all arguments. It should never throw.

                            -
                          • -
                          • -

                            Reflexive: For all objects o, o == o must be true.

                            -
                          • -
                          • -

                            Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                            -
                          • -
                          • -

                            Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                            -
                          • -
                          -

                          The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                          -

                          If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          external bool operator ==(Object other);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos/ramRectangle-constant.html b/docs/widgets/RamazLogos/ramRectangle-constant.html deleted file mode 100644 index 8c73065d3..000000000 --- a/docs/widgets/RamazLogos/ramRectangle-constant.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - ramRectangle constant - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ramRectangle
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ramRectangle constant - Null safety -

                          - -
                          - Widget - const ramRectangle - - -
                          - -
                          -

                          The Ramaz Ram with the word Ramaz to its right.

                          -

                          https://www.the-rampage.org/wp-content/uploads/2019/08/IMG_0432.png -with https://upload.wikimedia.org/wikipedia/commons/a/aa/RamazNewLogo_BLUE_RGB_Large72dpi.jpg -next to it.

                          -
                          - - -
                          -

                          Implementation

                          -
                          static const Widget ramRectangle = LoadingImage(
                          -	image: AssetImage("images/logos/ramaz/ram_rectangle.png"),
                          -	aspectRatio: 2.8915864378401004
                          -);
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos/ramSquare-constant.html b/docs/widgets/RamazLogos/ramSquare-constant.html deleted file mode 100644 index a2faf8f70..000000000 --- a/docs/widgets/RamazLogos/ramSquare-constant.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - ramSquare constant - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ramSquare
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ramSquare constant - Null safety -

                          - -
                          - Widget - const ramSquare - - -
                          - -
                          -

                          A ram head.

                          -

                          https://www.the-rampage.org/wp-content/uploads/2019/08/IMG_0432.png

                          -
                          - - -
                          -

                          Implementation

                          -
                          static const Widget ramSquare = LoadingImage(
                          -	image: AssetImage("images/logos/ramaz/ram_square.png"),
                          -	aspectRatio: 1.0666666666666667
                          -);
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos/ramSquareWords-constant.html b/docs/widgets/RamazLogos/ramSquareWords-constant.html deleted file mode 100644 index 6006a38d7..000000000 --- a/docs/widgets/RamazLogos/ramSquareWords-constant.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - ramSquareWords constant - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ramSquareWords
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ramSquareWords constant - Null safety -

                          - -
                          - Widget - const ramSquareWords - - -
                          - -
                          -

                          The Ramaz logo with a Ram head and the words Ramaz underneath.

                          -

                          Like https://www.the-rampage.org/wp-content/uploads/2019/08/IMG_0432.png, -but with the word Ramaz underneath.

                          -
                          - - -
                          -

                          Implementation

                          -
                          static const Widget ramSquareWords = LoadingImage(
                          -	image: AssetImage("images/logos/ramaz/ram_square_words.png"),
                          -	aspectRatio: 0.9276218611521418
                          -);
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos/runtimeType.html b/docs/widgets/RamazLogos/runtimeType.html deleted file mode 100644 index 7da5b5190..000000000 --- a/docs/widgets/RamazLogos/runtimeType.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - runtimeType property - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          runtimeType
                          - -
                          - -
                          - - - - -
                          -
                          -

                          runtimeType property - Null safety -

                          - - - -
                          - -
                          - Type - runtimeType -
                          inherited
                          - -
                          - - -
                          -

                          A representation of the runtime type of the object.

                          -
                          - - -
                          -

                          Implementation

                          -
                          external Type get runtimeType;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos/teal-constant.html b/docs/widgets/RamazLogos/teal-constant.html deleted file mode 100644 index afa9ae3ed..000000000 --- a/docs/widgets/RamazLogos/teal-constant.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - teal constant - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          teal
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          teal constant - Null safety -

                          - -
                          - Widget - const teal - - -
                          - -
                          -

                          The light blue, square Ramaz logo.

                          -

                          https://pbs.twimg.com/profile_images/378800000152983492/5724a8d14e67b53234ed96e3235fe526.jpeg

                          -
                          - - -
                          -

                          Implementation

                          -
                          static const Widget teal = LoadingImage(
                          -	image: AssetImage("images/logos/ramaz/teal.jpg"),
                          -	aspectRatio: 1
                          -);
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/RamazLogos/toString.html b/docs/widgets/RamazLogos/toString.html deleted file mode 100644 index ea73303b9..000000000 --- a/docs/widgets/RamazLogos/toString.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - toString method - RamazLogos class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          toString
                          - -
                          - -
                          - - - - -
                          -
                          -

                          toString method - Null safety -

                          - -
                          - - -String -toString() - -
                          inherited
                          - -
                          - -
                          -

                          A string representation of this object.

                          -

                          Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                          -

                          Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          external String toString();
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ReminderTile-class.html b/docs/widgets/ReminderTile-class.html deleted file mode 100644 index 6c6dfacd2..000000000 --- a/docs/widgets/ReminderTile-class.html +++ /dev/null @@ -1,440 +0,0 @@ - - - - - - - - ReminderTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ReminderTile
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ReminderTile class - Null safety - -

                          - - -
                          -

                          A widget to represent a Reminder.

                          -

                          From the widget, the user will be able to delete or modify the reminder.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - ReminderTile({required int index, double height = 65}) -
                          -
                          - Creates a reminder tile. -
                          const
                          -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - height - → double - -
                          -
                          - The height of this tile. -
                          final
                          - -
                          - -
                          - index - → int - -
                          -
                          - The index of this reminder in Reminders.reminders. -
                          final
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - createElement() - StatelessElement - - - -
                          -
                          - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ReminderTile/ReminderTile.html b/docs/widgets/ReminderTile/ReminderTile.html deleted file mode 100644 index bf5fa771f..000000000 --- a/docs/widgets/ReminderTile/ReminderTile.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - ReminderTile constructor - ReminderTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ReminderTile
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ReminderTile constructor - Null safety -

                          - -
                          const - ReminderTile(
                          1. {required int index,
                          2. -
                          3. double height = 65}
                          4. -
                          ) -
                          - - -
                          -

                          Creates a reminder tile.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const ReminderTile({
                          -	required this.index,
                          -	this.height = 65,
                          -});
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ReminderTile/build.html b/docs/widgets/ReminderTile/build.html deleted file mode 100644 index 8750fa957..000000000 --- a/docs/widgets/ReminderTile/build.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - - build method - ReminderTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                          -

                          The implementation of this method must only depend on:

                          - -

                          If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                          -

                          See also:

                          -
                            -
                          • StatelessWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build (BuildContext context) {
                          -	// The data model.
                          -	final Reminders reminders = Models.instance.reminders;
                          -
                          -	// The reminder being represented
                          -	final Reminder reminder = reminders.reminders [index];
                          -
                          -	return SizedBox (
                          -		height: height,
                          -		child: Center (
                          -			child: ListTile(
                          -				title: Text (reminder.message),
                          -				subtitle: Text(reminder.time.toString()),
                          -				onTap: () async {
                          -					if (!Models.instance.schedule.isValidReminder(reminder)) {
                          -						reminders.deleteReminder(index);
                          -						ScaffoldMessenger.of(context).showSnackBar(
                          -							const SnackBar(content: Text("Deleted outdated reminder"))
                          -						);
                          -						return;
                          -					}
                          -					reminders.replaceReminder(
                          -						index,
                          -						await ReminderBuilder.buildReminder(context, reminder),
                          -					);
                          -					},
                          -				trailing: IconButton (
                          -					icon: Icon (
                          -						Icons.remove_circle,
                          -						color: Theme.of(context).iconTheme.color
                          -					),
                          -					onPressed: () => reminders.deleteReminder(index),
                          -				),
                          -			),
                          -		),
                          -	);
                          -}
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ReminderTile/height.html b/docs/widgets/ReminderTile/height.html deleted file mode 100644 index 7543e74cd..000000000 --- a/docs/widgets/ReminderTile/height.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - height property - ReminderTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          height
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          height property - Null safety -

                          - -
                          - double - height -
                          final
                          - -
                          - -
                          -

                          The height of this tile.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final double height;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ReminderTile/index.html b/docs/widgets/ReminderTile/index.html deleted file mode 100644 index 0e6f80b1a..000000000 --- a/docs/widgets/ReminderTile/index.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - index property - ReminderTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          index
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          index property - Null safety -

                          - -
                          - int - index -
                          final
                          - -
                          - -
                          -

                          The index of this reminder in Reminders.reminders.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final int index;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveBuilder-class.html b/docs/widgets/ResponsiveBuilder-class.html deleted file mode 100644 index 568f26456..000000000 --- a/docs/widgets/ResponsiveBuilder-class.html +++ /dev/null @@ -1,439 +0,0 @@ - - - - - - - - ResponsiveBuilder class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ResponsiveBuilder
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ResponsiveBuilder class - Null safety - -

                          - - -
                          -

                          Builds a widget tree according to a LayoutInfo.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - ResponsiveBuilder({required ResponsiveWidgetBuilder builder, Widget? child}) -
                          -
                          - A builder to layout the widget tree based on the device size. -
                          const
                          -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - builder - ResponsiveWidgetBuilder - -
                          -
                          - A function to build the widget tree. -
                          final
                          - -
                          - -
                          - child - Widget? - -
                          -
                          - An optional widget that doesn't depend on the layout info. [...] -
                          final
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - createElement() - StatelessElement - - - -
                          -
                          - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveBuilder/ResponsiveBuilder.html b/docs/widgets/ResponsiveBuilder/ResponsiveBuilder.html deleted file mode 100644 index 8f1a49fe7..000000000 --- a/docs/widgets/ResponsiveBuilder/ResponsiveBuilder.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - ResponsiveBuilder constructor - ResponsiveBuilder class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ResponsiveBuilder
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ResponsiveBuilder constructor - Null safety -

                          - -
                          const - ResponsiveBuilder(
                          1. {required ResponsiveWidgetBuilder builder,
                          2. -
                          3. Widget? child}
                          4. -
                          ) -
                          - - -
                          -

                          A builder to layout the widget tree based on the device size.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const ResponsiveBuilder({
                          -	required this.builder,
                          -	this.child,
                          -});
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveBuilder/build.html b/docs/widgets/ResponsiveBuilder/build.html deleted file mode 100644 index e1b8d093d..000000000 --- a/docs/widgets/ResponsiveBuilder/build.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - build method - ResponsiveBuilder class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                          -

                          The implementation of this method must only depend on:

                          - -

                          If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                          -

                          See also:

                          -
                            -
                          • StatelessWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build(BuildContext context) =>
                          -	builder(context, LayoutInfo(context), child);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveBuilder/builder.html b/docs/widgets/ResponsiveBuilder/builder.html deleted file mode 100644 index e57e008ff..000000000 --- a/docs/widgets/ResponsiveBuilder/builder.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - builder property - ResponsiveBuilder class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          builder
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          builder property - Null safety -

                          - -
                          - ResponsiveWidgetBuilder - builder -
                          final
                          - -
                          - -
                          -

                          A function to build the widget tree.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final ResponsiveWidgetBuilder builder;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveBuilder/child.html b/docs/widgets/ResponsiveBuilder/child.html deleted file mode 100644 index 3c5d89a42..000000000 --- a/docs/widgets/ResponsiveBuilder/child.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - child property - ResponsiveBuilder class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          child
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          child property - Null safety -

                          - -
                          - Widget? - child -
                          final
                          - -
                          - -
                          -

                          An optional widget that doesn't depend on the layout info.

                          -

                          Use this field to cache large portions of the widget tree so they don't -rebuild every frame when a window resizes.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Widget? child;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold-class.html b/docs/widgets/ResponsiveScaffold-class.html deleted file mode 100644 index 209da33de..000000000 --- a/docs/widgets/ResponsiveScaffold-class.html +++ /dev/null @@ -1,560 +0,0 @@ - - - - - - - - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ResponsiveScaffold
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ResponsiveScaffold class - Null safety - -

                          - - -
                          -

                          A Scaffold that rearranges itself according to the device size.

                          -

                          Uses LayoutInfo to decide key elements of the layout. This class has -two uses: with and without primary navigation items. These are items that -would normally be placed in a BottomNavigationBar. When primary navigation -items are provided, two different drawers are used: with and without the -primary navigation items (to avoid duplication in the UI).

                          -

                          See the package documentation for how the layout is determined.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - ResponsiveScaffold({required Widget drawer, required WidgetBuilder bodyBuilder, required PreferredSizeWidget appBar, Widget? floatingActionButton, Widget? sideSheet, FloatingActionButtonLocation? floatingActionButtonLocation}) -
                          -
                          - Creates a scaffold that responds to the screen size. -
                          const
                          -
                          -
                          - ResponsiveScaffold.navBar({required Widget drawer, required Widget? secondaryDrawer, required List<NavigationItem> navItems, required int navIndex, required ValueChanged<int>? onNavIndexChanged}) -
                          -
                          - Creates a responsive layout with primary navigation items. -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - appBar - PreferredSizeWidget - -
                          -
                          - The app bar. [...] -
                          final
                          - -
                          - -
                          - bodyBuilder - WidgetBuilder - -
                          -
                          - The main body of the scaffold. -
                          final
                          - -
                          - -
                          - drawer - Widget - -
                          -
                          - The full drawer to show. [...] -
                          final
                          - -
                          - -
                          - floatingActionButton - Widget? - -
                          -
                          - The Floating Action Button. [...] -
                          final
                          - -
                          - -
                          - floatingActionButtonLocation - FloatingActionButtonLocation? - -
                          -
                          - The location of the floating action button. -
                          final
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - hasNavBar - → bool - -
                          -
                          - Whether this widget is being used with a navigation bar. -
                          read-only
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - - -
                          - The index of the current navigation item in navItems. -
                          final
                          - -
                          - - -
                          - The navigation items. [...] -
                          final
                          - -
                          - -
                          - onNavIndexChanged - ValueChanged<int>? - -
                          -
                          - A callback for when the user selects a navigation item. -
                          final
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          - secondaryDrawer - Widget? - -
                          -
                          - The secondary, more compact, navigation drawer. [...] -
                          final
                          - -
                          - -
                          - sideSheet - Widget? - -
                          -
                          - The side sheet. [...] -
                          final
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - createElement() - StatelessElement - - - -
                          -
                          - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.html b/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.html deleted file mode 100644 index cb3555765..000000000 --- a/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - ResponsiveScaffold constructor - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ResponsiveScaffold
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ResponsiveScaffold constructor - Null safety -

                          - -
                          const - ResponsiveScaffold(
                          1. {required Widget drawer,
                          2. -
                          3. required WidgetBuilder bodyBuilder,
                          4. -
                          5. required PreferredSizeWidget appBar,
                          6. -
                          7. Widget? floatingActionButton,
                          8. -
                          9. Widget? sideSheet,
                          10. -
                          11. FloatingActionButtonLocation? floatingActionButtonLocation}
                          12. -
                          ) -
                          - - -
                          -

                          Creates a scaffold that responds to the screen size.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const ResponsiveScaffold({
                          -	required this.drawer,
                          -	required this.bodyBuilder,
                          -	required this.appBar,
                          -	this.floatingActionButton,
                          -	this.sideSheet,
                          -	this.floatingActionButtonLocation,
                          -}) :
                          -	secondaryDrawer = null,
                          -	navItems = null,
                          -	navIndex = null,
                          -	onNavIndexChanged = null;
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.navBar.html b/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.navBar.html deleted file mode 100644 index dfd143f01..000000000 --- a/docs/widgets/ResponsiveScaffold/ResponsiveScaffold.navBar.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - ResponsiveScaffold.navBar constructor - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ResponsiveScaffold.navBar
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ResponsiveScaffold.navBar constructor - Null safety -

                          - -
                          - ResponsiveScaffold.navBar(
                          1. {required Widget drawer,
                          2. -
                          3. required Widget? secondaryDrawer,
                          4. -
                          5. required List<NavigationItem> navItems,
                          6. -
                          7. required int navIndex,
                          8. -
                          9. required ValueChanged<int>? onNavIndexChanged}
                          10. -
                          ) -
                          - - -
                          -

                          Creates a responsive layout with primary navigation items.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          ResponsiveScaffold.navBar({
                          -	required this.drawer,
                          -	required this.secondaryDrawer,
                          -	required List<NavigationItem> this.navItems,
                          -	required int this.navIndex,
                          -	required this.onNavIndexChanged,
                          -}) :
                          -	appBar = navItems [navIndex].appBar,
                          -	bodyBuilder = navItems [navIndex].build,
                          -	floatingActionButton = navItems [navIndex].floatingActionButton,
                          -	floatingActionButtonLocation = navItems [navIndex]
                          -		.floatingActionButtonLocation,
                          -	sideSheet = navItems [navIndex].sideSheet;
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/appBar.html b/docs/widgets/ResponsiveScaffold/appBar.html deleted file mode 100644 index 6a5b84e44..000000000 --- a/docs/widgets/ResponsiveScaffold/appBar.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - appBar property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          appBar
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          appBar property - Null safety -

                          - -
                          - PreferredSizeWidget - appBar -
                          final
                          - -
                          - -
                          -

                          The app bar.

                          -

                          This does not change with the layout, except for showing a drawer menu.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final PreferredSizeWidget appBar;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/bodyBuilder.html b/docs/widgets/ResponsiveScaffold/bodyBuilder.html deleted file mode 100644 index 7ea960af1..000000000 --- a/docs/widgets/ResponsiveScaffold/bodyBuilder.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - bodyBuilder property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          bodyBuilder
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          bodyBuilder property - Null safety -

                          - -
                          - WidgetBuilder - bodyBuilder -
                          final
                          - -
                          - -
                          -

                          The main body of the scaffold.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final WidgetBuilder bodyBuilder;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/build.html b/docs/widgets/ResponsiveScaffold/build.html deleted file mode 100644 index d3de86972..000000000 --- a/docs/widgets/ResponsiveScaffold/build.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - - build method - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                          -

                          The implementation of this method must only depend on:

                          - -

                          If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                          -

                          See also:

                          -
                            -
                          • StatelessWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build(BuildContext context) => ResponsiveBuilder(
                          -	child: bodyBuilder(context),  // ignore: sort_child_properties_last
                          -	builder: (BuildContext context, LayoutInfo info, Widget? child) => Scaffold(
                          -		appBar: appBar,
                          -		drawer: info.hasStandardDrawer ? null
                          -			: Drawer(child: hasNavBar ? secondaryDrawer : drawer),
                          -		endDrawer: info.hasStandardSideSheet || sideSheet == null
                          -			? null : Drawer(child: sideSheet),
                          -		floatingActionButton: floatingActionButton,
                          -		floatingActionButtonLocation: floatingActionButtonLocation,
                          -		bottomNavigationBar: !hasNavBar || !info.hasBottomNavBar
                          -			? null
                          -			: BottomNavigationBar(
                          -				type: BottomNavigationBarType.fixed,
                          -				items: [
                          -					for (final NavigationItem item in navItems!)
                          -						item.bottomNavBar,
                          -				],
                          -				currentIndex: navIndex!,
                          -				onTap: onNavIndexChanged,
                          -			),
                          -		body: Row(
                          -			children: [
                          -				if (hasNavBar && info.hasNavRail) NavigationRail(
                          -					labelType: NavigationRailLabelType.all,
                          -					destinations: [
                          -						for (final NavigationItem item in navItems!)
                          -							item.navRail,
                          -					],
                          -					selectedIndex: navIndex!,
                          -					onDestinationSelected: onNavIndexChanged,
                          -				)
                          -				else if (info.hasStandardDrawer) drawer,
                          -				Expanded(child: child!),
                          -				if (sideSheet != null && info.hasStandardSideSheet) ...[
                          -					const VerticalDivider(),
                          -					SizedBox(
                          -						width: 320,
                          -						child: Drawer(elevation: 0, child: sideSheet),
                          -					)
                          -				]
                          -			]
                          -		)
                          -	),
                          -);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/drawer.html b/docs/widgets/ResponsiveScaffold/drawer.html deleted file mode 100644 index 4fe594010..000000000 --- a/docs/widgets/ResponsiveScaffold/drawer.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - drawer property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          drawer
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          drawer property - Null safety -

                          - -
                          - Widget - drawer -
                          final
                          - -
                          - -
                          -

                          The full drawer to show.

                          -

                          When there are primary navigation items, it is recommended not to include -them in the drawer, as that may confuse your users. Instead, provide two -drawers, one with them and the other, without.

                          -

                          This field should include all navigation items, whereas secondaryDrawer -should exclude all navigation items that are in navItems.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Widget drawer;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/floatingActionButton.html b/docs/widgets/ResponsiveScaffold/floatingActionButton.html deleted file mode 100644 index 3af7adbb6..000000000 --- a/docs/widgets/ResponsiveScaffold/floatingActionButton.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - floatingActionButton property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          floatingActionButton
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          floatingActionButton property - Null safety -

                          - -
                          - Widget? - floatingActionButton -
                          final
                          - -
                          - -
                          -

                          The Floating Action Button.

                          -

                          Currently, the position does not change based on layout.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Widget? floatingActionButton;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/floatingActionButtonLocation.html b/docs/widgets/ResponsiveScaffold/floatingActionButtonLocation.html deleted file mode 100644 index c8a26bbd8..000000000 --- a/docs/widgets/ResponsiveScaffold/floatingActionButtonLocation.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - floatingActionButtonLocation property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          floatingActionButtonLocation
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          floatingActionButtonLocation property - Null safety -

                          - -
                          - FloatingActionButtonLocation? - floatingActionButtonLocation -
                          final
                          - -
                          - -
                          -

                          The location of the floating action button.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final FloatingActionButtonLocation? floatingActionButtonLocation;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/hasNavBar.html b/docs/widgets/ResponsiveScaffold/hasNavBar.html deleted file mode 100644 index 99724f7d7..000000000 --- a/docs/widgets/ResponsiveScaffold/hasNavBar.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - hasNavBar property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          hasNavBar
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          hasNavBar property - Null safety -

                          - - - -
                          - -
                          - bool - hasNavBar - - -
                          - - -
                          -

                          Whether this widget is being used with a navigation bar.

                          -
                          - - -
                          -

                          Implementation

                          -
                          bool get hasNavBar => navItems != null;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/navIndex.html b/docs/widgets/ResponsiveScaffold/navIndex.html deleted file mode 100644 index 02ce756d3..000000000 --- a/docs/widgets/ResponsiveScaffold/navIndex.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - navIndex property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          navIndex
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          navIndex property - Null safety -

                          - -
                          - int? - navIndex -
                          final
                          - -
                          - -
                          -

                          The index of the current navigation item in navItems.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final int? navIndex;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/navItems.html b/docs/widgets/ResponsiveScaffold/navItems.html deleted file mode 100644 index 6a5c64b5d..000000000 --- a/docs/widgets/ResponsiveScaffold/navItems.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - navItems property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          navItems
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          navItems property - Null safety -

                          - -
                          - List<NavigationItem>? - navItems -
                          final
                          - -
                          - -
                          -

                          The navigation items.

                          -

                          On phones, these will be in a BottomNavigationBar. On tablets, these -will be in a NavigationRail. On desktops, these should be included in -drawer instead.

                          -

                          On phones and tablets, so that the items do not appear twice, provide a -secondaryDrawer that does not include these items.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final List<NavigationItem>? navItems;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/onNavIndexChanged.html b/docs/widgets/ResponsiveScaffold/onNavIndexChanged.html deleted file mode 100644 index b2a5f075e..000000000 --- a/docs/widgets/ResponsiveScaffold/onNavIndexChanged.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - onNavIndexChanged property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          onNavIndexChanged
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          onNavIndexChanged property - Null safety -

                          - -
                          - ValueChanged<int>? - onNavIndexChanged -
                          final
                          - -
                          - -
                          -

                          A callback for when the user selects a navigation item.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final ValueChanged<int>? onNavIndexChanged;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/secondaryDrawer.html b/docs/widgets/ResponsiveScaffold/secondaryDrawer.html deleted file mode 100644 index c43de608c..000000000 --- a/docs/widgets/ResponsiveScaffold/secondaryDrawer.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - secondaryDrawer property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          secondaryDrawer
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          secondaryDrawer property - Null safety -

                          - -
                          - Widget? - secondaryDrawer -
                          final
                          - -
                          - -
                          -

                          The secondary, more compact, navigation drawer.

                          -

                          When there are primary navigation items, it is recommended not to include -them in the drawer, as that may confuse your users. Instead, provide two -drawers, one with them and the other, without.

                          -

                          This field should exclude all navigation items that are in navItems, -whereas drawer should include them.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Widget? secondaryDrawer;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveScaffold/sideSheet.html b/docs/widgets/ResponsiveScaffold/sideSheet.html deleted file mode 100644 index bc89464ac..000000000 --- a/docs/widgets/ResponsiveScaffold/sideSheet.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - sideSheet property - ResponsiveScaffold class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          sideSheet
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          sideSheet property - Null safety -

                          - -
                          - Widget? - sideSheet -
                          final
                          - -
                          - -
                          -

                          The side sheet.

                          -

                          On larger screens (tablets and desktops), this will be a standard -(persistent) side sheet. On smaller screens, this will be modal.

                          -

                          See LayoutInfo.hasStandardSideSheet.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Widget? sideSheet;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ResponsiveWidgetBuilder.html b/docs/widgets/ResponsiveWidgetBuilder.html deleted file mode 100644 index afd8bc348..000000000 --- a/docs/widgets/ResponsiveWidgetBuilder.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - ResponsiveWidgetBuilder typedef - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ResponsiveWidgetBuilder
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ResponsiveWidgetBuilder typedef - Null safety - -

                          - -
                          - - - -Widget -ResponsiveWidgetBuilder(
                          1. BuildContext,
                          2. -
                          3. LayoutInfo,
                          4. -
                          5. Widget?
                          6. -
                          ) - - -
                          - - -
                          -

                          A function that returns a widget that depends on a LayoutInfo.

                          -

                          Used by ResponsiveBuilder.

                          -
                          - - -
                          -

                          Implementation

                          -
                          typedef ResponsiveWidgetBuilder =
                          -	Widget Function(BuildContext, LayoutInfo, Widget?);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ScoreUpdaterState-class.html b/docs/widgets/ScoreUpdaterState-class.html deleted file mode 100644 index f32808cb9..000000000 --- a/docs/widgets/ScoreUpdaterState-class.html +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - ScoreUpdaterState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ScoreUpdaterState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ScoreUpdaterState class - Null safety - -

                          - - -
                          -

                          The state for SportsScoreUpdater.

                          -

                          Needed to keep the state of the TextEditingControllers.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - ScoreUpdaterState() -
                          -
                          - -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - context - BuildContext - -
                          -
                          - The location in the tree where this widget builds. [...] -
                          read-only, inherited
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          read-only, inherited
                          - -
                          - -
                          - mounted - → bool - -
                          -
                          - Whether this State object is currently in a tree. [...] -
                          read-only, inherited
                          - -
                          - -
                          - otherController - TextEditingController - -
                          -
                          - The controller for the opponent's score TextField/ -
                          final
                          - -
                          - -
                          - otherScore - ↔ int? - -
                          -
                          - The value of otherController as a number. -
                          read / write
                          - -
                          - -
                          - ramazController - TextEditingController - -
                          -
                          - The controller for the Ramaz score TextField/ -
                          final
                          - -
                          - -
                          - ramazScore - ↔ int? - -
                          -
                          - The value of ramazController as a number. -
                          read / write
                          - -
                          - -
                          - ready - → bool - -
                          -
                          - Whether scores is valid and ready to submit. -
                          read-only
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          - scores - Scores - -
                          -
                          - The Scores object represented by this widget. -
                          read-only
                          - -
                          - -
                          - widget - SportsScoreUpdater - -
                          -
                          - The current configuration. [...] -
                          read-only, inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - deactivate() - → void - - - -
                          -
                          - Called when this object is removed from the tree. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - didChangeDependencies() - → void - - - -
                          -
                          - Called when a dependency of this State object changes. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - didUpdateWidget(covariant SportsScoreUpdater oldWidget) - → void - - - -
                          -
                          - Called whenever the widget configuration changes. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - dispose() - → void - - - -
                          -
                          - Called when this object is removed from the tree permanently. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - initState() - → void - - - -
                          -
                          - Called when this object is inserted into the tree. [...] -
                          override
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - reassemble() - → void - - - -
                          -
                          - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - setState(VoidCallback fn) - → void - - - -
                          -
                          - Notify the framework that the internal state of this object has changed. [...] -
                          @protected, inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ScoreUpdaterState/ScoreUpdaterState.html b/docs/widgets/ScoreUpdaterState/ScoreUpdaterState.html deleted file mode 100644 index ff97ea78b..000000000 --- a/docs/widgets/ScoreUpdaterState/ScoreUpdaterState.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - ScoreUpdaterState constructor - ScoreUpdaterState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ScoreUpdaterState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ScoreUpdaterState constructor - Null safety -

                          - -
                          - ScoreUpdaterState() -
                          - - - - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ScoreUpdaterState/build.html b/docs/widgets/ScoreUpdaterState/build.html deleted file mode 100644 index 81d861eae..000000000 --- a/docs/widgets/ScoreUpdaterState/build.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - build method - ScoreUpdaterState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method in a number of different situations. For -example:

                          - -

                          This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                          -

                          Design discussion

                          -

                          Why is the build method on State, and not StatefulWidget?

                          -

                          Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                          -

                          For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                          -

                          Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                          -

                          Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                          -
                          class MyButton extends StatefulWidget {
                          -  ...
                          -  final Color color;
                          -
                          -  @override
                          -  Widget build(BuildContext context, MyButtonState state) {
                          -    ... () { print("color: $color"); } ...
                          -  }
                          -}
                          -
                          -

                          For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                          -

                          In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                          -
                          class MyButtonState extends State<MyButton> {
                          -  ...
                          -  @override
                          -  Widget build(BuildContext context) {
                          -    ... () { print("color: ${widget.color}"); } ...
                          -  }
                          -}
                          -
                          -

                          Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                          -

                          See also:

                          -
                            -
                          • StatefulWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build(BuildContext context) => AlertDialog(
                          -  title: const Text("Update Scores"),
                          -  content: Column(
                          -    mainAxisSize: MainAxisSize.min,
                          -    children: [
                          -      Row(
                          -        mainAxisAlignment: MainAxisAlignment.center,
                          -        children: [
                          -          const Text("Ramaz"),
                          -          const SizedBox(width: 50),
                          -          Text(widget.game.opponent),
                          -        ]
                          -      ),
                          -      const SizedBox(height: 20),
                          -      Row(
                          -        mainAxisAlignment: MainAxisAlignment.center,
                          -        children: [
                          -          SizedBox(
                          -            width: 20,
                          -            child: TextField(
                          -              controller: ramazController,
                          -              onChanged: (String score) => setState(
                          -                () => ramazScore = int.tryParse(score)
                          -              ),
                          -              keyboardType: TextInputType.number,
                          -            )
                          -          ),
                          -          const SizedBox(width: 50),
                          -          SizedBox(
                          -            width: 20,
                          -            child: TextField(
                          -              controller: otherController,
                          -              onChanged: (String score) => setState(
                          -                () => otherScore = int.tryParse(score)
                          -              ),
                          -              keyboardType: TextInputType.number,
                          -            )
                          -          ),
                          -        ]
                          -      )
                          -    ]
                          -  ),
                          -  actions: [
                          -    TextButton(
                          -      onPressed: () => Navigator.of(context).pop(),
                          -      child: const Text("Cancel"),
                          -    ),
                          -    ElevatedButton(
                          -      onPressed: !ready ? null : () => Navigator.of(context).pop(scores),
                          -      child: const Text("Save"),
                          -    )
                          -  ]
                          -);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ScoreUpdaterState/initState.html b/docs/widgets/ScoreUpdaterState/initState.html deleted file mode 100644 index 50701666a..000000000 --- a/docs/widgets/ScoreUpdaterState/initState.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - initState method - ScoreUpdaterState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          initState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          initState method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -void -initState() - -
                          override
                          - -
                          - -
                          -

                          Called when this object is inserted into the tree.

                          -

                          The framework will call this method exactly once for each State object -it creates.

                          -

                          Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                          -

                          If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                          -
                            -
                          • In initState, subscribe to the object.
                          • -
                          • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                          • -
                          • In dispose, unsubscribe from the object.
                          • -
                          -

                          You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                          -

                          If you override this, make sure your method starts with a call to -super.initState().

                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -void initState() {
                          -  super.initState();
                          -  ramazController.text = widget.game.scores?.ramazScore.toString() ?? "";
                          -  otherController.text = widget.game.scores?.otherScore.toString() ?? "";
                          -  ramazScore = int.tryParse(ramazController.text);
                          -  otherScore = int.tryParse(otherController.text);
                          -}
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ScoreUpdaterState/otherController.html b/docs/widgets/ScoreUpdaterState/otherController.html deleted file mode 100644 index cdbce3fd3..000000000 --- a/docs/widgets/ScoreUpdaterState/otherController.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - otherController property - ScoreUpdaterState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          otherController
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          otherController property - Null safety -

                          - -
                          - TextEditingController - otherController -
                          final
                          - -
                          - -
                          -

                          The controller for the opponent's score TextField/

                          -
                          - - -
                          -

                          Implementation

                          -
                          final TextEditingController otherController = TextEditingController();
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ScoreUpdaterState/otherScore.html b/docs/widgets/ScoreUpdaterState/otherScore.html deleted file mode 100644 index ba0c136ce..000000000 --- a/docs/widgets/ScoreUpdaterState/otherScore.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - otherScore property - ScoreUpdaterState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          otherScore
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          otherScore property - Null safety -

                          - -
                          - int? - otherScore -
                          read / write
                          - -
                          - -
                          -

                          The value of otherController as a number.

                          -
                          - - -
                          -

                          Implementation

                          -
                          int? otherScore;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ScoreUpdaterState/ramazController.html b/docs/widgets/ScoreUpdaterState/ramazController.html deleted file mode 100644 index 6c423bbc7..000000000 --- a/docs/widgets/ScoreUpdaterState/ramazController.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - ramazController property - ScoreUpdaterState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ramazController
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ramazController property - Null safety -

                          - -
                          - TextEditingController - ramazController -
                          final
                          - -
                          - -
                          -

                          The controller for the Ramaz score TextField/

                          -
                          - - -
                          -

                          Implementation

                          -
                          final TextEditingController ramazController = TextEditingController();
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ScoreUpdaterState/ramazScore.html b/docs/widgets/ScoreUpdaterState/ramazScore.html deleted file mode 100644 index 06fd8cc46..000000000 --- a/docs/widgets/ScoreUpdaterState/ramazScore.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - ramazScore property - ScoreUpdaterState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ramazScore
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ramazScore property - Null safety -

                          - -
                          - int? - ramazScore -
                          read / write
                          - -
                          - -
                          -

                          The value of ramazController as a number.

                          -
                          - - -
                          -

                          Implementation

                          -
                          int? ramazScore;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ScoreUpdaterState/ready.html b/docs/widgets/ScoreUpdaterState/ready.html deleted file mode 100644 index 48c5af058..000000000 --- a/docs/widgets/ScoreUpdaterState/ready.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - ready property - ScoreUpdaterState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ready
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ready property - Null safety -

                          - - - -
                          - -
                          - bool - ready - - -
                          - - -
                          -

                          Whether scores is valid and ready to submit.

                          -
                          - - -
                          -

                          Implementation

                          -
                          bool get ready => ramazController.text.isNotEmpty &&
                          -  otherController.text.isNotEmpty &&
                          -  ramazScore != null &&
                          -  otherScore != null;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ScoreUpdaterState/scores.html b/docs/widgets/ScoreUpdaterState/scores.html deleted file mode 100644 index bea2a7d20..000000000 --- a/docs/widgets/ScoreUpdaterState/scores.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - scores property - ScoreUpdaterState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          scores
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          scores property - Null safety -

                          - - - -
                          - -
                          - Scores - scores - - -
                          - - -
                          -

                          The Scores object represented by this widget.

                          -
                          - - -
                          -

                          Implementation

                          -
                          Scores get scores => Scores(
                          -  ramazScore: ramazScore!,  // only called if [ready] == true
                          -  otherScore: otherScore!,  // only called if [ready] == true
                          -  isHome: widget.game.isHome
                          -);
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SpecialTile-class.html b/docs/widgets/SpecialTile-class.html deleted file mode 100644 index 969b64566..000000000 --- a/docs/widgets/SpecialTile-class.html +++ /dev/null @@ -1,427 +0,0 @@ - - - - - - - - SpecialTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          SpecialTile
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          SpecialTile class - Null safety - -

                          - - -
                          -

                          A decorative border around a special addition to NextClass.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - SpecialTile({required Widget child}) -
                          -
                          - Creates a decorative border. -
                          const
                          -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - child - Widget - -
                          -
                          - The widget to go inside the border. -
                          final
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - createElement() - StatelessElement - - - -
                          -
                          - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SpecialTile/SpecialTile.html b/docs/widgets/SpecialTile/SpecialTile.html deleted file mode 100644 index c6f159a2a..000000000 --- a/docs/widgets/SpecialTile/SpecialTile.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - SpecialTile constructor - SpecialTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          SpecialTile
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          SpecialTile constructor - Null safety -

                          - -
                          const - SpecialTile(
                          1. {required Widget child}
                          2. -
                          ) -
                          - - -
                          -

                          Creates a decorative border.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const SpecialTile({required this.child});
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SpecialTile/build.html b/docs/widgets/SpecialTile/build.html deleted file mode 100644 index 40664f3ff..000000000 --- a/docs/widgets/SpecialTile/build.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - build method - SpecialTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                          -

                          The implementation of this method must only depend on:

                          - -

                          If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                          -

                          See also:

                          -
                            -
                          • StatelessWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build (BuildContext context) => Padding (
                          -	padding: const EdgeInsets.symmetric(horizontal: 10),
                          -	child: Container (
                          -		foregroundDecoration: ShapeDecoration(
                          -			shape: RoundedRectangleBorder(
                          -				side: BorderSide(color: Theme.of(context).primaryColor),
                          -				borderRadius: BorderRadius.circular(20),
                          -			)
                          -		),
                          -		child: child,
                          -	)
                          -);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SpecialTile/child.html b/docs/widgets/SpecialTile/child.html deleted file mode 100644 index c9b40d856..000000000 --- a/docs/widgets/SpecialTile/child.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - child property - SpecialTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          child
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          child property - Null safety -

                          - -
                          - Widget - child -
                          final
                          - -
                          - -
                          -

                          The widget to go inside the border.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Widget child;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons-class.html b/docs/widgets/SportsIcons-class.html deleted file mode 100644 index 7b3b02c69..000000000 --- a/docs/widgets/SportsIcons-class.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - - - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          SportsIcons
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          SportsIcons class - Null safety - -

                          - - -
                          -

                          A collection of icons for sports.

                          -

                          These icons are Strings so that the background color of the icon can be -determined in the build method.

                          -
                          - - - -
                          -

                          Constructors

                          - -
                          -
                          - SportsIcons() -
                          -
                          - -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          read-only, inherited
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toString() - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          inherited
                          - -
                          - -
                          -
                          - - - -
                          -

                          Constants

                          - -
                          -
                          - baseball - → const ImageProvider<Object> - - -
                          -
                          - A baseball icon. - - -
                          - AssetImage("images/icons/baseball.png") -
                          -
                          - -
                          - basketball - → const ImageProvider<Object> - - -
                          -
                          - A basketball icon. - - -
                          - AssetImage("images/icons/basketball.png") -
                          -
                          - -
                          - hockey - → const ImageProvider<Object> - - -
                          -
                          - A hockey icon. - - -
                          - AssetImage("images/icons/hockey.png") -
                          -
                          - -
                          - soccer - → const ImageProvider<Object> - - -
                          -
                          - A soccer icon. - - -
                          - AssetImage("images/icons/soccer.png") -
                          -
                          - -
                          - tennis - → const ImageProvider<Object> - - -
                          -
                          - A tennis icon. - - -
                          - AssetImage("images/icons/tennis.png") -
                          -
                          - -
                          - volleyball - → const ImageProvider<Object> - - -
                          -
                          - A volleyball icon. - - -
                          - AssetImage("images/icons/volleyball.png") -
                          -
                          - -
                          -
                          - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/SportsIcons.html b/docs/widgets/SportsIcons/SportsIcons.html deleted file mode 100644 index 794ef97bb..000000000 --- a/docs/widgets/SportsIcons/SportsIcons.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - SportsIcons constructor - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          SportsIcons
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          SportsIcons constructor - Null safety -

                          - -
                          - SportsIcons() -
                          - - - - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/baseball-constant.html b/docs/widgets/SportsIcons/baseball-constant.html deleted file mode 100644 index de937d5a2..000000000 --- a/docs/widgets/SportsIcons/baseball-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - baseball constant - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          baseball
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          baseball constant - Null safety -

                          - -
                          - ImageProvider<Object> - const baseball - - -
                          - -
                          -

                          A baseball icon.

                          -
                          - - -
                          -

                          Implementation

                          -
                          static const ImageProvider baseball = AssetImage("images/icons/baseball.png");
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/basketball-constant.html b/docs/widgets/SportsIcons/basketball-constant.html deleted file mode 100644 index 6a560ec25..000000000 --- a/docs/widgets/SportsIcons/basketball-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - basketball constant - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          basketball
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          basketball constant - Null safety -

                          - -
                          - ImageProvider<Object> - const basketball - - -
                          - -
                          -

                          A basketball icon.

                          -
                          - - -
                          -

                          Implementation

                          -
                          static const ImageProvider basketball = AssetImage("images/icons/basketball.png");
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/hashCode.html b/docs/widgets/SportsIcons/hashCode.html deleted file mode 100644 index ce57cfe43..000000000 --- a/docs/widgets/SportsIcons/hashCode.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - hashCode property - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          hashCode
                          - -
                          - -
                          - - - - -
                          -
                          -

                          hashCode property - Null safety -

                          - - - -
                          - -
                          - int - hashCode -
                          inherited
                          - -
                          - - -
                          -

                          The hash code for this object.

                          -

                          A hash code is a single integer which represents the state of the object -that affects operator == comparisons.

                          -

                          All objects have hash codes. -The default hash code implemented by Object -represents only the identity of the object, -the same way as the default operator == implementation only considers objects -equal if they are identical (see identityHashCode).

                          -

                          If operator == is overridden to use the object state instead, -the hash code must also be changed to represent that state, -otherwise the object cannot be used in hash based data structures -like the default Set and Map implementations.

                          -

                          Hash codes must be the same for objects that are equal to each other -according to operator ==. -The hash code of an object should only change if the object changes -in a way that affects equality. -There are no further requirements for the hash codes. -They need not be consistent between executions of the same program -and there are no distribution guarantees.

                          -

                          Objects that are not equal are allowed to have the same hash code. -It is even technically allowed that all instances have the same hash code, -but if clashes happen too often, -it may reduce the efficiency of hash-based data structures -like HashSet or HashMap.

                          -

                          If a subclass overrides hashCode, it should override the -operator == operator as well to maintain consistency.

                          -
                          - - -
                          -

                          Implementation

                          -
                          external int get hashCode;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/hockey-constant.html b/docs/widgets/SportsIcons/hockey-constant.html deleted file mode 100644 index df815100c..000000000 --- a/docs/widgets/SportsIcons/hockey-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - hockey constant - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          hockey
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          hockey constant - Null safety -

                          - -
                          - ImageProvider<Object> - const hockey - - -
                          - -
                          -

                          A hockey icon.

                          -
                          - - -
                          -

                          Implementation

                          -
                          static const ImageProvider hockey = AssetImage("images/icons/hockey.png");
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/noSuchMethod.html b/docs/widgets/SportsIcons/noSuchMethod.html deleted file mode 100644 index b3de15b81..000000000 --- a/docs/widgets/SportsIcons/noSuchMethod.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - noSuchMethod method - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          noSuchMethod
                          - -
                          - -
                          - - - - -
                          -
                          -

                          noSuchMethod method - Null safety -

                          - -
                          - - -dynamic -noSuchMethod(
                          1. Invocation invocation
                          2. -
                          ) - -
                          inherited
                          - -
                          - -
                          -

                          Invoked when a non-existent method or property is accessed.

                          -

                          A dynamic member invocation can attempt to call a member which -doesn't exist on the receiving object. Example:

                          -
                          dynamic object = 1;
                          -object.add(42); // Statically allowed, run-time error
                          -
                          -

                          This invalid code will invoke the noSuchMethod memthod -of the integer 1 with an Invocation representing the -.add(42) call and arguments (which then throws).

                          -

                          Classes can override noSuchMethod to provide custom behavior -for such invalid dynamic invocations.

                          -

                          A class with a non-default noSuchMethod invocation can also -omit implementations for members of its interface. -Example:

                          -
                          class MockList<T> implements List<T> {
                          -  noSuchMethod(Invocation invocation) {
                          -    log(invocation);
                          -    super.noSuchMethod(invocation); // Will throw.
                          -  }
                          -}
                          -void main() {
                          -  MockList().add(42);
                          -}
                          -
                          -

                          This code has no compile-time warnings or errors even though -the MockList class has no concrete implementation of -any of the List interface methods. -Calls to List methods are forwarded to noSuchMethod, -so this code will log an invocation similar to -Invocation.method(#add, [42]) and then throw.

                          -

                          If a value is returned from noSuchMethod, -it becomes the result of the original invocation. -If the value is not of a type that can be returned by the original -invocation, a type error occurs at the invocation.

                          -

                          The default behavior is to throw a NoSuchMethodError.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          @pragma("vm:entry-point")
                          -external dynamic noSuchMethod(Invocation invocation);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/operator_equals.html b/docs/widgets/SportsIcons/operator_equals.html deleted file mode 100644 index dc148e629..000000000 --- a/docs/widgets/SportsIcons/operator_equals.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - operator == method - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          operator ==
                          - -
                          - -
                          - - - - -
                          -
                          -

                          operator == method - Null safety -

                          - -
                          - - -bool -operator ==(
                          1. Object other
                          2. -
                          ) - -
                          inherited
                          - -
                          - -
                          -

                          The equality operator.

                          -

                          The default behavior for all Objects is to return true if and -only if this object and other are the same object.

                          -

                          Override this method to specify a different equality relation on -a class. The overriding method must still be an equivalence relation. -That is, it must be:

                          -
                            -
                          • -

                            Total: It must return a boolean for all arguments. It should never throw.

                            -
                          • -
                          • -

                            Reflexive: For all objects o, o == o must be true.

                            -
                          • -
                          • -

                            Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must -either both be true, or both be false.

                            -
                          • -
                          • -

                            Transitive: For all objects o1, o2, and o3, if o1 == o2 and -o2 == o3 are true, then o1 == o3 must be true.

                            -
                          • -
                          -

                          The method should also be consistent over time, -so whether two objects are equal should only change -if at least one of the objects was modified.

                          -

                          If a subclass overrides the equality operator, it should override -the hashCode method as well to maintain consistency.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          external bool operator ==(Object other);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/runtimeType.html b/docs/widgets/SportsIcons/runtimeType.html deleted file mode 100644 index 386e004ef..000000000 --- a/docs/widgets/SportsIcons/runtimeType.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - runtimeType property - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          runtimeType
                          - -
                          - -
                          - - - - -
                          -
                          -

                          runtimeType property - Null safety -

                          - - - -
                          - -
                          - Type - runtimeType -
                          inherited
                          - -
                          - - -
                          -

                          A representation of the runtime type of the object.

                          -
                          - - -
                          -

                          Implementation

                          -
                          external Type get runtimeType;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/soccer-constant.html b/docs/widgets/SportsIcons/soccer-constant.html deleted file mode 100644 index 1f65f761b..000000000 --- a/docs/widgets/SportsIcons/soccer-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - soccer constant - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          soccer
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          soccer constant - Null safety -

                          - -
                          - ImageProvider<Object> - const soccer - - -
                          - -
                          -

                          A soccer icon.

                          -
                          - - -
                          -

                          Implementation

                          -
                          static const ImageProvider soccer = AssetImage("images/icons/soccer.png");
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/tennis-constant.html b/docs/widgets/SportsIcons/tennis-constant.html deleted file mode 100644 index c8ff2068a..000000000 --- a/docs/widgets/SportsIcons/tennis-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - tennis constant - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          tennis
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          tennis constant - Null safety -

                          - -
                          - ImageProvider<Object> - const tennis - - -
                          - -
                          -

                          A tennis icon.

                          -
                          - - -
                          -

                          Implementation

                          -
                          static const ImageProvider tennis = AssetImage("images/icons/tennis.png");
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/toString.html b/docs/widgets/SportsIcons/toString.html deleted file mode 100644 index 8e63dcbbe..000000000 --- a/docs/widgets/SportsIcons/toString.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - toString method - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          toString
                          - -
                          - -
                          - - - - -
                          -
                          -

                          toString method - Null safety -

                          - -
                          - - -String -toString() - -
                          inherited
                          - -
                          - -
                          -

                          A string representation of this object.

                          -

                          Some classes have a default textual representation, -often paired with a static parse function (like int.parse). -These classes will provide the textual representation as -their string represetion.

                          -

                          Other classes have no meaningful textual representation -that a program will care about. -Such classes will typically override toString to provide -useful information when inspecting the object, -mainly for debugging or logging.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          external String toString();
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsIcons/volleyball-constant.html b/docs/widgets/SportsIcons/volleyball-constant.html deleted file mode 100644 index 698baca53..000000000 --- a/docs/widgets/SportsIcons/volleyball-constant.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - volleyball constant - SportsIcons class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          volleyball
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          volleyball constant - Null safety -

                          - -
                          - ImageProvider<Object> - const volleyball - - -
                          - -
                          -

                          A volleyball icon.

                          -
                          - - -
                          -

                          Implementation

                          -
                          static const ImageProvider volleyball = AssetImage("images/icons/volleyball.png");
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsScoreUpdater-class.html b/docs/widgets/SportsScoreUpdater-class.html deleted file mode 100644 index 08f19cbde..000000000 --- a/docs/widgets/SportsScoreUpdater-class.html +++ /dev/null @@ -1,448 +0,0 @@ - - - - - - - - SportsScoreUpdater class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          SportsScoreUpdater
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          SportsScoreUpdater class - Null safety - -

                          - - -
                          -

                          A dialog to update the scores for a SportsGame.

                          -

                          Use SportsScoreUpdater.updateScores to display this widget.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - SportsScoreUpdater(SportsGame game) -
                          -
                          - Creates a widget to get the scores for game from the user. -
                          const
                          -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - game - SportsGame - -
                          -
                          - The game being edited. [...] -
                          final
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - createElement() - StatefulElement - - - -
                          -
                          - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - createState() - ScoreUpdaterState - - - -
                          -
                          - Creates the mutable state for this widget at a given location in the tree. [...] -
                          override
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - -
                          -

                          Static Methods

                          -
                          -
                          - updateScores(BuildContext context, SportsGame game) - → Future<Scores?> - - - -
                          -
                          - Opens a dialog to prompt the user for the scores of the game. [...] - - -
                          - -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsScoreUpdater/SportsScoreUpdater.html b/docs/widgets/SportsScoreUpdater/SportsScoreUpdater.html deleted file mode 100644 index c7bf3ee24..000000000 --- a/docs/widgets/SportsScoreUpdater/SportsScoreUpdater.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - SportsScoreUpdater constructor - SportsScoreUpdater class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          SportsScoreUpdater
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          SportsScoreUpdater constructor - Null safety -

                          - -
                          const - SportsScoreUpdater(
                          1. SportsGame game
                          2. -
                          ) -
                          - - -
                          -

                          Creates a widget to get the scores for game from the user.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const SportsScoreUpdater(this.game);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsScoreUpdater/createState.html b/docs/widgets/SportsScoreUpdater/createState.html deleted file mode 100644 index c61106e44..000000000 --- a/docs/widgets/SportsScoreUpdater/createState.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - createState method - SportsScoreUpdater class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          createState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          createState method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -ScoreUpdaterState -createState() - -
                          override
                          - -
                          - -
                          -

                          Creates the mutable state for this widget at a given location in the tree.

                          -

                          Subclasses should override this method to return a newly created -instance of their associated State subclass:

                          -
                          @override
                          -_MyState createState() => _MyState();
                          -
                          -

                          The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -ScoreUpdaterState createState() => ScoreUpdaterState();
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsScoreUpdater/game.html b/docs/widgets/SportsScoreUpdater/game.html deleted file mode 100644 index d85e4cb54..000000000 --- a/docs/widgets/SportsScoreUpdater/game.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - game property - SportsScoreUpdater class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          game
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          game property - Null safety -

                          - -
                          - SportsGame - game -
                          final
                          - -
                          - -
                          -

                          The game being edited.

                          -

                          SportsGame.isHome is used to fill Scores.isHome.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final SportsGame game;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsScoreUpdater/updateScores.html b/docs/widgets/SportsScoreUpdater/updateScores.html deleted file mode 100644 index 391cd47cc..000000000 --- a/docs/widgets/SportsScoreUpdater/updateScores.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - updateScores method - SportsScoreUpdater class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          updateScores
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          updateScores method - Null safety -

                          - -
                          - - -Future<Scores?> -updateScores(
                          1. BuildContext context,
                          2. -
                          3. SportsGame game
                          4. -
                          ) - - - -
                          - -
                          -

                          Opens a dialog to prompt the user for the scores of the game.

                          -

                          Returns the scores as inputted.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          static Future<Scores?> updateScores(
                          -	BuildContext context,
                          -	SportsGame game
                          -	) => showDialog<Scores>(
                          -  context: context,
                          -  builder: (_) => SportsScoreUpdater(game),
                          -);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsStats-class.html b/docs/widgets/SportsStats-class.html deleted file mode 100644 index 99aa0ade4..000000000 --- a/docs/widgets/SportsStats-class.html +++ /dev/null @@ -1,452 +0,0 @@ - - - - - - - - SportsStats class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          SportsStats
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          SportsStats class - Null safety - -

                          - - -
                          -

                          A row in a SportsTile that displays a team, their score, -and a part of the date.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - SportsStats({required String team, required String dateTime, int? score}) -
                          -
                          - Creates a row to represent some stats in a SportsTile. -
                          const
                          -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - dateTime - → String - -
                          -
                          - The date or time. [...] -
                          final
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          - score - → int? - -
                          -
                          - The score for team. -
                          final
                          - -
                          - -
                          - team - → String - -
                          -
                          - The team being represented. -
                          final
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - createElement() - StatelessElement - - - -
                          -
                          - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsStats/SportsStats.html b/docs/widgets/SportsStats/SportsStats.html deleted file mode 100644 index 704f19125..000000000 --- a/docs/widgets/SportsStats/SportsStats.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - SportsStats constructor - SportsStats class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          SportsStats
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          SportsStats constructor - Null safety -

                          - -
                          const - SportsStats(
                          1. {required String team,
                          2. -
                          3. required String dateTime,
                          4. -
                          5. int? score}
                          6. -
                          ) -
                          - - -
                          -

                          Creates a row to represent some stats in a SportsTile.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const SportsStats({
                          -  required this.team,
                          -  required this.dateTime,
                          -  this.score,
                          -});
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsStats/build.html b/docs/widgets/SportsStats/build.html deleted file mode 100644 index 2a8820fdc..000000000 --- a/docs/widgets/SportsStats/build.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - build method - SportsStats class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                          -

                          The implementation of this method must only depend on:

                          - -

                          If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                          -

                          See also:

                          -
                            -
                          • StatelessWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build(BuildContext context) => Row(
                          -  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          -  children: [
                          -    Text(team),
                          -    const Spacer(flex: 2),
                          -    Text(score?.toString() ?? ""),
                          -    const Spacer(flex: 3),
                          -    Text(dateTime),
                          -    const Spacer(),
                          -  ]
                          -);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsStats/dateTime.html b/docs/widgets/SportsStats/dateTime.html deleted file mode 100644 index 21c598899..000000000 --- a/docs/widgets/SportsStats/dateTime.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - dateTime property - SportsStats class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          dateTime
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          dateTime property - Null safety -

                          - -
                          - String - dateTime -
                          final
                          - -
                          - -
                          -

                          The date or time.

                          -

                          There are two SportsStats in a SportsTile. The top one shows the date, -and the bottom one shows the time.

                          -

                          This type is a String so it can represent both.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final String dateTime;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsStats/score.html b/docs/widgets/SportsStats/score.html deleted file mode 100644 index 265ee570a..000000000 --- a/docs/widgets/SportsStats/score.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - score property - SportsStats class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          score
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          score property - Null safety -

                          - -
                          - int? - score -
                          final
                          - -
                          - -
                          -

                          The score for team.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final int? score;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsStats/team.html b/docs/widgets/SportsStats/team.html deleted file mode 100644 index 3be4a99d9..000000000 --- a/docs/widgets/SportsStats/team.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - team property - SportsStats class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          team
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          team property - Null safety -

                          - -
                          - String - team -
                          final
                          - -
                          - -
                          -

                          The team being represented.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final String team;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsTile-class.html b/docs/widgets/SportsTile-class.html deleted file mode 100644 index 42788146a..000000000 --- a/docs/widgets/SportsTile-class.html +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - - - SportsTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          SportsTile
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          SportsTile class - Null safety - -

                          - - -
                          -

                          A widget to represent a SportsGame.

                          -

                          If onTap is not null, tapping on the card will allow the user to -input new scores. To keep layers modular, and to be more flexible, -the logic for what to do with game, as well as determining if the user -has the right permissions, is kept separate from this widget.

                          -

                          Instead, a pass onTap to SportsTile().

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - SportsTile(SportsGame game, {VoidCallback? onTap}) -
                          -
                          - Creates a widget to display a SportsGame. -
                          const
                          -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - cardColor - Color? - -
                          -
                          - The color of this widget. [...] -
                          read-only
                          - -
                          - -
                          - game - SportsGame - -
                          -
                          - The game for this widget to represent. -
                          final
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - icon - ImageProvider<Object> - -
                          -
                          - Retrieves the icon for game.sport. [...] -
                          read-only
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - -
                          - onTap - VoidCallback? - -
                          -
                          - What to do when the user taps this tile. [...] -
                          final
                          - -
                          - -
                          - padLength - → int - -
                          -
                          - Determines how long to pad the team names so they align. -
                          read-only
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - createElement() - StatelessElement - - - -
                          -
                          - Creates a StatelessElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - -
                          -

                          Static Methods

                          -
                          -
                          - formatDate(DateTime? date) - → String - - - -
                          -
                          - Formats date into month-day-year form. - - -
                          - -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsTile/SportsTile.html b/docs/widgets/SportsTile/SportsTile.html deleted file mode 100644 index 26bcf37a1..000000000 --- a/docs/widgets/SportsTile/SportsTile.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - SportsTile constructor - SportsTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          SportsTile
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          SportsTile constructor - Null safety -

                          - -
                          const - SportsTile(
                          1. SportsGame game,
                          2. -
                          3. {VoidCallback? onTap}
                          4. -
                          ) -
                          - - -
                          -

                          Creates a widget to display a SportsGame.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const SportsTile(this.game, {this.onTap});
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsTile/build.html b/docs/widgets/SportsTile/build.html deleted file mode 100644 index 3934460c6..000000000 --- a/docs/widgets/SportsTile/build.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - build method - SportsTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method when this widget is inserted into the tree -in a given BuildContext and when the dependencies of this widget change -(e.g., an InheritedWidget referenced by this widget changes). This -method can potentially be called in every frame and should not have any side -effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor and -from the given BuildContext.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. A -given widget might be built with multiple different BuildContext -arguments over time if the widget is moved around the tree or if the -widget is inserted into the tree in multiple places at once.

                          -

                          The implementation of this method must only depend on:

                          - -

                          If a widget's build method is to depend on anything else, use a -StatefulWidget instead.

                          -

                          See also:

                          -
                            -
                          • StatelessWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build(BuildContext context) => SizedBox(
                          -  height: 160,
                          -  child: Card(
                          -    color: cardColor,
                          -    child: InkWell(
                          -      onTap: onTap,
                          -      child: Padding(
                          -        padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
                          -        child: Column(
                          -          children: [
                          -            ListTile(
                          -              leading: CircleAvatar (
                          -                backgroundImage: icon,
                          -                backgroundColor: cardColor ?? Theme.of(context).cardColor,
                          -              ),
                          -              title: Text(game.team),
                          -              subtitle: Text(game.isHome
                          -              	? "${game.opponent} @ Ramaz"
                          -              	: "Ramaz @ ${game.opponent}"
                          -            	),
                          -              trailing: onTap == null ? null : const Icon(Icons.edit),
                          -            ),
                          -            const SizedBox(height: 20),
                          -            SportsStats(
                          -              team: game.awayTeam.padRight(padLength),
                          -              score: game.scores?.getScore(home: false),
                          -              dateTime: formatDate(game.date),
                          -            ),
                          -            const SizedBox(height: 10),
                          -            SportsStats(
                          -              team: game.homeTeam.padRight(padLength),
                          -              score: game.scores?.getScore(home: true),
                          -              dateTime: (game.times).toString(),
                          -            ),
                          -          ]
                          -        )
                          -      ),
                          -    )
                          -  )
                          -);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsTile/cardColor.html b/docs/widgets/SportsTile/cardColor.html deleted file mode 100644 index 8ffe99f02..000000000 --- a/docs/widgets/SportsTile/cardColor.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - cardColor property - SportsTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          cardColor
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          cardColor property - Null safety -

                          - - - -
                          - -
                          - Color? - cardColor - - -
                          - - -
                          -

                          The color of this widget.

                          -

                          If Ramaz won, it's green. -If Ramaz lost, it's red. -If the game was tied, it's a light gray.

                          -

                          This is a great example of why the helper class Scores exists.

                          -
                          - - -
                          -

                          Implementation

                          -
                          Color? get cardColor => game.scores == null ? null :
                          -  game.scores!.didDraw
                          -			? Colors.blueGrey
                          -			: (game.scores!.didWin ? Colors.lightGreen : Colors.red [400]);
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsTile/formatDate.html b/docs/widgets/SportsTile/formatDate.html deleted file mode 100644 index 86b7811ad..000000000 --- a/docs/widgets/SportsTile/formatDate.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - formatDate method - SportsTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          formatDate
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          formatDate method - Null safety -

                          - -
                          - - -String -formatDate(
                          1. DateTime? date
                          2. -
                          ) - - - -
                          - -
                          -

                          Formats date into month-day-year form.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          static String formatDate(DateTime? date) =>
                          -  "${date?.month ?? ' '}-${date?.day ?? ' '}-${date?.year ?? ' '}";
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsTile/game.html b/docs/widgets/SportsTile/game.html deleted file mode 100644 index 81ef21d7b..000000000 --- a/docs/widgets/SportsTile/game.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - game property - SportsTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          game
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          game property - Null safety -

                          - -
                          - SportsGame - game -
                          final
                          - -
                          - -
                          -

                          The game for this widget to represent.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final SportsGame game;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsTile/icon.html b/docs/widgets/SportsTile/icon.html deleted file mode 100644 index 3dcd22cdc..000000000 --- a/docs/widgets/SportsTile/icon.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - icon property - SportsTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          icon
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          icon property - Null safety -

                          - - - -
                          - -
                          - ImageProvider<Object> - icon - - -
                          - - -
                          -

                          Retrieves the icon for game.sport.

                          -

                          This is deliberately kept as a switch-case (with no default) and not a -Map<Sport, ImageProvider> so that static analysis will report any missed -cases. This use case is especially important (as opposed to parts of the -data library which are Maps) because any error here will show up on the -screen, instead of simply sending a bug report.

                          -
                          - - -
                          -

                          Implementation

                          -
                          ImageProvider get icon {
                          -		switch (game.sport) {
                          -			case Sport.baseball: return SportsIcons.baseball;
                          -			case Sport.basketball: return SportsIcons.basketball;
                          -			case Sport.soccer: return SportsIcons.soccer;
                          -			case Sport.hockey: return SportsIcons.hockey;
                          -			case Sport.tennis: return SportsIcons.tennis;
                          -			case Sport.volleyball: return SportsIcons.volleyball;
                          -		}
                          -	}
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsTile/onTap.html b/docs/widgets/SportsTile/onTap.html deleted file mode 100644 index e744177a5..000000000 --- a/docs/widgets/SportsTile/onTap.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - onTap property - SportsTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          onTap
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          onTap property - Null safety -

                          - -
                          - VoidCallback? - onTap -
                          final
                          - -
                          - -
                          -

                          What to do when the user taps this tile.

                          -

                          Only administrators should be allowed to do anything, so this function -should be null if the user is not an admin. However, what to do with -game depends on the context, so is left to the parent widget.

                          -

                          If this is non-null, an edit icon will be shown on this widget.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final VoidCallback? onTap;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/SportsTile/padLength.html b/docs/widgets/SportsTile/padLength.html deleted file mode 100644 index 5b702e5c6..000000000 --- a/docs/widgets/SportsTile/padLength.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - padLength property - SportsTile class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          padLength
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          padLength property - Null safety -

                          - - - -
                          - -
                          - int - padLength - - -
                          - - -
                          -

                          Determines how long to pad the team names so they align.

                          -
                          - - -
                          -

                          Implementation

                          -
                          int get padLength => game.opponent.length > "Ramaz".length
                          -  ? game.opponent.length : "Ramaz".length;
                          -
                          - -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeBuilder.html b/docs/widgets/ThemeBuilder.html deleted file mode 100644 index f7cf61f1b..000000000 --- a/docs/widgets/ThemeBuilder.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - ThemeBuilder typedef - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ThemeBuilder
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ThemeBuilder typedef - Null safety - -

                          - -
                          - - - -Widget -ThemeBuilder(
                          1. BuildContext,
                          2. -
                          3. ThemeData
                          4. -
                          ) - - -
                          - - -
                          -

                          Builds a widget with the given theme.

                          -
                          - - -
                          -

                          Implementation

                          -
                          typedef ThemeBuilder = Widget Function(BuildContext, ThemeData);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChanger-class.html b/docs/widgets/ThemeChanger-class.html deleted file mode 100644 index 1fd50b11c..000000000 --- a/docs/widgets/ThemeChanger-class.html +++ /dev/null @@ -1,513 +0,0 @@ - - - - - - - - ThemeChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ThemeChanger
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ThemeChanger class - Null safety - -

                          - - -
                          -

                          A widget to change the theme.

                          -

                          There are three ways to change the theme:

                          -
                            -
                          1. -

                            By theme: set a new theme (as a ThemeData) with -ThemeChanger.of(context).theme = newTheme. See ThemeChangerState.theme

                            -
                          2. -
                          3. -

                            By key: pass a map of themes to ThemeChanger() as themes and call -ThemeChanger.of(context).themeName = key. See -ThemeChangerState.themeName.

                            -
                          4. -
                          5. -

                            By brightness: pass in a light theme, dark theme, and default brightness -to ThemeChanger() and call -ThemeChanger.of(context).brightness = brightness. See -ThemeChangerState.brightness.

                            -
                          6. -
                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - ThemeChanger({required ThemeBuilder builder, required Brightness defaultBrightness, required ThemeData light, required ThemeData dark, Map<String, ThemeData> themes = const {}}) -
                          -
                          - Creates a widget to change the theme. -
                          const
                          -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - builder - ThemeBuilder - -
                          -
                          - The function that builds the widgets from the theme. -
                          final
                          - -
                          - -
                          - dark - ThemeData - -
                          -
                          - The dark theme. [...] -
                          final
                          - -
                          - -
                          - defaultBrightness - Brightness - -
                          -
                          - The default brightness to use with light and dark. -
                          final
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          @nonVirtual, read-only, inherited
                          - -
                          - -
                          - key - Key? - -
                          -
                          - Controls how one widget replaces another widget in the tree. [...] -
                          final, inherited
                          - -
                          - -
                          - light - ThemeData - -
                          -
                          - The light theme. [...] -
                          final
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          - themes - → Map<String, ThemeData> - -
                          -
                          - A collection of predefined themes. [...] -
                          final
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - createElement() - StatefulElement - - - -
                          -
                          - Creates a StatefulElement to manage this widget's location in the tree. [...] -
                          inherited
                          - -
                          - -
                          - createState() - ThemeChangerState - - - -
                          -
                          - Creates the mutable state for this widget at a given location in the tree. [...] -
                          override
                          - -
                          - -
                          - debugDescribeChildren() - → List<DiagnosticsNode> - - - -
                          -
                          - Returns a list of DiagnosticsNode objects describing this node's -children. [...] -
                          @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a string representation of this node and its descendants. [...] -
                          inherited
                          - -
                          - -
                          - toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) - → String - - - -
                          -
                          - Returns a one-line detailed description of the object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A short, textual description of this widget. -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          @nonVirtual, inherited
                          - -
                          - -
                          -
                          - - -
                          -

                          Static Methods

                          -
                          -
                          - of(BuildContext context) - ThemeChangerState - - - -
                          -
                          - Gets the ThemeChangerState from a BuildContext. [...] - - -
                          - -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChanger/ThemeChanger.html b/docs/widgets/ThemeChanger/ThemeChanger.html deleted file mode 100644 index b4a76dc70..000000000 --- a/docs/widgets/ThemeChanger/ThemeChanger.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - ThemeChanger constructor - ThemeChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ThemeChanger
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ThemeChanger constructor - Null safety -

                          - -
                          const - ThemeChanger(
                          1. {required ThemeBuilder builder,
                          2. -
                          3. required Brightness defaultBrightness,
                          4. -
                          5. required ThemeData light,
                          6. -
                          7. required ThemeData dark,
                          8. -
                          9. Map<String, ThemeData> themes = const {}}
                          10. -
                          ) -
                          - - -
                          -

                          Creates a widget to change the theme.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          const ThemeChanger ({
                          -	required this.builder,
                          -	required this.defaultBrightness,
                          -	required this.light,
                          -	required this.dark,
                          -	this.themes = const {},
                          -});
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChanger/builder.html b/docs/widgets/ThemeChanger/builder.html deleted file mode 100644 index 976456024..000000000 --- a/docs/widgets/ThemeChanger/builder.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - builder property - ThemeChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          builder
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          builder property - Null safety -

                          - -
                          - ThemeBuilder - builder -
                          final
                          - -
                          - -
                          -

                          The function that builds the widgets from the theme.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final ThemeBuilder builder;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChanger/createState.html b/docs/widgets/ThemeChanger/createState.html deleted file mode 100644 index 1f2a9d88e..000000000 --- a/docs/widgets/ThemeChanger/createState.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - createState method - ThemeChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          createState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          createState method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -ThemeChangerState -createState() - -
                          override
                          - -
                          - -
                          -

                          Creates the mutable state for this widget at a given location in the tree.

                          -

                          Subclasses should override this method to return a newly created -instance of their associated State subclass:

                          -
                          @override
                          -_MyState createState() => _MyState();
                          -
                          -

                          The framework can call this method multiple times over the lifetime of -a StatefulWidget. For example, if the widget is inserted into the tree -in multiple locations, the framework will create a separate State object -for each location. Similarly, if the widget is removed from the tree and -later inserted into the tree again, the framework will call createState -again to create a fresh State object, simplifying the lifecycle of -State objects.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -ThemeChangerState createState() => ThemeChangerState();
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChanger/dark.html b/docs/widgets/ThemeChanger/dark.html deleted file mode 100644 index d98c822c4..000000000 --- a/docs/widgets/ThemeChanger/dark.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - dark property - ThemeChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          dark
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          dark property - Null safety -

                          - -
                          - ThemeData - dark -
                          final
                          - -
                          - -
                          -

                          The dark theme.

                          -

                          To switch between themes, change ThemeChangerState.brightness with -ThemeChanger.of(context).brightness = newBrightness.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final ThemeData dark;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChanger/defaultBrightness.html b/docs/widgets/ThemeChanger/defaultBrightness.html deleted file mode 100644 index 1e6cda6bf..000000000 --- a/docs/widgets/ThemeChanger/defaultBrightness.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - defaultBrightness property - ThemeChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          defaultBrightness
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          defaultBrightness property - Null safety -

                          - -
                          - Brightness - defaultBrightness -
                          final
                          - -
                          - -
                          -

                          The default brightness to use with light and dark.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Brightness defaultBrightness;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChanger/light.html b/docs/widgets/ThemeChanger/light.html deleted file mode 100644 index b07ca08f9..000000000 --- a/docs/widgets/ThemeChanger/light.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - light property - ThemeChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          light
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          light property - Null safety -

                          - -
                          - ThemeData - light -
                          final
                          - -
                          - -
                          -

                          The light theme.

                          -

                          To switch between themes, change ThemeChangerState.brightness with -ThemeChanger.of(context).brightness = newBrightness.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final ThemeData light;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChanger/of.html b/docs/widgets/ThemeChanger/of.html deleted file mode 100644 index 23fcab6a0..000000000 --- a/docs/widgets/ThemeChanger/of.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - of method - ThemeChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          of
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          of method - Null safety -

                          - -
                          - - -ThemeChangerState -of(
                          1. BuildContext context
                          2. -
                          ) - - - -
                          - -
                          -

                          Gets the ThemeChangerState from a BuildContext.

                          -

                          Use this function to switch the theme.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          static ThemeChangerState of(BuildContext context) {
                          -	final state = context.findAncestorStateOfType<ThemeChangerState>();
                          -	if (state == null) {
                          -		throw StateError("No theme changer found in the widget tree");
                          -	} else {
                          -		return state;
                          -	}
                          -}
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChanger/themes.html b/docs/widgets/ThemeChanger/themes.html deleted file mode 100644 index 474174288..000000000 --- a/docs/widgets/ThemeChanger/themes.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - themes property - ThemeChanger class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          themes
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          themes property - Null safety -

                          - -
                          - Map<String, ThemeData> - themes -
                          final
                          - -
                          - -
                          -

                          A collection of predefined themes.

                          -

                          To switch between themes, change ThemeChangerState.themeName with -ThemeChanger.of(context).themeName = key.

                          -
                          - - -
                          -

                          Implementation

                          -
                          final Map<String, ThemeData> themes;
                          -
                          -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChangerState-class.html b/docs/widgets/ThemeChangerState-class.html deleted file mode 100644 index a3c17e49f..000000000 --- a/docs/widgets/ThemeChangerState-class.html +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - ThemeChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ThemeChangerState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ThemeChangerState class - Null safety - -

                          - - -
                          -

                          The state for a ThemeChanger.

                          -

                          This class has properties that control the theme.

                          -
                          - - -
                          -
                          -
                          Inheritance
                          -
                          - - - - - -
                          -
                          - -
                          -

                          Constructors

                          - -
                          -
                          - ThemeChangerState() -
                          -
                          - -
                          -
                          -
                          - -
                          -

                          Properties

                          - -
                          -
                          - brightness - Brightness - -
                          -
                          - The current brightness. [...] -
                          read / write
                          - -
                          - -
                          - context - BuildContext - -
                          -
                          - The location in the tree where this widget builds. [...] -
                          read-only, inherited
                          - -
                          - -
                          - hashCode - → int - -
                          -
                          - The hash code for this object. [...] -
                          read-only, inherited
                          - -
                          - -
                          - mounted - → bool - -
                          -
                          - Whether this State object is currently in a tree. [...] -
                          read-only, inherited
                          - -
                          - -
                          - runtimeType - → Type - -
                          -
                          - A representation of the runtime type of the object. -
                          read-only, inherited
                          - -
                          - -
                          - theme - ThemeData - -
                          -
                          - The current theme. [...] -
                          read / write
                          - -
                          - -
                          - themeName - ↔ String? - -
                          -
                          - The name of the theme. [...] -
                          read / write
                          - -
                          - -
                          - widget - ThemeChanger - -
                          -
                          - The current configuration. [...] -
                          read-only, inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Methods

                          -
                          -
                          - build(BuildContext context) - Widget - - - -
                          -
                          - Describes the part of the user interface represented by this widget. [...] -
                          override
                          - -
                          - -
                          - deactivate() - → void - - - -
                          -
                          - Called when this object is removed from the tree. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - debugFillProperties(DiagnosticPropertiesBuilder properties) - → void - - - -
                          -
                          - Add additional properties associated with the node. [...] -
                          inherited
                          - -
                          - -
                          - didChangeDependencies() - → void - - - -
                          -
                          - Called when a dependency of this State object changes. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - didUpdateWidget(covariant ThemeChanger oldWidget) - → void - - - -
                          -
                          - Called whenever the widget configuration changes. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - dispose() - → void - - - -
                          -
                          - Called when this object is removed from the tree permanently. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - initState() - → void - - - -
                          -
                          - Called when this object is inserted into the tree. [...] -
                          override
                          - -
                          - -
                          - noSuchMethod(Invocation invocation) - → dynamic - - - -
                          -
                          - Invoked when a non-existent method or property is accessed. [...] -
                          inherited
                          - -
                          - -
                          - reassemble() - → void - - - -
                          -
                          - Called whenever the application is reassembled during debugging, for -example during hot reload. [...] -
                          @mustCallSuper, @protected, inherited
                          - -
                          - -
                          - setState(VoidCallback fn) - → void - - - -
                          -
                          - Notify the framework that the internal state of this object has changed. [...] -
                          @protected, inherited
                          - -
                          - -
                          - toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) - DiagnosticsNode - - - -
                          -
                          - Returns a debug representation of the object that is used by debugging -tools and by DiagnosticsNode.toStringDeep. [...] -
                          inherited
                          - -
                          - -
                          - toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) - → String - - - -
                          -
                          - A string representation of this object. [...] -
                          inherited
                          - -
                          - -
                          - toStringShort() - → String - - - -
                          -
                          - A brief description of this object, usually just the runtimeType and the -hashCode. [...] -
                          inherited
                          - -
                          - -
                          -
                          - -
                          -

                          Operators

                          -
                          -
                          - operator ==(Object other) - → bool - - - -
                          -
                          - The equality operator. [...] -
                          inherited
                          - -
                          - -
                          -
                          - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChangerState/ThemeChangerState.html b/docs/widgets/ThemeChangerState/ThemeChangerState.html deleted file mode 100644 index 826233c6b..000000000 --- a/docs/widgets/ThemeChangerState/ThemeChangerState.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - ThemeChangerState constructor - ThemeChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          ThemeChangerState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          ThemeChangerState constructor - Null safety -

                          - -
                          - ThemeChangerState() -
                          - - - - - - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChangerState/brightness.html b/docs/widgets/ThemeChangerState/brightness.html deleted file mode 100644 index 5dcb2bf1e..000000000 --- a/docs/widgets/ThemeChangerState/brightness.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - brightness property - ThemeChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          brightness
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          brightness property - Null safety -

                          - - - -
                          - -
                          - Brightness - brightness - - -
                          - - -
                          -

                          The current brightness.

                          -

                          When changed, the theme will be changed to the appropriate theme (set by -ThemeChanger.light and ThemeChanger.dark).

                          -
                          - - -
                          -

                          Implementation

                          -
                          Brightness get brightness => _brightness;
                          -
                          - -
                          - - - -
                          - -
                          - void - brightness=(Brightness value) - - -
                          - - - - -
                          -

                          Implementation

                          -
                          set brightness(Brightness value) {
                          -	_key = null;
                          -	_brightness = value;
                          -	setState(() => _theme = value == Brightness.light
                          -		? widget.light : widget.dark
                          -	);
                          -}
                          -
                          - -
                          - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChangerState/build.html b/docs/widgets/ThemeChangerState/build.html deleted file mode 100644 index 923dbf20c..000000000 --- a/docs/widgets/ThemeChangerState/build.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - build method - ThemeChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          build
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          build method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -Widget -build(
                          1. BuildContext context
                          2. -
                          ) - -
                          override
                          - -
                          - -
                          -

                          Describes the part of the user interface represented by this widget.

                          -

                          The framework calls this method in a number of different situations. For -example:

                          - -

                          This method can potentially be called in every frame and should not have -any side effects beyond building a widget.

                          -

                          The framework replaces the subtree below this widget with the widget -returned by this method, either by updating the existing subtree or by -removing the subtree and inflating a new subtree, depending on whether the -widget returned by this method can update the root of the existing -subtree, as determined by calling Widget.canUpdate.

                          -

                          Typically implementations return a newly created constellation of widgets -that are configured with information from this widget's constructor, the -given BuildContext, and the internal state of this State object.

                          -

                          The given BuildContext contains information about the location in the -tree at which this widget is being built. For example, the context -provides the set of inherited widgets for this location in the tree. The -BuildContext argument is always the same as the context property of -this State object and will remain the same for the lifetime of this -object. The BuildContext argument is provided redundantly here so that -this method matches the signature for a WidgetBuilder.

                          -

                          Design discussion

                          -

                          Why is the build method on State, and not StatefulWidget?

                          -

                          Putting a Widget build(BuildContext context) method on State rather -than putting a Widget build(BuildContext context, State state) method -on StatefulWidget gives developers more flexibility when subclassing -StatefulWidget.

                          -

                          For example, AnimatedWidget is a subclass of StatefulWidget that -introduces an abstract Widget build(BuildContext context) method for its -subclasses to implement. If StatefulWidget already had a build method -that took a State argument, AnimatedWidget would be forced to provide -its State object to subclasses even though its State object is an -internal implementation detail of AnimatedWidget.

                          -

                          Conceptually, StatelessWidget could also be implemented as a subclass of -StatefulWidget in a similar manner. If the build method were on -StatefulWidget rather than State, that would not be possible anymore.

                          -

                          Putting the build function on State rather than StatefulWidget also -helps avoid a category of bugs related to closures implicitly capturing -this. If you defined a closure in a build function on a -StatefulWidget, that closure would implicitly capture this, which is -the current widget instance, and would have the (immutable) fields of that -instance in scope:

                          -
                          class MyButton extends StatefulWidget {
                          -  ...
                          -  final Color color;
                          -
                          -  @override
                          -  Widget build(BuildContext context, MyButtonState state) {
                          -    ... () { print("color: $color"); } ...
                          -  }
                          -}
                          -
                          -

                          For example, suppose the parent builds MyButton with color being blue, -the $color in the print function refers to blue, as expected. Now, -suppose the parent rebuilds MyButton with green. The closure created by -the first build still implicitly refers to the original widget and the -$color still prints blue even through the widget has been updated to -green.

                          -

                          In contrast, with the build function on the State object, closures -created during build implicitly capture the State instance instead of -the widget instance:

                          -
                          class MyButtonState extends State<MyButton> {
                          -  ...
                          -  @override
                          -  Widget build(BuildContext context) {
                          -    ... () { print("color: ${widget.color}"); } ...
                          -  }
                          -}
                          -
                          -

                          Now when the parent rebuilds MyButton with green, the closure created by -the first build still refers to State object, which is preserved across -rebuilds, but the framework has updated that State object's widget -property to refer to the new MyButton instance and ${widget.color} -prints green, as expected.

                          -

                          See also:

                          -
                            -
                          • StatefulWidget, which contains the discussion on performance considerations.
                          • -
                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -Widget build (BuildContext context) => widget.builder (context, _theme);
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChangerState/initState.html b/docs/widgets/ThemeChangerState/initState.html deleted file mode 100644 index 3e7d7d8f4..000000000 --- a/docs/widgets/ThemeChangerState/initState.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - initState method - ThemeChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          initState
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          initState method - Null safety -

                          - -
                          - -
                          -
                            -
                          1. @override
                          2. -
                          -
                          - -void -initState() - -
                          override
                          - -
                          - -
                          -

                          Called when this object is inserted into the tree.

                          -

                          The framework will call this method exactly once for each State object -it creates.

                          -

                          Override this method to perform initialization that depends on the -location at which this object was inserted into the tree (i.e., context) -or on the widget used to configure this object (i.e., widget).

                          -

                          If a State's build method depends on an object that can itself -change state, for example a ChangeNotifier or Stream, or some -other object to which one can subscribe to receive notifications, then -be sure to subscribe and unsubscribe properly in initState, -didUpdateWidget, and dispose:

                          -
                            -
                          • In initState, subscribe to the object.
                          • -
                          • In didUpdateWidget unsubscribe from the old object and subscribe -to the new one if the updated widget configuration requires -replacing the object.
                          • -
                          • In dispose, unsubscribe from the object.
                          • -
                          -

                          You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this -method. However, didChangeDependencies will be called immediately -following this method, and BuildContext.dependOnInheritedWidgetOfExactType can -be used there.

                          -

                          If you override this, make sure your method starts with a call to -super.initState().

                          -
                          - - - -
                          -

                          Implementation

                          -
                          @override
                          -void initState() {
                          -	super.initState();
                          -	brightness = widget.defaultBrightness;
                          -}
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChangerState/theme.html b/docs/widgets/ThemeChangerState/theme.html deleted file mode 100644 index e5ed1939a..000000000 --- a/docs/widgets/ThemeChangerState/theme.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - theme property - ThemeChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          theme
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          theme property - Null safety -

                          - - - -
                          - -
                          - ThemeData - theme - - -
                          - - -
                          -

                          The current theme.

                          -

                          Changing this will rebuild the widget tree.

                          -
                          - - -
                          -

                          Implementation

                          -
                          ThemeData get theme => _theme;
                          -
                          - -
                          - - - -
                          - -
                          - void - theme=(ThemeData data) - - -
                          - - - - -
                          -

                          Implementation

                          -
                          set theme(ThemeData data) {
                          -	_brightness = data.brightness;
                          -	_key = null;
                          -	setState(() => _theme = data);
                          -}
                          -
                          - -
                          - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/ThemeChangerState/themeName.html b/docs/widgets/ThemeChangerState/themeName.html deleted file mode 100644 index c6db888df..000000000 --- a/docs/widgets/ThemeChangerState/themeName.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - themeName property - ThemeChangerState class - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          themeName
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          themeName property - Null safety -

                          - - - -
                          - -
                          - String? - themeName - - -
                          - - -
                          -

                          The name of the theme.

                          -

                          This name matches the name associated with the theme in -ThemeChanger.themes. Changing this will update theme to the theme in -ThemeChanger.themes with this key.

                          -

                          When brightness or theme are changed, theme may not exist in -ThemeChanger.themes, in which case themeName will equal null.

                          -
                          - - -
                          -

                          Implementation

                          -
                          String? get themeName => _key;
                          -
                          - -
                          - - - -
                          - -
                          - void - themeName=(String? key) - - -
                          - - - - -
                          -

                          Implementation

                          -
                          set themeName (String? key) {
                          -	setState(() => _theme = (widget.themes) [key] ?? _theme);
                          -	_key = key;
                          -	_brightness = _theme.brightness;
                          -}
                          -
                          - -
                          - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/caseConverter.html b/docs/widgets/caseConverter.html deleted file mode 100644 index 003f6ba86..000000000 --- a/docs/widgets/caseConverter.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - caseConverter function - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          caseConverter
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          caseConverter<T> function - Null safety - -

                          - -
                          - - -T -caseConverter<T>(
                          1. {required bool? value,
                          2. -
                          3. required T onNull,
                          4. -
                          5. required T onTrue,
                          6. -
                          7. required T onFalse}
                          8. -
                          ) - -
                          - -
                          -

                          Returns a custom value if value is null, true, or false.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          T caseConverter<T>({
                          -	required bool? value,
                          -	required T onNull,
                          -	required T onTrue,
                          -	required T onFalse,
                          -}) => value == null ? onNull
                          -	: value ? onTrue : onFalse;
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/pickDate.html b/docs/widgets/pickDate.html deleted file mode 100644 index e5164e97d..000000000 --- a/docs/widgets/pickDate.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - pickDate function - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          pickDate
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          pickDate function - Null safety - -

                          - -
                          - - -Future<DateTime?> -pickDate(
                          1. {required BuildContext context,
                          2. -
                          3. required DateTime initialDate}
                          4. -
                          ) - -
                          - -
                          -

                          Prompts the user to pick a date from the calendar.

                          -

                          The calendar will show the days of the school year.

                          -
                          - - - -
                          -

                          Implementation

                          -
                          Future<DateTime?> pickDate({
                          -	required BuildContext context,
                          -	required DateTime initialDate
                          -}) async {
                          -	final DateTime now = DateTime.now();
                          -	final DateTime beginningOfYear = DateTime(
                          -		now.month > 6 ? now.year : now.year - 1, 9, 1
                          -	);
                          -	final DateTime endOfYear = DateTime (
                          -		now.month > 6 ? now.year + 1 : now.year, 7, 1
                          -	);
                          -	return showDatePicker(
                          -		context: context,
                          -		initialDate: initialDate,
                          -		firstDate: beginningOfYear,
                          -		lastDate: endOfYear,
                          -	);
                          -}
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - diff --git a/docs/widgets/widgets-library.html b/docs/widgets/widgets-library.html deleted file mode 100644 index 450b0ee63..000000000 --- a/docs/widgets/widgets-library.html +++ /dev/null @@ -1,523 +0,0 @@ - - - - - - - - widgets library - Dart API - - - - - - - - - - - - - - - - -
                          - -
                          - - -
                          widgets
                          - -
                          - -
                          - - - - -
                          -
                          - -

                          widgets library - Null safety - -

                          - - -
                          -

                          A collection of widgets to use.

                          -

                          There are three types of widgets in this library:

                          -
                            -
                          1. -

                            Generic widgets: miscellaneous widgets for use all around the app.

                            -
                          2. -
                          3. -

                            Atomic widgets: widgets that represent a single piece of data, (something -from the data library) with a canonic form all around the app. These -widgets usually have InfoTile (defined here) as a base.

                            -
                          4. -
                          5. -

                            Ambient widgets: Inherited widgets that can be accessed anywhere -in the app using BuildContexts.

                            -
                          6. -
                          -
                          - - -
                          -

                          Classes

                          - -
                          -
                          - ActivityTile - -
                          -
                          - A widget that represents an Activity. [...] -
                          - -
                          - BrightnessChanger - -
                          -
                          - A widget to toggle the app between light mode and dark mode. -
                          - -
                          - BrightnessChangerState - -
                          -
                          - -
                          - -
                          - CalendarTile - -
                          -
                          - A cell in a calendar that represents a Day. [...] -
                          - -
                          - ClassList - -
                          -
                          - A list of all the classes for a given day. [...] -
                          - -
                          - ClassPanel - -
                          -
                          - An ExpansionTile for an individual period in a list. -
                          - - -
                          - A footer to display all around the app. [...] -
                          - -
                          - LayoutInfo - -
                          -
                          - Provides info about how this scaffold should be laid out. [...] -
                          - -
                          - LinkIcon - -
                          -
                          - An icon that opens a link when tapped. -
                          - -
                          - LoadingImage - -
                          -
                          - An image that displays a CircularProgressIndicator while loading. [...] -
                          - -
                          - LoadingImageState - -
                          -
                          - A state for a LoadingImage. [...] -
                          - -
                          - Logos - -
                          -
                          - Brand logos used throughout the app. [...] -
                          - -
                          - ModelListener<Model extends ChangeNotifier> - -
                          -
                          - A widget that listens to a ChangeNotifier and rebuilds the widget tree -when ChangeNotifier.notifyListeners. -
                          - -
                          - ModelListenerState<Model extends ChangeNotifier> - -
                          -
                          - A state for a ModelListener. -
                          - - -
                          - Defines a common interface for BottomNavigationBar and NavigationRail. [...] -
                          - -
                          - NextClass - -
                          -
                          - A widget to represent the next class. -
                          - -
                          - PeriodTile - -
                          -
                          - A widget to represent a Period when creating a Schedule. -
                          - -
                          - RamazLogos - -
                          -
                          - Logos belonging to ramaz. -
                          - -
                          - ReminderTile - -
                          -
                          - A widget to represent a Reminder. [...] -
                          - -
                          - ResponsiveBuilder - -
                          -
                          - Builds a widget tree according to a LayoutInfo. -
                          - -
                          - ResponsiveScaffold - -
                          -
                          - A Scaffold that rearranges itself according to the device size. [...] -
                          - -
                          - ScoreUpdaterState - -
                          -
                          - The state for SportsScoreUpdater. [...] -
                          - -
                          - SpecialTile - -
                          -
                          - A decorative border around a special addition to NextClass. -
                          - -
                          - SportsIcons - -
                          -
                          - A collection of icons for sports. [...] -
                          - -
                          - SportsScoreUpdater - -
                          -
                          - A dialog to update the scores for a SportsGame. [...] -
                          - -
                          - SportsStats - -
                          -
                          - A row in a SportsTile that displays a team, their score, -and a part of the date. -
                          - -
                          - SportsTile - -
                          -
                          - A widget to represent a SportsGame. [...] -
                          - -
                          - ThemeChanger - -
                          -
                          - A widget to change the theme. [...] -
                          - -
                          - ThemeChangerState - -
                          -
                          - The state for a ThemeChanger. [...] -
                          - -
                          -
                          - - - - - -
                          -

                          Functions

                          - -
                          -
                          - caseConverter<T>({required bool? value, required T onNull, required T onTrue, required T onFalse}) - → T - - - -
                          -
                          - Returns a custom value if value is null, true, or false. - - -
                          - -
                          - pickDate({required BuildContext context, required DateTime initialDate}) - → Future<DateTime?> - - - -
                          -
                          - Prompts the user to pick a date from the calendar. [...] - - -
                          - -
                          -
                          - -
                          -

                          Enums

                          - -
                          -
                          - BrightnessChangerForm - -
                          -
                          - The form the BrightnessChanger widget should take. -
                          - -
                          -
                          - -
                          -

                          Typedefs

                          - -
                          - -
                          - ModelBuilder<T extends ChangeNotifier>(BuildContext context, T model, Widget? child) - Widget - - - -
                          -
                          - A function to build a widget with a ChangeNotifier subclass. - - -
                          - - - -
                          - ResponsiveWidgetBuilder(BuildContext, LayoutInfo, Widget?) - Widget - - - -
                          -
                          - A function that returns a widget that depends on a LayoutInfo. [...] - - -
                          - - - -
                          - ThemeBuilder(BuildContext, ThemeData) - Widget - - - -
                          -
                          - Builds a widget with the given theme. - - -
                          - - -
                          -
                          - - -
                          - - - -
                          - -
                          - - ramaz - 2.1.1+1 - - - -
                          - - - - - - - - - - - From 7294067b710cd71eb5a76d2c558cefe7748564af Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 14:05:44 -0400 Subject: [PATCH 155/251] Remove merge from doc bot --- .github/workflows/documentation.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index b4e510e46..04e07703f 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -34,7 +34,6 @@ jobs: run: | git pull git switch --track origin/documentation - git merge master - name: Generate documentation run: flutter pub global run dartdoc --ignore 'unresolved-doc-reference,not-implemented,no-documentable-libraries,ambiguous-reexport' --exclude 'dart:async,dart:collection,dart:convert,dart:core,dart:developer,dart:io,dart:isolate,dart:math,dart:typed_data,dart:ui,dart:html,dart:js,dart:ffi,dart:js_util' --quiet --json --output docs --no-auto-include-dependencies --no-validate-links --no-verbose-warnings --no-allow-non-local-warnings From 47fadd2738aec0647fd7a303ab51f2fab2c5e0c1 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 20:07:04 -0400 Subject: [PATCH 156/251] Replaced outdated SpecialBuilder with modern ScheduleBuilder --- .../view/builders/schedule_builder.dart | 189 ++++++---- lib/src/pages/admin/schedules.dart | 4 +- lib/src/pages/builders/schedule_builder.dart | 342 +++++++++++------- lib/src/widgets/atomic/admin/period_tile.dart | 96 ----- lib/widgets.dart | 1 - 5 files changed, 336 insertions(+), 296 deletions(-) delete mode 100644 lib/src/widgets/atomic/admin/period_tile.dart diff --git a/lib/src/models/view/builders/schedule_builder.dart b/lib/src/models/view/builders/schedule_builder.dart index cc4ace982..d0725efa8 100644 --- a/lib/src/models/view/builders/schedule_builder.dart +++ b/lib/src/models/view/builders/schedule_builder.dart @@ -1,91 +1,148 @@ -import "package:flutter/foundation.dart" show ChangeNotifier; +import "package:flutter/material.dart"; import "package:ramaz/data.dart"; -/// A view model to create a [Schedule]. -// ignore: prefer_mixin -class ScheduleBuilderModel with ChangeNotifier { - /// The schedule that this schedule is based on. - Schedule? preset; +extension on TimeOfDay { + Time get ramazTime => Time(hour, minute); - ScheduleBuilderModel([this.preset]) { - usePreset(preset); - } + DateTime get toDateTime => DateTime(200, 01, 01, hour, minute); +} - /// Numbers for the periods. +extension on Time { + TimeOfDay get toFlutterTime => TimeOfDay(hour: hour, minute: minutes); +} + +/// A variant of [Period] with all nullable fields. +/// +/// This class also helps the UI by providing data validation. +class EditablePeriod { + /// The text controller for this period entry. /// - /// Regular periods have numbers, others (eg, homeroom and mincha) are null. - List periods = []; - String? _name; - int _numPeriods = 0; + /// We save the controller instead of the string value to make the workload + /// easier on the UI side. + final TextEditingController controller; - /// The name of this schedule. + /// The time this period starts. + /// + /// Equivalent to [Range.start]. + TimeOfDay? start; + + /// The time this period ends. + /// + /// Equivalent to [Range.end]. + TimeOfDay? end; + + /// Creates an [EditablePeriod] with the period name pre-set. + EditablePeriod({required int index}) : + controller = TextEditingController(text: (index + 1).toString()); + + /// Creates an [EditablePeriod] with the properties of a [Period]. + EditablePeriod.fromPeriod(Period period) : + controller = TextEditingController(text: period.name), + start = period.time.start.toFlutterTime, + end = period.time.end.toFlutterTime; + + /// The name of this period. + String get name => controller.text; + + /// Whether this period is ready to be saved. + bool get isReady => name.isNotEmpty + && start != null + && end != null; + + /// Whether this period has an invalid time. + /// + /// Invalid means anything that will trip up the normal scheduling code. + /// For example, a [start] that's _after_ the [end]. Also, sometimes the UI + /// can suggest the wrong half of the day (AM vs PM) so this catches that too. + bool get hasInvalidTime { + if (start == null || end == null) { + return false; + } + final DateTime startDt = start!.toDateTime; + final DateTime endDt = end!.toDateTime; + return startDt.isAfter(endDt) || endDt.difference(startDt).inHours > 10; + } + + /// Converts this into a regular [Period] object. /// - /// See [Schedule.name]. - String? get name => _name; - set name (String? value) { + /// [isReady] must be true, since [Period] has non-nullable fields. + Period get ramazPeriod => Period.raw( + name: name.trim(), + time: Range(start!.ramazTime, end!.ramazTime), + ); + + /// Disposes this object's [TextEditingController]. + void dispose() => controller.dispose(); +} + +/// A view model for the schedule builder page. +/// +/// This model provides [EditablePeriod]s instead of [Period]s to allow all +/// fields to be null, and also for convenient data validation. +// ignore: prefer_mixin +class ScheduleBuilderModel with ChangeNotifier { + /// The periods in this schedule. + List periods = [ + for (int index = 0; index < 7; index++) + EditablePeriod(index: index), + ]; + + String _name = ""; + + /// The name of this schedule. + String get name => _name; + set name(String value) { _name = value; notifyListeners(); } - /// The amount of periods. + /// Whether this schedule is ready to save. + bool get isReady => name.isNotEmpty && periods + .every((EditablePeriod period) => period.isReady); + + /// The finished schedule. /// - /// Grows and trims [periods] as necessary. This is [Schedule.periods.length]. - int get numPeriods => _numPeriods; - set numPeriods (int value) { - if (value == 0) { - periods.clear(); - } else if (value < numPeriods) { - periods.removeRange(value, periods.length); - } else if (_numPeriods == 0) { - periods.add( - const Period.raw(name: "1", time: Range(Time(8, 00), Time(8, 50))) - ); - } else { - final Range prev = periods [value - 2].time; - periods.add( - Period.raw( - name: value.toString(), - time: Range( - Time(prev.end.hour + 1, 0), - Time(prev.end.hour + 2, 0) - ) - ) - ); - } - _numPeriods = value; + /// [isReady] must be true, since this calls [EditablePeriod.ramazPeriod]. + Schedule get schedule => Schedule( + name: name, + periods: [ + for (final EditablePeriod period in periods) + period.ramazPeriod, + ] + ); + + /// Adds a period to the schedule. + void addPeriod() { + periods.add(EditablePeriod(index: periods.length)); notifyListeners(); } - /// Whether this schedule is ready to be built. - bool get ready => numPeriods > 0 - && periods.isNotEmpty - && name != null && name!.isNotEmpty - && !Schedule.schedules.any((Schedule other) => other.name == name); - - /// The schedule being built. - Schedule get schedule => Schedule(name: name!, periods: periods); - - /// Switches out a time in [periods] with a new time. - void replaceTime(int index, Range range) { - periods [index] = Period.raw( - name: periods [index].name, - time: range, - ); + /// Removes a period from the schedule. + void removePeriod() { + periods.removeLast(); notifyListeners(); } - /// Sets properties of this schedule based on an existing schedule. + /// Copies data from another schedule to this one. /// - /// The schedule can then be fine-tuned afterwards. - void usePreset(Schedule? schedule) { - if (schedule == null) { + /// Allows the user to quickly make small changes to existing schedules. + void usePreset(Schedule? preset) { + if (preset == null) { return; } - preset = schedule; - periods = List.of(schedule.periods); // make a copy - _name = schedule.name; - _numPeriods = schedule.periods.length; + periods = [ + for (final Period period in preset.periods) + EditablePeriod.fromPeriod(period) + ]; notifyListeners(); } + + @override + void dispose() { + for (final EditablePeriod period in periods) { + period.dispose(); + } + super.dispose(); + } } diff --git a/lib/src/pages/admin/schedules.dart b/lib/src/pages/admin/schedules.dart index 0b2244e5c..5480555fe 100644 --- a/lib/src/pages/admin/schedules.dart +++ b/lib/src/pages/admin/schedules.dart @@ -7,7 +7,7 @@ import "package:ramaz/widgets.dart"; /// A page to show the admin's custom schedules. class AdminSchedulesPage extends StatelessWidget { - + /// Creates a page for admins to manage schedules. const AdminSchedulesPage(); // If the user is on this page, they are an admin. @@ -45,7 +45,7 @@ class AdminSchedulesPage extends StatelessWidget { title: Text(schedule.name), onTap: () async { final Schedule? newSchedule = - await ScheduleBuilder.buildSchedule(context, schedule); + await ScheduleBuilder.buildSchedule(context, preset: schedule); if (newSchedule != null) { await model.createSchedule(newSchedule); } diff --git a/lib/src/pages/builders/schedule_builder.dart b/lib/src/pages/builders/schedule_builder.dart index 1afddab0e..e394918da 100644 --- a/lib/src/pages/builders/schedule_builder.dart +++ b/lib/src/pages/builders/schedule_builder.dart @@ -4,153 +4,233 @@ import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; import "package:ramaz/widgets.dart"; -/// A widget to guide the admin in creating a [Schedule]. +import "../drawer.dart"; + +/// Allows the user to input a small integer. +/// +/// Shows a number with + and - buttons nearby. +class IntegerInput extends StatelessWidget { + /// The value being represented. + final int value; + + /// Callback for when the + button is pressed. + final VoidCallback onAdd; + + /// Callback for when the - button is pressed. + final VoidCallback onRemove; + + /// Creates a small integer input widget. + const IntegerInput({ + required this.value, + required this.onAdd, + required this.onRemove, + }); + + @override + Widget build(BuildContext context) => Row( + children: [ + const SizedBox(width: 16), + const Text("Periods: "), + const Spacer(), + TextButton( + onPressed: onRemove, + child: const Icon(Icons.remove), + ), + Text(value.toString()), + TextButton( + onPressed: onAdd, + child: const Icon(Icons.add), + ), + const SizedBox(width: 16), + ] + ); +} + +/// A page to create a [Schedule]. /// -/// The [Schedule] doesn't have to be created from scratch, it can be based on -/// an existing schedule by passing it as a parameter to [ScheduleBuilder()]. +/// This uses [ScheduleBuilderModel] to create a schedule period by period. +/// You can also pass in another schedule to quickly preset all the periods. +/// This allows admins to quickly make small changes to existing schedules. class ScheduleBuilder extends StatefulWidget { - /// Returns the [Schedule] created by this widget. + /// Opens the schedule builder and saves the result. + /// + /// If you pass a schedule, the builder will configure itself to match it. + /// This allows admins to make small changes quickly. static Future buildSchedule( BuildContext context, - [Schedule? preset] - ) => showDialog( - context: context, - builder: (_) => ScheduleBuilder(preset), - ); + {Schedule? preset} + ) => Navigator + .of(context) + .push( + PageRouteBuilder( + transitionDuration: Duration.zero, + pageBuilder: (_, __, ___) => ScheduleBuilder(preset: preset)) + ); - /// The [Schedule] to base this schedule on. + /// The schedule to work off. final Schedule? preset; - /// Creates a widget to guide the user in creating a schedule. - const ScheduleBuilder([this.preset]); + /// Creates a schedule builder, with an optional preset. + const ScheduleBuilder({this.preset}); - @override - ScheduleBuilderState createState() => ScheduleBuilderState(); + @override + ScheduleBuilderState createState() => ScheduleBuilderState(); } -/// A state for a [ScheduleBuilder]. -/// -/// A state is needed to keep the [TextEditingController] from rebuilding. +/// The state for the schedule builder. class ScheduleBuilderState extends State { - /// A controller to hold the name of the [Schedule]. - /// - /// This will be preset with the name of [ScheduleBuilder.preset]. - final TextEditingController controller = TextEditingController(); + /// The model that represents the data. + late ScheduleBuilderModel model; - /// If the name of the schedule conflicts with another one. - /// - /// Names of custom schedules cannot conflict with the default schedules, since - /// users will be confused when the app displays a familiar schedule name, but - /// updates at unusual times. - bool conflicting = false; + /// Triggers whenever the underlying data updates. + void listener() => setState(() {}); @override void initState() { + model = ScheduleBuilderModel() + ..usePreset(widget.preset) + ..addListener(listener); super.initState(); - controller.text = widget.preset?.name ?? ""; } - @override - Widget build(BuildContext context) => ModelListener( - model: () => ScheduleBuilderModel(widget.preset), - builder: (_, ScheduleBuilderModel model, Widget? cancel) => Scaffold( - appBar: AppBar( - title: const Text("Make new schedule"), - actions: [ - IconButton( - icon: const Icon(Icons.sync), - tooltip: "Use preset", - onPressed: () async { - final Schedule? schedule = await showModalBottomSheet( - context: context, - builder: (BuildContext context) => ListView( - children: [ - const SizedBox( - width: double.infinity, - height: 60, - child: Center( - child: Text("Use a preset", textScaleFactor: 1.5), - ), - ), - for (final Schedule schedule in Schedule.schedules) - ListTile( - title: Text (schedule.name), - onTap: () => Navigator.of(context).pop(schedule), - ), - ] - ) - ); - if (schedule != null) { - controller.text = schedule.name; - model.usePreset(schedule); - } - } - ), - ] - ), - floatingActionButton: FloatingActionButton.extended( - label: const Text("Save"), - icon: const Icon(Icons.done), - onPressed: !model.ready ? null : - () => Navigator.of(context).pop(model.schedule), - backgroundColor: model.ready - ? Theme.of(context).accentColor - : Theme.of(context).disabledColor, - ), - body: ListView( - padding: const EdgeInsets.all(15), - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: TextField( - controller: controller, - onChanged: (String value) { - conflicting = Schedule.schedules.any( - (Schedule other) => other.name == value - ); - model.name = value; - }, - textInputAction: TextInputAction.done, - textCapitalization: TextCapitalization.sentences, - decoration: InputDecoration( - labelText: "Name", - hintText: "Name of the schedule", - errorText: conflicting - ? "Name cannot match an existing schedule's name" - : null, - ), - ), - ), - const SizedBox(height: 20), - for (int index = 0; index < model.numPeriods; index++) - PeriodTile( - model: model, - range: model.periods [index].time, - index: index, - ), - Row( - children: [ - TextButton.icon( - icon: const Icon (Icons.add), - label: const Text("Add"), - onPressed: () => model.numPeriods++, - ), - if (model.numPeriods > 0) - TextButton.icon( - icon: const Icon(Icons.remove), - label: const Text("Remove"), - onPressed: () => model.numPeriods-- - ), - ] - ), - if (model.numPeriods == 0) - const Text( - "You can also select a preset by clicking the button on top", - textScaleFactor: 1.5, - textAlign: TextAlign.center, - ), - ] - ) - ) - ); + @override + void dispose() { + model + ..removeListener(listener) + ..dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => ResponsiveScaffold( + drawer: const NavigationDrawer(), + appBar: AppBar(title: const Text("Create schedule")), + bodyBuilder: (_) => Column( + children: [ + Expanded( + child: ListView( + padding: const EdgeInsets.all(16), + children: [ + const TextField( + decoration: InputDecoration(hintText: "Name of schedule"), + ), + const SizedBox(height: 16), + IntegerInput( + value: model.periods.length, + onAdd: model.addPeriod, + onRemove: model.removePeriod, + ), + const SizedBox(height: 24), + DataTable( + columns: const [ + DataColumn(label: Text("Name")), + DataColumn(label: Text("Start")), + DataColumn(label: Text("End")), + DataColumn(label: Text("Class?")), + ], + rows: [ + for (final EditablePeriod period in model.periods) DataRow( + cells: [ + DataCell( + TextField( + controller: period.controller, + onChanged: (_) => setState(() {}), + ), + showEditIcon: true, + ), + DataCell( + Text( + period.start?.format(context) ?? "Start time", + style: !period.hasInvalidTime ? null : TextStyle( + color: Theme.of(context).colorScheme.error + ), + ), + placeholder: period.start == null, + showEditIcon: true, + onTap: () async { + period.start = (await editTime(period.start)) + ?? period.start; + setState(() {}); + } + ), + DataCell( + Text( + period.end?.format(context) ?? "End time", + style: !period.hasInvalidTime ? null : TextStyle( + color: Theme.of(context).colorScheme.error + ), + ), + placeholder: period.end == null, + showEditIcon: true, + onTap: () async { + period.end = (await editTime(period.end)) + ?? period.end; + setState(() {}); + } + ), + DataCell( + int.tryParse(period.name) == null ? Container() + : const Icon(Icons.check, color: Colors.green), + ) + ] + ), + ] + ), + ], + ), + ), + const SizedBox(height: 16), + Row( + children: [ + const SizedBox(width: 16), + TextButton( + onPressed: () => showModalBottomSheet( + context: context, + builder: (_) => ListView( + children: [ + for (final Schedule schedule in Schedule.schedules) + ListTile( + title: Text(schedule.name), + subtitle: Text("${schedule.periods.length} periods"), + onTap: () { + model.usePreset(schedule); + Navigator.of(context).pop(); + } + ) + ] + ) + ), + child: const Text("Build off another schedule"), + ), + const Spacer(), + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("Cancel"), + ), + ElevatedButton( + onPressed: !model.isReady ? null : + () => Navigator.of(context).pop(model.schedule), + child: const Text("Save"), + ), + const SizedBox(width: 16), + ] + ), + const SizedBox(height: 16), + ] + ) + ); + + /// Picks a new time for a period. + /// + /// On desktop, this shows the keyboard-friendly UI. On all other devices, + /// the touch-friendly UI is the default. + Future editTime([TimeOfDay? initialTime]) { + final LayoutInfo layout = LayoutInfo(context); + return showTimePicker( + context: context, + initialTime: initialTime ?? TimeOfDay.now(), + initialEntryMode: layout.isDesktop + ? TimePickerEntryMode.input : TimePickerEntryMode.dial, + ); + } } diff --git a/lib/src/widgets/atomic/admin/period_tile.dart b/lib/src/widgets/atomic/admin/period_tile.dart deleted file mode 100644 index 7190d5ba3..000000000 --- a/lib/src/widgets/atomic/admin/period_tile.dart +++ /dev/null @@ -1,96 +0,0 @@ -import "package:flutter/material.dart"; - -import "package:ramaz/constants.dart"; -import "package:ramaz/data.dart"; -import "package:ramaz/models.dart"; - -/// A widget to represent a [Period] when creating a [Schedule]. -class PeriodTile extends StatelessWidget { - /// The view model to decide the properties of this period. - final ScheduleBuilderModel model; - - /// The times for this period. - final Range range; - - /// Allows [range] to be formatted according to the user's locale. - final TimeOfDay start, end; - - /// The [Activity] for this period. - final Activity? activity; - - /// The index of this period in [ScheduleBuilderModel.periods]. - final int index; - - /// Creates a widget to edit a period in a [Schedule]. - PeriodTile({ - required this.model, - required this.range, - required this.index, - }) : - activity = null, - start = range.start.asTimeOfDay, - end = range.end.asTimeOfDay; - - @override - Widget build(BuildContext context) => SizedBox( - height: 55, - child: Stack ( - children: [ - ListTile( - subtitle: Text(model.periods [index].name), - title: Text.rich( - TextSpan( - children: [ - WidgetSpan( - child: InkWell( - onTap: () async => model.replaceTime( - index, - getRange( - await showTimePicker( - context: context, - initialTime: start, - ) ?? start, - start: true, - ) - ), - child: Text( - start.format(context), - style: const TextStyle(color: Colors.blue) - ), - ), - ), - const TextSpan(text: " -- "), - WidgetSpan( - child: InkWell( - onTap: () async => model.replaceTime( - index, - getRange( - await showTimePicker( - context: context, - initialTime: end, - ) ?? end, - start: false, - ) - ), - child: Text( - end.format(context), - style: const TextStyle(color: Colors.blue) - ), - ), - ), - ] - ) - ), - ) - ] - ) - ); - - /// Creates a [Range] from a [TimeOfDay]. - /// - /// [start] determines if the range starts with [time] or not. - Range getRange(TimeOfDay time, {required bool start}) => Range( - start ? time.asTime : range.start, - start ? range.end : time.asTime, - ); -} diff --git a/lib/widgets.dart b/lib/widgets.dart index c59446d24..387b50f91 100644 --- a/lib/widgets.dart +++ b/lib/widgets.dart @@ -19,7 +19,6 @@ export "src/widgets/ambient/theme_changer.dart"; // Atomic widgets represent a single data object. export "src/widgets/atomic/activity_tile.dart"; export "src/widgets/atomic/admin/calendar_tile.dart"; -export "src/widgets/atomic/admin/period_tile.dart"; export "src/widgets/atomic/next_class.dart"; export "src/widgets/atomic/reminder_tile.dart"; export "src/widgets/atomic/sports_tile.dart"; From 6c00dcbe00544d6d12a4687f8179ed4b3fd12a5c Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 21:33:26 -0400 Subject: [PATCH 157/251] Added git status to doc-bot --- .github/workflows/documentation.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 04e07703f..7c778759d 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -27,6 +27,7 @@ jobs: - name: Debug run: | + flutter pub global run dartdoc --version flutter --version @@ -40,6 +41,7 @@ jobs: - name: Commit files run: | + git status git config --local user.name "github-actions[bot]" git stage --force docs git commit -a -m "Generated documentation" From 6215bf993625e0a50ea4cfcba3aa493cf8170abf Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 21:40:00 -0400 Subject: [PATCH 158/251] Remove docs from .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index f2c317dd5..3697bc295 100644 --- a/.gitignore +++ b/.gitignore @@ -33,7 +33,6 @@ *.txt.yaml todo /data/ -docs/ # Firebase folders: node_modules From 7f0fd0b366cf0481a35a177cdd55564d5287afb4 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 22:09:11 -0400 Subject: [PATCH 159/251] Remove docs before generating --- .github/workflows/documentation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 7c778759d..5cc3904fd 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -27,7 +27,6 @@ jobs: - name: Debug run: | - flutter pub global run dartdoc --version flutter --version @@ -35,6 +34,7 @@ jobs: run: | git pull git switch --track origin/documentation + rm -rf docs - name: Generate documentation run: flutter pub global run dartdoc --ignore 'unresolved-doc-reference,not-implemented,no-documentable-libraries,ambiguous-reexport' --exclude 'dart:async,dart:collection,dart:convert,dart:core,dart:developer,dart:io,dart:isolate,dart:math,dart:typed_data,dart:ui,dart:html,dart:js,dart:ffi,dart:js_util' --quiet --json --output docs --no-auto-include-dependencies --no-validate-links --no-verbose-warnings --no-allow-non-local-warnings From 3055cffdd17197db66aab1cc3f305a0a264d95d8 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 22:21:45 -0400 Subject: [PATCH 160/251] Confirm that docs have been generated. --- .github/workflows/documentation.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 5cc3904fd..eaaff42ed 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -29,6 +29,7 @@ jobs: run: | flutter pub global run dartdoc --version flutter --version + - name: Prepare Git run: | @@ -41,6 +42,9 @@ jobs: - name: Commit files run: | + ls + cd docs + cd .. git status git config --local user.name "github-actions[bot]" git stage --force docs From 1fa49767ec75c9bb7846e4b13e85728d90474bc4 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 22:33:35 -0400 Subject: [PATCH 161/251] Made ScheduleBuilder refresh when name changed --- lib/src/pages/builders/schedule_builder.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/src/pages/builders/schedule_builder.dart b/lib/src/pages/builders/schedule_builder.dart index e394918da..f7e2b2925 100644 --- a/lib/src/pages/builders/schedule_builder.dart +++ b/lib/src/pages/builders/schedule_builder.dart @@ -111,8 +111,9 @@ class ScheduleBuilderState extends State { child: ListView( padding: const EdgeInsets.all(16), children: [ - const TextField( - decoration: InputDecoration(hintText: "Name of schedule"), + TextField( + decoration: const InputDecoration(hintText: "Name of schedule"), + onChanged: (String value) => model.name = value, ), const SizedBox(height: 16), IntegerInput( From cb4eb9366fca2f7b3c564fbe4b555acb409824bb Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 22:54:07 -0400 Subject: [PATCH 162/251] Allow admins to update schedules --- lib/src/models/view/admin_schedules.dart | 9 +++++++++ lib/src/models/view/builders/schedule_builder.dart | 5 ++++- lib/src/pages/admin/schedules.dart | 2 +- lib/src/pages/builders/schedule_builder.dart | 8 +++++++- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/src/models/view/admin_schedules.dart b/lib/src/models/view/admin_schedules.dart index 10553e9f7..a157c1e75 100644 --- a/lib/src/models/view/admin_schedules.dart +++ b/lib/src/models/view/admin_schedules.dart @@ -23,6 +23,15 @@ class AdminScheduleModel with ChangeNotifier { return saveSchedules(); } + Future replaceSchedule(Schedule schedule) async { + schedules + ..removeWhere( + (Schedule other) => other.name == schedule.name + ) + ..add(schedule); + return saveSchedules(); + } + Future deleteSchedule(Schedule schedule) async { schedules.removeWhere( (Schedule other) => other.name == schedule.name diff --git a/lib/src/models/view/builders/schedule_builder.dart b/lib/src/models/view/builders/schedule_builder.dart index d0725efa8..2fafd4d10 100644 --- a/lib/src/models/view/builders/schedule_builder.dart +++ b/lib/src/models/view/builders/schedule_builder.dart @@ -127,7 +127,7 @@ class ScheduleBuilderModel with ChangeNotifier { /// Copies data from another schedule to this one. /// /// Allows the user to quickly make small changes to existing schedules. - void usePreset(Schedule? preset) { + void usePreset(Schedule? preset, {bool includeName = false}) { if (preset == null) { return; } @@ -135,6 +135,9 @@ class ScheduleBuilderModel with ChangeNotifier { for (final Period period in preset.periods) EditablePeriod.fromPeriod(period) ]; + if (includeName) { + _name = preset.name; + } notifyListeners(); } diff --git a/lib/src/pages/admin/schedules.dart b/lib/src/pages/admin/schedules.dart index 5480555fe..02f048a1f 100644 --- a/lib/src/pages/admin/schedules.dart +++ b/lib/src/pages/admin/schedules.dart @@ -47,7 +47,7 @@ class AdminSchedulesPage extends StatelessWidget { final Schedule? newSchedule = await ScheduleBuilder.buildSchedule(context, preset: schedule); if (newSchedule != null) { - await model.createSchedule(newSchedule); + await model.replaceSchedule(newSchedule); } }, ) diff --git a/lib/src/pages/builders/schedule_builder.dart b/lib/src/pages/builders/schedule_builder.dart index f7e2b2925..63dca634a 100644 --- a/lib/src/pages/builders/schedule_builder.dart +++ b/lib/src/pages/builders/schedule_builder.dart @@ -82,14 +82,18 @@ class ScheduleBuilderState extends State { /// The model that represents the data. late ScheduleBuilderModel model; + /// The text controller for the name of the schedule. + late TextEditingController nameController; + /// Triggers whenever the underlying data updates. void listener() => setState(() {}); @override void initState() { model = ScheduleBuilderModel() - ..usePreset(widget.preset) + ..usePreset(widget.preset, includeName: true) ..addListener(listener); + nameController = TextEditingController(text: widget.preset?.name ?? ""); super.initState(); } @@ -98,6 +102,7 @@ class ScheduleBuilderState extends State { model ..removeListener(listener) ..dispose(); + nameController.dispose(); super.dispose(); } @@ -112,6 +117,7 @@ class ScheduleBuilderState extends State { padding: const EdgeInsets.all(16), children: [ TextField( + controller: nameController, decoration: const InputDecoration(hintText: "Name of schedule"), onChanged: (String value) => model.name = value, ), From ed892aeaafb6cd65d23ea1e6510e578e48bf97f6 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 23:00:45 -0400 Subject: [PATCH 163/251] Remove docs before generating --- .github/workflows/documentation.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index eaaff42ed..4b3f39fe5 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -36,6 +36,8 @@ jobs: git pull git switch --track origin/documentation rm -rf docs + git stage docs + git commit -m "Removed documentation" - name: Generate documentation run: flutter pub global run dartdoc --ignore 'unresolved-doc-reference,not-implemented,no-documentable-libraries,ambiguous-reexport' --exclude 'dart:async,dart:collection,dart:convert,dart:core,dart:developer,dart:io,dart:isolate,dart:math,dart:typed_data,dart:ui,dart:html,dart:js,dart:ffi,dart:js_util' --quiet --json --output docs --no-auto-include-dependencies --no-validate-links --no-verbose-warnings --no-allow-non-local-warnings From 70b9ff161153aff1e659194a3a62ca87211bb739 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 23:10:51 -0400 Subject: [PATCH 164/251] Refactored doc-bot --- .github/workflows/documentation.yml | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 4b3f39fe5..654e4b812 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -15,40 +15,31 @@ jobs: steps: - uses: actions/checkout@v2 - uses: dart-lang/setup-dart@v1 + - uses: britannio/action-install-flutter@v1.0 - - name: Install Flutter - uses: britannio/action-install-flutter@v1.0 - - - name: Install dartdoc - run: flutter pub global activate dartdoc - - - name: Install dependencies - run: flutter packages get - - - name: Debug + - name: Setup run: | + flutter packages get + flutter pub global activate dartdoc flutter pub global run dartdoc --version flutter --version - - name: Prepare Git run: | - git pull + git config --local user.name "github-actions[bot]" git switch --track origin/documentation rm -rf docs git stage docs - git commit -m "Removed documentation" + git commit -m "Removed documentation" -m "Will generate new docs" - name: Generate documentation run: flutter pub global run dartdoc --ignore 'unresolved-doc-reference,not-implemented,no-documentable-libraries,ambiguous-reexport' --exclude 'dart:async,dart:collection,dart:convert,dart:core,dart:developer,dart:io,dart:isolate,dart:math,dart:typed_data,dart:ui,dart:html,dart:js,dart:ffi,dart:js_util' --quiet --json --output docs --no-auto-include-dependencies --no-validate-links --no-verbose-warnings --no-allow-non-local-warnings - name: Commit files run: | - ls cd docs cd .. git status - git config --local user.name "github-actions[bot]" git stage --force docs git commit -a -m "Generated documentation" From cb77ff4708d665abff9221a3f06b86614ae027fe Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 19 Apr 2021 23:14:06 -0400 Subject: [PATCH 165/251] Added Git pull to doc-bot --- .github/workflows/documentation.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 654e4b812..4f93c18e8 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -17,16 +17,17 @@ jobs: - uses: dart-lang/setup-dart@v1 - uses: britannio/action-install-flutter@v1.0 - - name: Setup + - name: Flutter Setup run: | flutter packages get flutter pub global activate dartdoc flutter pub global run dartdoc --version flutter --version - - name: Prepare Git + - name: Git Setup run: | git config --local user.name "github-actions[bot]" + git pull git switch --track origin/documentation rm -rf docs git stage docs From cefbe840d0c0d5f69ad300fc87f5cdf646d0a5e9 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 20 Apr 2021 11:18:19 -0400 Subject: [PATCH 166/251] Added missing documentation for data library --- lib/src/data/clubs/club.dart | 34 ++++++++++++++++++++--- lib/src/data/clubs/message.dart | 9 ++++++ lib/src/data/reminder.dart | 1 + lib/src/data/reminders/reminder_time.dart | 1 + lib/src/data/schedule/activity.dart | 1 + 5 files changed, 42 insertions(+), 4 deletions(-) diff --git a/lib/src/data/clubs/club.dart b/lib/src/data/clubs/club.dart index c378771ad..9624af9e0 100644 --- a/lib/src/data/clubs/club.dart +++ b/lib/src/data/clubs/club.dart @@ -1,19 +1,45 @@ import "../contact_info.dart"; import "message.dart"; +/// An after-school club. +/// +/// Users can "register" for clubs and get notifications on certain events. +/// Captains can send messages and mark certain events as important. class Club { + /// The name of the club. final String name; + + /// A short description of the club. final String shortDescription; + + /// A fullfull description of full description of the club. final String description; - final List captains; - final ContactInfo facultyAdvisor; + + /// A URL to an image for this club. final String image; - final List members; - final List messages; + + /// A URL to a form needed to register for the club. final String? formUrl; + + /// Whether a phone number is needed to join the club. final bool phoneNumberRequested; + + /// A list of members in this club. + final List members; + + /// A list of messages sent by the club. + final List messages; + + /// A list of attendance for each member of the club. final Map attendance; + /// The captains of the club. + final List captains; + + /// The faculty advisor for this club. + final ContactInfo facultyAdvisor; + + /// Creates a new club. Club({ required this.name, required this.shortDescription, diff --git a/lib/src/data/clubs/message.dart b/lib/src/data/clubs/message.dart index cf615ad4f..75071ed86 100644 --- a/lib/src/data/clubs/message.dart +++ b/lib/src/data/clubs/message.dart @@ -1,10 +1,19 @@ import "../contact_info.dart"; +/// A message in a message board. +/// +/// This is meant for the clubs feature, but can be used anywhere. class Message { + /// Who sent this message. ContactInfo sender; + + /// When this message was sent. DateTime timestamp; + + /// The content of this message. String body; + /// Creates a new message. Message({ required this.sender, required this.timestamp, diff --git a/lib/src/data/reminder.dart b/lib/src/data/reminder.dart index 51ed63442..35bdfcc29 100644 --- a/lib/src/data/reminder.dart +++ b/lib/src/data/reminder.dart @@ -64,5 +64,6 @@ class Reminder { "hash": hash, }; + /// A unique identifier for this reminder. String get hash => "$message-${time.hash}"; } diff --git a/lib/src/data/reminders/reminder_time.dart b/lib/src/data/reminders/reminder_time.dart index a9e535ca2..2baf4036f 100644 --- a/lib/src/data/reminders/reminder_time.dart +++ b/lib/src/data/reminders/reminder_time.dart @@ -113,5 +113,6 @@ abstract class ReminderTime { @override String toString(); + /// A unique identifier for this reminder. String get hash; } diff --git a/lib/src/data/schedule/activity.dart b/lib/src/data/schedule/activity.dart index 727bbd068..89a59cdbb 100644 --- a/lib/src/data/schedule/activity.dart +++ b/lib/src/data/schedule/activity.dart @@ -133,6 +133,7 @@ class Activity { message: json ["message"] ); + /// A JSON representation of this object. Map toJson() => { "message": message, "type": activityTypeToString(type), From 824733e0116549210720c00c6bce94e199dde279 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 20 Apr 2021 11:41:39 -0400 Subject: [PATCH 167/251] Added missing docs for the pages library --- lib/app.dart | 1 + lib/src/pages/admin/calendar.dart | 8 ++++++++ lib/src/pages/builders/day_builder.dart | 2 ++ lib/src/pages/dashboard.dart | 4 ++++ lib/src/pages/drawer.dart | 12 ++++++++---- lib/src/pages/feedback.dart | 1 + lib/src/pages/home.dart | 15 +++++++++++++++ lib/src/pages/reminders.dart | 5 +++++ lib/src/pages/schedule.dart | 6 ++++++ lib/src/pages/sports.dart | 2 ++ 10 files changed, 52 insertions(+), 4 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 40cb9da36..7459af3e3 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -9,6 +9,7 @@ import "package:ramaz/widgets.dart"; /// The main app widget. class RamLife extends StatelessWidget { + /// Determines whether the user is an admin with the given scope. static bool hasAdminScope(AdminScope scope) => Auth.isSignedIn && Models.instance.user.isAdmin && Models.instance.user.adminScopes!.contains(scope); diff --git a/lib/src/pages/admin/calendar.dart b/lib/src/pages/admin/calendar.dart index a695dfe5b..5352d8441 100644 --- a/lib/src/pages/admin/calendar.dart +++ b/lib/src/pages/admin/calendar.dart @@ -55,12 +55,14 @@ class OldCalendarWidget extends StatelessWidget { /// A page for admins to modify the calendar in the database. class AdminCalendarPage extends StatefulWidget { + /// Creates a page to edit the calendar. const AdminCalendarPage(); @override AdminCalendarState createState() => AdminCalendarState(); } +/// The state for the admin calendar page. class AdminCalendarState extends State { /// The months of the year. /// @@ -78,8 +80,10 @@ class AdminCalendarState extends State { "Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat" ]; + /// The underlying data model. final CalendarEditor model = CalendarEditor(); + /// Rebuilds the widget when the data changes. void listener() => setState(() {}); @override @@ -99,6 +103,9 @@ class AdminCalendarState extends State { } int _currentMonth = DateTime.now().month - 1; + /// The current month being viewed. + /// + /// Changing this will load the month from the database if needed. int get currentMonth => _currentMonth; set currentMonth(int value) { _currentMonth = loopMonth(value); @@ -106,6 +113,7 @@ class AdminCalendarState extends State { setState(() {}); } + /// Allows the user to go from Dec to Jan and vice-versa. int loopMonth(int val) { if (val == 12) { return 0; diff --git a/lib/src/pages/builders/day_builder.dart b/lib/src/pages/builders/day_builder.dart index ffac92908..dc0258e43 100644 --- a/lib/src/pages/builders/day_builder.dart +++ b/lib/src/pages/builders/day_builder.dart @@ -12,11 +12,13 @@ import "package:ramaz/widgets.dart"; /// If [day] is provided, then the fields [DayBuilderModel.name], /// [DayBuilderModel.schedule], are set to [Day.name] and [Day.schedule]. class DayBuilder extends StatelessWidget { + /// The date this widget is modifying. final DateTime date; /// The day to edit, if it already exists. final Day? day; + /// A function to upload the created day to the calendar. final Future Function(Day?) upload; /// Creates a widget to guide the user in creating a [Day] diff --git a/lib/src/pages/dashboard.dart b/lib/src/pages/dashboard.dart index e0ca0b54e..74a5987b0 100644 --- a/lib/src/pages/dashboard.dart +++ b/lib/src/pages/dashboard.dart @@ -3,11 +3,14 @@ import "package:flutter/material.dart"; import "package:ramaz/models.dart"; import "package:ramaz/widgets.dart"; +/// The names of the weekdays. const List weekdayNames = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ]; +/// Shows relevant info about today on the home page. class Dashboard extends NavigationItem { + /// The underlying data representing this widget. final ScheduleModel scheduleModel = Models.instance.schedule; /// The reminders data model. @@ -16,6 +19,7 @@ class Dashboard extends NavigationItem { /// The sports data model. final Sports sportsModel = Models.instance.sports; + /// Creates the dashboard page. Dashboard() : super(label: "Dashboard", icon: const Icon(Icons.dashboard)); diff --git a/lib/src/pages/drawer.dart b/lib/src/pages/drawer.dart index a7ee06f21..149aac2c8 100644 --- a/lib/src/pages/drawer.dart +++ b/lib/src/pages/drawer.dart @@ -12,16 +12,20 @@ class NavigationDrawer extends StatelessWidget { static Future Function() pushRoute(BuildContext context, String name) => () => Navigator.of(context).pushReplacementNamed(name); + /// Creates the drawer. const NavigationDrawer(); + /// Returns the current route name. String? getRouteName(BuildContext context) => ModalRoute.of(context)!.settings.name; - bool get isScheduleAdmin => Models.instance.user - .adminScopes!.contains(AdminScope.calendar); + /// Whether the user is allowed to modify the calendar. + bool get isScheduleAdmin => (Models.instance.user.adminScopes ?? []) + .contains(AdminScope.calendar); - bool get isSportsAdmin => Models.instance.user - .adminScopes!.contains(AdminScope.sports); + /// Whether the user is allowed to modify sports. + bool get isSportsAdmin => (Models.instance.user.adminScopes ?? []) + .contains(AdminScope.sports); @override Widget build (BuildContext context) => ResponsiveBuilder( diff --git a/lib/src/pages/feedback.dart b/lib/src/pages/feedback.dart index cfab488fa..f505f291e 100644 --- a/lib/src/pages/feedback.dart +++ b/lib/src/pages/feedback.dart @@ -8,6 +8,7 @@ import "drawer.dart"; /// A page to submit feedback. class FeedbackPage extends StatelessWidget { + /// Creates the feedback page. const FeedbackPage(); @override diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index 18e804386..579f84231 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -7,21 +7,36 @@ import "drawer.dart"; import "reminders.dart"; import "schedule.dart"; +/// The home page of RamLife. +/// +/// The home page combines different helpful pages. For good UI, limit this to +/// 3-5 pages. Other pages should go in the side menu. class HomePage extends StatefulWidget { + /// Which sub-page should be shown by default. final int? pageIndex; + + /// Creates the home page, starting at a certain sub-page if necessary. + /// + /// Use this for app-wide navigation. For example, to navigate to the reminders + /// page, pass in 2 for [pageIndex]. const HomePage({this.pageIndex}); @override HomePageState createState() => HomePageState(); } +/// The state for the home page. +/// +/// Manages what page is currently loaded. class HomePageState extends State { + /// The different sub-pages. final List navItems = [ Dashboard(), ResponsiveSchedule(), ResponsiveReminders(), ]; + /// Which sub-page is currently active. late int index; @override diff --git a/lib/src/pages/reminders.dart b/lib/src/pages/reminders.dart index 7b95fe595..9b4181afa 100644 --- a/lib/src/pages/reminders.dart +++ b/lib/src/pages/reminders.dart @@ -4,9 +4,14 @@ import "package:ramaz/models.dart"; import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; +/// The reminders page. +/// +/// Allows CRUD operations on reminders. class ResponsiveReminders extends NavigationItem { + /// The data model for reminders. final Reminders model = Models.instance.reminders; + /// Creates the reminders page. ResponsiveReminders() : super(label: "Reminders", icon: const Icon(Icons.notifications)); diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index ecfdca5fc..71c19858c 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -5,9 +5,15 @@ import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; import "package:ramaz/widgets.dart"; +/// Allows users to explore their schedule. +/// +/// Users can use the calendar button to check the schedule for a given date +/// or create a custom [Day] from the drop-down menus. class ResponsiveSchedule extends NavigationItem { + /// The data model for the schedule. final ScheduleViewModel model = ScheduleViewModel(); + /// Creates the schedule page. ResponsiveSchedule() : super(label: "Schedule", icon: const Icon(Icons.schedule)); diff --git a/lib/src/pages/sports.dart b/lib/src/pages/sports.dart index e274060de..475c0668b 100644 --- a/lib/src/pages/sports.dart +++ b/lib/src/pages/sports.dart @@ -64,6 +64,7 @@ class GenericSportsView extends StatelessWidget { ); } +/// Creates the AppBar for the sports page. AppBar buildAppBar(SportsModel model) => AppBar( title: const Text("Sports"), bottom: const TabBar( @@ -243,6 +244,7 @@ void openMenu({ /// A page to show recent and upcoming games to the user. class SportsPage extends StatelessWidget { + /// Creates the sports page. const SportsPage(); @override From 65e1e38607befd72b833069263b65b09915cb216 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 20 Apr 2021 11:52:40 -0400 Subject: [PATCH 168/251] Try adding more comprehensive docs --- .github/workflows/documentation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 4f93c18e8..491645163 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -34,7 +34,7 @@ jobs: git commit -m "Removed documentation" -m "Will generate new docs" - name: Generate documentation - run: flutter pub global run dartdoc --ignore 'unresolved-doc-reference,not-implemented,no-documentable-libraries,ambiguous-reexport' --exclude 'dart:async,dart:collection,dart:convert,dart:core,dart:developer,dart:io,dart:isolate,dart:math,dart:typed_data,dart:ui,dart:html,dart:js,dart:ffi,dart:js_util' --quiet --json --output docs --no-auto-include-dependencies --no-validate-links --no-verbose-warnings --no-allow-non-local-warnings + run: flutter pub global run dartdoc --ignore 'unresolved-doc-reference,not-implemented,no-documentable-libraries,ambiguous-reexport' --exclude 'dart:async,dart:collection,dart:convert,dart:core,dart:developer,dart:io,dart:isolate,dart:math,dart:typed_data,dart:ui,dart:html,dart:js,dart:ffi,dart:js_util' --quiet --json --output docs --no-validate-links --no-verbose-warnings --no-allow-non-local-warnings - name: Commit files run: | From 3364fb1d9eedef188fcb99ee1ea24d98b2984582 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 20 Apr 2021 11:53:40 -0400 Subject: [PATCH 169/251] Added missing docs for the services library --- lib/src/services/cloud_db.dart | 2 ++ lib/src/services/database.dart | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart index b9715bdac..f5fdd5e05 100644 --- a/lib/src/services/cloud_db.dart +++ b/lib/src/services/cloud_db.dart @@ -91,6 +91,7 @@ class CloudDatabase extends Database { static final CollectionReference sportsCollection = firestore.collection("sports"); + /// The clubs collection in the database. static final CollectionReference clubsCollection = firestore.collection("clubs"); @@ -235,6 +236,7 @@ class CloudDatabase extends Database { ] ); + /// Registers the user for a club. Future registerForClub(String clubId, Map json) { final DocumentReference clubDocument = clubsCollection.doc(clubId); final CollectionReference members = clubDocument.collection("members"); diff --git a/lib/src/services/database.dart b/lib/src/services/database.dart index 9ec79afcb..9cb7f4e40 100644 --- a/lib/src/services/database.dart +++ b/lib/src/services/database.dart @@ -78,8 +78,10 @@ abstract class Database extends Service { /// with [calendarKey]. Future getCalendarMonth(int month); + /// Gets all available schedules. Future> getSchedules(); + /// Saves the list of available schedules. Future saveSchedules(List schedules); /// Changes the calendar in the database. From 45b1b556930fbcc7fda40249335a815e733194f8 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 20 Apr 2021 11:59:13 -0400 Subject: [PATCH 170/251] Include more Services in docs --- lib/services.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/services.dart b/lib/services.dart index 613b56782..8e286738e 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -12,7 +12,6 @@ /// For example, retrieving data from a database or file can be abstracted /// to keep the app focused on the content of the data rather than how to /// properly access it. -/// library ramaz_services; import "src/services/crashlytics.dart"; @@ -23,9 +22,16 @@ import "src/services/push_notifications.dart"; import "src/services/service.dart"; export "src/services/auth.dart"; +export "src/services/cloud_db.dart"; export "src/services/crashlytics.dart"; +export "src/services/database.dart"; +export "src/services/databases.dart"; +export "src/services/firebase_core.dart"; +export "src/services/local_db.dart"; export "src/services/notifications.dart"; export "src/services/preferences.dart"; +export "src/services/push_notifications.dart"; +export "src/services/service.dart"; /// Bundles all the services. /// From d740bb5d22e3a14f111046961b81925445f29339 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 20 Apr 2021 12:04:02 -0400 Subject: [PATCH 171/251] Added missing docs for models library --- lib/src/models/view/admin_schedules.dart | 15 +++++++++------ lib/src/models/view/builders/day_builder.dart | 1 + lib/src/models/view/calendar_editor.dart | 7 +++++++ lib/src/models/view/sports.dart | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/lib/src/models/view/admin_schedules.dart b/lib/src/models/view/admin_schedules.dart index a157c1e75..e649f785d 100644 --- a/lib/src/models/view/admin_schedules.dart +++ b/lib/src/models/view/admin_schedules.dart @@ -3,39 +3,42 @@ import "package:flutter/foundation.dart"; import "package:ramaz/data.dart"; import "package:ramaz/services.dart"; +/// A view model for managing the schedules. // ignore: prefer_mixin class AdminScheduleModel with ChangeNotifier { + /// All available schedules. final List schedules = Schedule.schedules; + /// All schedules in JSON form. List get jsonSchedules => [ for (final Schedule schedule in schedules) schedule.toJson() ]; + /// Saves the schedules to the database and refreshes. Future saveSchedules() async { await Services.instance.database.saveSchedules(jsonSchedules); Schedule.schedules = schedules; notifyListeners(); } + /// Creates a new schedule. Future createSchedule(Schedule schedule) async { schedules.add(schedule); return saveSchedules(); } + /// Updates a schedule. Future replaceSchedule(Schedule schedule) async { schedules - ..removeWhere( - (Schedule other) => other.name == schedule.name - ) + ..removeWhere((Schedule other) => other.name == schedule.name) ..add(schedule); return saveSchedules(); } + /// Deletes a schedule Future deleteSchedule(Schedule schedule) async { - schedules.removeWhere( - (Schedule other) => other.name == schedule.name - ); + schedules.removeWhere((Schedule other) => other.name == schedule.name); return saveSchedules(); } } diff --git a/lib/src/models/view/builders/day_builder.dart b/lib/src/models/view/builders/day_builder.dart index 391e07746..7bc504c8c 100644 --- a/lib/src/models/view/builders/day_builder.dart +++ b/lib/src/models/view/builders/day_builder.dart @@ -5,6 +5,7 @@ import "package:ramaz/data.dart"; /// A view model for the creating a new [Day]. // ignore: prefer_mixin class DayBuilderModel with ChangeNotifier { + /// The date being modified. final DateTime date; bool _hasSchool; diff --git a/lib/src/models/view/calendar_editor.dart b/lib/src/models/view/calendar_editor.dart index 1a051af73..65b29018d 100644 --- a/lib/src/models/view/calendar_editor.dart +++ b/lib/src/models/view/calendar_editor.dart @@ -5,9 +5,15 @@ import "package:flutter/foundation.dart" show ChangeNotifier; import "package:ramaz/data.dart"; import "package:ramaz/services.dart"; +/// Bundles a [DateTime] with a [Day] to edit the calendar. class CalendarDay { + /// The date being represented. final DateTime date; + + /// The school day for the given date. Day? schoolDay; + + /// Bundles a date and a [Day] together. CalendarDay({required this.date, required this.schoolDay}); } @@ -48,6 +54,7 @@ class CalendarEditor with ChangeNotifier { : month > 7 ? currentYear - 1 : currentYear ]; + /// Loads a month from the database and pads it accordingly. void loadMonth(int month) => subscriptions [month] ??= Services .instance.database.cloudDatabase.getCalendarStream(month + 1) .listen( diff --git a/lib/src/models/view/sports.dart b/lib/src/models/view/sports.dart index 317908562..981b5c887 100644 --- a/lib/src/models/view/sports.dart +++ b/lib/src/models/view/sports.dart @@ -2,7 +2,7 @@ import "package:flutter/foundation.dart"; import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; -import "package:ramaz/services.dart"; +import "package:ramaz/services.dart" hide AsyncCallback; /// Different ways to sort the sports calendar. enum SortOption { From 867acd52a24015c9827b563e3667d7096110eb15 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 20 Apr 2021 12:07:54 -0400 Subject: [PATCH 172/251] Added missing docs for widgets library --- lib/src/widgets/ambient/brightness_changer.dart | 1 + lib/src/widgets/atomic/admin/calendar_tile.dart | 3 ++- lib/src/widgets/responsive_scaffold/navigation_item.dart | 7 +++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/src/widgets/ambient/brightness_changer.dart b/lib/src/widgets/ambient/brightness_changer.dart index 741ca7d98..d4c99b14d 100644 --- a/lib/src/widgets/ambient/brightness_changer.dart +++ b/lib/src/widgets/ambient/brightness_changer.dart @@ -42,6 +42,7 @@ class BrightnessChanger extends StatefulWidget { BrightnessChangerState createState() => BrightnessChangerState(); } +/// The state for a [BrightnessChanger]. class BrightnessChangerState extends State { bool? _brightness; diff --git a/lib/src/widgets/atomic/admin/calendar_tile.dart b/lib/src/widgets/atomic/admin/calendar_tile.dart index 0722ce353..aee904e09 100644 --- a/lib/src/widgets/atomic/admin/calendar_tile.dart +++ b/lib/src/widgets/atomic/admin/calendar_tile.dart @@ -12,9 +12,10 @@ class CalendarTile extends StatelessWidget{ /// This should not be wrapped in a [GestureDetector]. static const CalendarTile blank = CalendarTile(day: null, date: null); - /// The [Day] represented by this tile. + /// The [Day] this cell represents. final Day? day; + /// The date this cell represents. final DateTime? date; /// Creates a widget to update a day in the calendar diff --git a/lib/src/widgets/responsive_scaffold/navigation_item.dart b/lib/src/widgets/responsive_scaffold/navigation_item.dart index 7f90d141a..8b6230d16 100644 --- a/lib/src/widgets/responsive_scaffold/navigation_item.dart +++ b/lib/src/widgets/responsive_scaffold/navigation_item.dart @@ -25,8 +25,15 @@ abstract class NavigationItem extends StatelessWidget { NavigationRailDestination get navRail => NavigationRailDestination(icon: icon, label: Text(label)); + /// The app bar for this page. AppBar get appBar; + + /// The side sheet for this page. Widget? get sideSheet => null; + + /// The FAB for this page. Widget? get floatingActionButton => null; + + /// The FAB location for this page. FloatingActionButtonLocation? get floatingActionButtonLocation => null; } From 1416063225ab59f3617e15d7c43271cd65c27baf Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 20 Apr 2021 14:54:14 -0400 Subject: [PATCH 173/251] doc-bot: merge new changes before generating docs --- .github/workflows/documentation.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 491645163..5bbaa45c1 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -29,6 +29,7 @@ jobs: git config --local user.name "github-actions[bot]" git pull git switch --track origin/documentation + git merge master rm -rf docs git stage docs git commit -m "Removed documentation" -m "Will generate new docs" From b703cb68989e94001afefde49bcc6066fea80930 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 20 Apr 2021 14:58:23 -0400 Subject: [PATCH 174/251] doc-bot: Allow merge of unrelated histories --- .github/workflows/documentation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 5bbaa45c1..8ee15fe1a 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -29,7 +29,7 @@ jobs: git config --local user.name "github-actions[bot]" git pull git switch --track origin/documentation - git merge master + git merge --allow-unrelated-histories master rm -rf docs git stage docs git commit -m "Removed documentation" -m "Will generate new docs" From f7b57cfaea91cfbee793d205ef1e0c04861424ef Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 21 Apr 2021 16:18:26 -0400 Subject: [PATCH 175/251] Add two GitHub actions (#53) Adds the Analyzer and Documentation bots to GitHub. - Analyzer runs on every PR to make sure that code is always clean - Documentation runs on every push to master to generate documentation Fixes #33 --- .github/workflows/analyze.yml | 33 ++++++++++++++++ .github/workflows/documentation.yml | 59 +++++++++++++++++++---------- 2 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 .github/workflows/analyze.yml diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml new file mode 100644 index 000000000..c2653864d --- /dev/null +++ b/.github/workflows/analyze.yml @@ -0,0 +1,33 @@ +name: Analyzer + +on: pull_request + +jobs: + analyze: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./repo + + steps: + - name: Cache Flutter + id: cache-flutter + uses: actions/cache@v2 + with: + path: flutter/ + key: ${{ runner.os }}-flutter + + - name: Install Flutter + if: steps.cache-flutter.outputs.cache-hit != 'true' + uses: britannio/action-install-flutter@v1.0 + + - uses: actions/checkout@v2 + with: + path: repo # keeps Flutter separate from repo + + # Has to be after checkout since repo won't exist + - name: Add Flutter to path + run: echo "../flutter/bin" >> $GITHUB_PATH + + - name: Analyze + run: flutter analyze --dartdocs diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 8ee15fe1a..c7b3a2354 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -3,7 +3,7 @@ # separate terms of service, privacy policy, and support # documentation. -name: Dart +name: Documentation on: push: @@ -12,28 +12,53 @@ on: jobs: documentation: runs-on: ubuntu-latest + defaults: + run: + working-directory: ./repo steps: + - name: Cache Flutter + id: cache-flutter + uses: actions/cache@v2 + with: + path: flutter/ + key: ${{ runner.os }}-flutter + + - name: Install Flutter + if: steps.cache-flutter.outputs.cache-hit != 'true' + uses: britannio/action-install-flutter@v1.0 + - uses: actions/checkout@v2 - - uses: dart-lang/setup-dart@v1 - - uses: britannio/action-install-flutter@v1.0 - - - name: Flutter Setup - run: | - flutter packages get - flutter pub global activate dartdoc - flutter pub global run dartdoc --version - flutter --version - + with: + fetch-depth: 0 + path: repo # keep Flutter separate + - name: Git Setup run: | git config --local user.name "github-actions[bot]" - git pull + git branch --all git switch --track origin/documentation - git merge --allow-unrelated-histories master + git merge origin/master rm -rf docs git stage docs git commit -m "Removed documentation" -m "Will generate new docs" - + + - name: Add Flutter to path + run: echo "../flutter/bin" >> $GITHUB_PATH + + - name: Flutter Setup + run: | + flutter packages get + flutter pub global activate dartdoc + flutter pub global run dartdoc --version + flutter --version + + - name: Analyze code + run: flutter analyze --dartdocs + + - name: Output error + if: failure() + run: echo "::error The code or is missing documentation. Run flutter analyze --dartdocs" + - name: Generate documentation run: flutter pub global run dartdoc --ignore 'unresolved-doc-reference,not-implemented,no-documentable-libraries,ambiguous-reexport' --exclude 'dart:async,dart:collection,dart:convert,dart:core,dart:developer,dart:io,dart:isolate,dart:math,dart:typed_data,dart:ui,dart:html,dart:js,dart:ffi,dart:js_util' --quiet --json --output docs --no-validate-links --no-verbose-warnings --no-allow-non-local-warnings @@ -46,8 +71,4 @@ jobs: git commit -a -m "Generated documentation" - name: Push commit - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: documentation - + run: git push From 9849726e4020aac592ca803e53130b39d5e6d73d Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 21 Apr 2021 17:16:26 -0400 Subject: [PATCH 176/251] Auto deploy website to Firebase hosting (#54) Adds two new bots: - Builds and Deploys `master` branch to the live Firebase Hosting site - Builds and Deploys any PR to its own preview channel in Firebase Hosting --- .github/workflows/firebase-hosting-merge.yml | 48 +++++++++++++++++++ .../firebase-hosting-pull-request.yml | 44 +++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 .github/workflows/firebase-hosting-merge.yml create mode 100644 .github/workflows/firebase-hosting-pull-request.yml diff --git a/.github/workflows/firebase-hosting-merge.yml b/.github/workflows/firebase-hosting-merge.yml new file mode 100644 index 000000000..ba71f9e28 --- /dev/null +++ b/.github/workflows/firebase-hosting-merge.yml @@ -0,0 +1,48 @@ +# This file was auto-generated by the Firebase CLI +# https://github.com/firebase/firebase-tools + +name: Deploy to Firebase Hosting + +on: + push: + branches: master + +jobs: + build_and_deploy: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./repo + + steps: + - name: Get Flutter from the cache + id: cache-flutter + uses: actions/cache@v2 + with: + path: flutter/ + key: ${{ runner.os }}-flutter + + - name: Install Flutter + if: steps.cache-flutter.outputs.cache-hit != 'true' + uses: britannio/action-install-flutter@v1.0 + + - uses: actions/checkout@v2 + with: + path: repo + + - name: Add Flutter to path + run: echo "../flutter/bin" >> $GITHUB_PATH + + - name: Build web app + run: flutter build web + + - name: Deploy web app + uses: FirebaseExtended/action-hosting-deploy@v0 + with: + repoToken: '${{ secrets.GITHUB_TOKEN }}' + firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_RAMAZ_GO }}' + channelId: live + projectId: ramaz-go + entryPoint: ./repo + env: + FIREBASE_CLI_PREVIEWS: hostingchannels diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml new file mode 100644 index 000000000..66a2d2480 --- /dev/null +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -0,0 +1,44 @@ +# This file was auto-generated by the Firebase CLI +# https://github.com/firebase/firebase-tools + +name: Deploy web app preview +on: pull_request + +jobs: + build_and_preview: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./repo + + steps: + - name: Get Flutter from the cache + id: cache-flutter + uses: actions/cache@v2 + with: + path: flutter/ + key: ${{ runner.os }}-flutter + + - name: Install Flutter + if: steps.cache-flutter.outputs.cache-hit != 'true' + uses: britannio/action-install-flutter@v1.0 + + - uses: actions/checkout@v2 + with: + path: repo + + - name: Add Flutter to path + run: echo "../flutter/bin" >> $GITHUB_PATH + + - name: Build web app + run: flutter build web + + - name: Deploy to preview channel + uses: FirebaseExtended/action-hosting-deploy@v0 + with: + repoToken: '${{ secrets.GITHUB_TOKEN }}' + firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_RAMAZ_GO }}' + projectId: ramaz-go + entryPoint: ./repo + env: + FIREBASE_CLI_PREVIEWS: hostingchannels From 10f02aca020b7f15cd619722d808ec20f79d94d8 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 21 Apr 2021 17:53:26 -0400 Subject: [PATCH 177/251] Auto deploy fix (#55) Now, auto-deploy only works on PRs that are not on a fork. --- .github/workflows/firebase-hosting-pull-request.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml index 66a2d2480..c442c3333 100644 --- a/.github/workflows/firebase-hosting-pull-request.yml +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -6,6 +6,7 @@ on: pull_request jobs: build_and_preview: + if: ${{ github.repository }} == Levi-Lesches/RamLife runs-on: ubuntu-latest defaults: run: From 44f3fdf0b079203ce09810f9cd2c582cc411cc6a Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 21 Apr 2021 18:03:42 -0400 Subject: [PATCH 178/251] Actual fix for auto-deploy (#56) * Actual fix this time --- .github/workflows/firebase-hosting-pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml index c442c3333..a2b4a5cb8 100644 --- a/.github/workflows/firebase-hosting-pull-request.yml +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -6,7 +6,7 @@ on: pull_request jobs: build_and_preview: - if: ${{ github.repository }} == Levi-Lesches/RamLife + if: ${{ github.event.pull_request.head.repo.full_name == 'Levi-Lesches/RamLife' }} runs-on: ubuntu-latest defaults: run: From 02945eb67a627b1632eddf2580ab1bbf407fc4f4 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 21 Apr 2021 19:52:51 -0400 Subject: [PATCH 179/251] Auto-deploy PR now targets test New uploads are at ramlife-test.web.app --- .firebaserc | 11 +++++++- .../firebase-hosting-pull-request.yml | 4 ++- firebase.json | 27 +++++++++++++------ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/.firebaserc b/.firebaserc index e04fa1eea..7f1881331 100644 --- a/.firebaserc +++ b/.firebaserc @@ -1,5 +1,14 @@ { "projects": { "default": "ramaz-go" + }, + "targets": { + "ramaz-go": { + "hosting": { + "test": [ + "ramlife-test" + ] + } + } } -} +} \ No newline at end of file diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml index a2b4a5cb8..4942abdfb 100644 --- a/.github/workflows/firebase-hosting-pull-request.yml +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -1,7 +1,7 @@ # This file was auto-generated by the Firebase CLI # https://github.com/firebase/firebase-tools -name: Deploy web app preview +name: Deploy web preview on: pull_request jobs: @@ -41,5 +41,7 @@ jobs: firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_RAMAZ_GO }}' projectId: ramaz-go entryPoint: ./repo + channelId: live + target: test env: FIREBASE_CLI_PREVIEWS: hostingchannels diff --git a/firebase.json b/firebase.json index 7ecf322ec..d41e0f0c9 100644 --- a/firebase.json +++ b/firebase.json @@ -1,12 +1,23 @@ { - "hosting": { - "public": "build/web", - "ignore": [ - "firebase.json", - "**/.*", - "**/node_modules/**" - ] - }, + "hosting": [ + { + "public": "build/web", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ] + }, + { + "target": "test", + "public": "build/web", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ] + } + ], "emulators": { "firestore": { "port": 8080 From 777356eb5c8e8d392a9d23ac76dc312a2ef38a9f Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 21 Apr 2021 20:04:49 -0400 Subject: [PATCH 180/251] Add main target to Firebase hosting (#59) Now there are two websites: - `main`: https://ramaz-go.web.app - `test`: https://ramlife-test.web.app --- .github/workflows/firebase-hosting-merge.yml | 1 + firebase.json | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/firebase-hosting-merge.yml b/.github/workflows/firebase-hosting-merge.yml index ba71f9e28..5c330f2ef 100644 --- a/.github/workflows/firebase-hosting-merge.yml +++ b/.github/workflows/firebase-hosting-merge.yml @@ -44,5 +44,6 @@ jobs: channelId: live projectId: ramaz-go entryPoint: ./repo + target: main env: FIREBASE_CLI_PREVIEWS: hostingchannels diff --git a/firebase.json b/firebase.json index d41e0f0c9..c5f082e55 100644 --- a/firebase.json +++ b/firebase.json @@ -1,6 +1,7 @@ { "hosting": [ { + "target": "main", "public": "build/web", "ignore": [ "firebase.json", From 383c79bec23797efd20577b6ef35a491c313e7e1 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 21 Apr 2021 20:20:29 -0400 Subject: [PATCH 181/251] Add main as target (#60) Fix Firebase deploy issue with main --- .firebaserc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.firebaserc b/.firebaserc index 7f1881331..3a6f775f0 100644 --- a/.firebaserc +++ b/.firebaserc @@ -7,6 +7,9 @@ "hosting": { "test": [ "ramlife-test" + ], + "main": [ + "ramaz-go" ] } } From bc353b6a35eeea3cb0901093db7cefe0ca410586 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 21 Apr 2021 23:15:57 -0400 Subject: [PATCH 182/251] Create CODEOWNERS Assigns code to certain individuals. These users will be notified and automatically requested to review when a PR is opened in their code. --- .github/CODEOWNERS | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..00357b849 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,22 @@ +# Brayden has backend: data, testing, services and Firebase +/firebase/ @BraydenKO +/lib/data.dart @BraydenKO +/lib/services.dart @BraydenKO +/lib/src/data @BraydenKO +/lib/src/services @BraydenKO +/test/ @BraydenKO + +# David Tarrab has frontend and android +/android/ @DavidTarrab +/images/ @DavidTarrab +/lib/app.dart @DavidTarrab +/lib/main.dart @DavidTarrab +/lib/widgets.dart @DavidTarrab +/lib/pages.dart @DavidTarrab +/lib/src/pages/ @DavidTarrab +/lib/src/widgets/ @DavidTarrab + +# Josh has middleware and ios +/ios/ @todesj +/lib/models.dart @todesj +/lib/src/models/ @todesj From 811aa0798a53ce077d4d75baf5c13555227805c9 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 22 Apr 2021 15:19:56 -0400 Subject: [PATCH 183/251] Test --- this_is_a_test.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 this_is_a_test.txt diff --git a/this_is_a_test.txt b/this_is_a_test.txt new file mode 100644 index 000000000..08c0c263a --- /dev/null +++ b/this_is_a_test.txt @@ -0,0 +1 @@ +"HELLO WORLD" From 4a74e57862fffc9bd1d970caa8aeef651e65a216 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 22 Apr 2021 15:25:51 -0400 Subject: [PATCH 184/251] Deleted test --- this_is_a_test.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 this_is_a_test.txt diff --git a/this_is_a_test.txt b/this_is_a_test.txt deleted file mode 100644 index 08c0c263a..000000000 --- a/this_is_a_test.txt +++ /dev/null @@ -1 +0,0 @@ -"HELLO WORLD" From c08bd2463f6dda8afe40a4738693c305362df5be Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 22 Apr 2021 15:41:40 -0400 Subject: [PATCH 185/251] Delete test --- this_is_a_test.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 this_is_a_test.txt diff --git a/this_is_a_test.txt b/this_is_a_test.txt deleted file mode 100644 index 08c0c263a..000000000 --- a/this_is_a_test.txt +++ /dev/null @@ -1 +0,0 @@ -"HELLO WORLD" From 6612faf0d0bf40bd0797c740634437693740dbf7 Mon Sep 17 00:00:00 2001 From: DavidTarrab <71798870+DavidTarrab@users.noreply.github.com> Date: Mon, 26 Apr 2021 14:40:14 -0400 Subject: [PATCH 186/251] Fixed brightness bug (#65) * Fixed brightness bug Fixed bug where the user's preferred brightness would only change when the drawer was open. * Update lib/src/pages/route_initializer.dart Co-authored-by: Levi Lesches --- lib/src/pages/route_initializer.dart | 7 +++++++ lib/src/widgets/ambient/brightness_changer.dart | 12 ------------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/lib/src/pages/route_initializer.dart b/lib/src/pages/route_initializer.dart index 0fe4e0703..680c44d9b 100644 --- a/lib/src/pages/route_initializer.dart +++ b/lib/src/pages/route_initializer.dart @@ -54,6 +54,13 @@ class RouteInitializerState extends State { try { if (!Services.instance.isReady) { await Services.instance.init(); + + ThemeChanger.of(context).brightness = caseConverter ( + value: Services.instance.prefs.brightness, + onTrue: Brightness.light, + onFalse: Brightness.dark, + onNull: MediaQuery.of(context).platformBrightness, + ); } if (Auth.isSignedIn && !Models.instance.isReady) { await Models.instance.init(); diff --git a/lib/src/widgets/ambient/brightness_changer.dart b/lib/src/widgets/ambient/brightness_changer.dart index d4c99b14d..98120b421 100644 --- a/lib/src/widgets/ambient/brightness_changer.dart +++ b/lib/src/widgets/ambient/brightness_changer.dart @@ -46,18 +46,6 @@ class BrightnessChanger extends StatefulWidget { class BrightnessChangerState extends State { bool? _brightness; - @override - void initState() { - super.initState(); - _brightness = Services.instance.prefs.brightness; - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - Future(() => setBrightness(context, value: _brightness)); - } - /// The icon for this widget. Icon get icon => Icon ( caseConverter( From c3a42d85ca8f4e99dd5f160be6721b322dbed0d0 Mon Sep 17 00:00:00 2001 From: todesj <70974284+todesj@users.noreply.github.com> Date: Tue, 27 Apr 2021 01:50:26 -0400 Subject: [PATCH 187/251] Brought iOS up-to-date for App Store release Hasn't been done since null-safety and old (1.0) Firestore libraries. --- ios/Podfile | 4 +- ios/Podfile.lock | 250 ------------------ ios/Runner.xcodeproj/project.pbxproj | 92 ++----- .../contents.xcworkspacedata | 2 +- pubspec.lock | 6 +- pubspec.yaml | 2 +- 6 files changed, 24 insertions(+), 332 deletions(-) delete mode 100644 ios/Podfile.lock diff --git a/ios/Podfile b/ios/Podfile index 2416f33d0..6b5daf4a0 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '9.0' +platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -28,7 +28,7 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe flutter_ios_podfile_setup target 'Runner' do - pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '6.26.0' + pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '7.11.0' flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index e5929b685..000000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,250 +0,0 @@ -PODS: - - AppAuth (1.4.0): - - AppAuth/Core (= 1.4.0) - - AppAuth/ExternalUserAgent (= 1.4.0) - - AppAuth/Core (1.4.0) - - AppAuth/ExternalUserAgent (1.4.0) - - cloud_firestore (0.14.1-3): - - Firebase/CoreOnly (~> 6.26.0) - - Firebase/Firestore (~> 6.26.0) - - firebase_core - - Flutter - - Firebase/Auth (6.26.0): - - Firebase/CoreOnly - - FirebaseAuth (~> 6.5.3) - - Firebase/CoreOnly (6.26.0): - - FirebaseCore (= 6.7.2) - - Firebase/Crashlytics (6.26.0): - - Firebase/CoreOnly - - FirebaseCrashlytics (~> 4.1.1) - - Firebase/Firestore (6.26.0): - - Firebase/CoreOnly - - FirebaseFirestore (~> 1.15.0) - - Firebase/Messaging (6.26.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 4.4.1) - - firebase_auth (0.18.1-2): - - Firebase/Auth (~> 6.26.0) - - Firebase/CoreOnly (~> 6.26.0) - - firebase_core - - Flutter - - firebase_core (0.5.0-1): - - Firebase/CoreOnly (~> 6.26.0) - - Flutter - - firebase_crashlytics (0.2.1-1): - - Firebase/CoreOnly (~> 6.26.0) - - Firebase/Crashlytics (~> 6.26.0) - - firebase_core - - firebase_messaging (7.0.3): - - Firebase/CoreOnly (~> 6.26.0) - - Firebase/Messaging (~> 6.26.0) - - firebase_core - - Flutter - - FirebaseAnalyticsInterop (1.5.0) - - FirebaseAuth (6.5.3): - - FirebaseAuthInterop (~> 1.0) - - FirebaseCore (~> 6.6) - - GoogleUtilities/AppDelegateSwizzler (~> 6.5) - - GoogleUtilities/Environment (~> 6.5) - - GTMSessionFetcher/Core (~> 1.1) - - FirebaseAuthInterop (1.1.0) - - FirebaseCore (6.7.2): - - FirebaseCoreDiagnostics (~> 1.3) - - FirebaseCoreDiagnosticsInterop (~> 1.2) - - GoogleUtilities/Environment (~> 6.5) - - GoogleUtilities/Logger (~> 6.5) - - FirebaseCoreDiagnostics (1.4.0): - - GoogleDataTransportCCTSupport (~> 3.1) - - GoogleUtilities/Environment (~> 6.5) - - GoogleUtilities/Logger (~> 6.5) - - nanopb (~> 1.30905.0) - - FirebaseCoreDiagnosticsInterop (1.2.0) - - FirebaseCrashlytics (4.1.1): - - FirebaseAnalyticsInterop (~> 1.2) - - FirebaseCore (~> 6.6) - - FirebaseInstallations (~> 1.1) - - GoogleDataTransport (~> 6.1) - - GoogleDataTransportCCTSupport (~> 3.1) - - nanopb (~> 1.30905.0) - - PromisesObjC (~> 1.2) - - FirebaseFirestore (1.15.0) - - FirebaseInstallations (1.3.0): - - FirebaseCore (~> 6.6) - - GoogleUtilities/Environment (~> 6.6) - - GoogleUtilities/UserDefaults (~> 6.6) - - PromisesObjC (~> 1.2) - - FirebaseInstanceID (4.3.4): - - FirebaseCore (~> 6.6) - - FirebaseInstallations (~> 1.0) - - GoogleUtilities/Environment (~> 6.5) - - GoogleUtilities/UserDefaults (~> 6.5) - - FirebaseMessaging (4.4.1): - - FirebaseAnalyticsInterop (~> 1.5) - - FirebaseCore (~> 6.6) - - FirebaseInstanceID (~> 4.3) - - GoogleUtilities/AppDelegateSwizzler (~> 6.5) - - GoogleUtilities/Environment (~> 6.5) - - GoogleUtilities/Reachability (~> 6.5) - - GoogleUtilities/UserDefaults (~> 6.5) - - Protobuf (>= 3.9.2, ~> 3.9) - - Flutter (1.0.0) - - flutter_local_notifications (0.0.1): - - Flutter - - google_sign_in (0.0.1): - - Flutter - - GoogleSignIn (~> 5.0) - - GoogleDataTransport (6.2.1) - - GoogleDataTransportCCTSupport (3.2.0): - - GoogleDataTransport (~> 6.1) - - nanopb (~> 1.30905.0) - - GoogleSignIn (5.0.2): - - AppAuth (~> 1.2) - - GTMAppAuth (~> 1.0) - - GTMSessionFetcher/Core (~> 1.1) - - GoogleUtilities/AppDelegateSwizzler (6.7.2): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (6.7.2): - - PromisesObjC (~> 1.2) - - GoogleUtilities/Logger (6.7.2): - - GoogleUtilities/Environment - - GoogleUtilities/Network (6.7.2): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (6.7.2)" - - GoogleUtilities/Reachability (6.7.2): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (6.7.2): - - GoogleUtilities/Logger - - GTMAppAuth (1.1.0): - - AppAuth/Core (~> 1.4) - - GTMSessionFetcher (~> 1.4) - - GTMSessionFetcher (1.4.0): - - GTMSessionFetcher/Full (= 1.4.0) - - GTMSessionFetcher/Core (1.4.0) - - GTMSessionFetcher/Full (1.4.0): - - GTMSessionFetcher/Core (= 1.4.0) - - nanopb (1.30905.0): - - nanopb/decode (= 1.30905.0) - - nanopb/encode (= 1.30905.0) - - nanopb/decode (1.30905.0) - - nanopb/encode (1.30905.0) - - path_provider (0.0.1): - - Flutter - - PromisesObjC (1.2.11) - - Protobuf (3.13.0) - - shared_preferences (0.0.1): - - Flutter - - url_launcher (0.0.1): - - Flutter - -DEPENDENCIES: - - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) - - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) - - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - - FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `6.26.0`) - - Flutter (from `Flutter`) - - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - - google_sign_in (from `.symlinks/plugins/google_sign_in/ios`) - - path_provider (from `.symlinks/plugins/path_provider/ios`) - - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - - url_launcher (from `.symlinks/plugins/url_launcher/ios`) - -SPEC REPOS: - trunk: - - AppAuth - - Firebase - - FirebaseAnalyticsInterop - - FirebaseAuth - - FirebaseAuthInterop - - FirebaseCore - - FirebaseCoreDiagnostics - - FirebaseCoreDiagnosticsInterop - - FirebaseCrashlytics - - FirebaseInstallations - - FirebaseInstanceID - - FirebaseMessaging - - GoogleDataTransport - - GoogleDataTransportCCTSupport - - GoogleSignIn - - GoogleUtilities - - GTMAppAuth - - GTMSessionFetcher - - nanopb - - PromisesObjC - - Protobuf - -EXTERNAL SOURCES: - cloud_firestore: - :path: ".symlinks/plugins/cloud_firestore/ios" - firebase_auth: - :path: ".symlinks/plugins/firebase_auth/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_crashlytics: - :path: ".symlinks/plugins/firebase_crashlytics/ios" - firebase_messaging: - :path: ".symlinks/plugins/firebase_messaging/ios" - FirebaseFirestore: - :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git - :tag: 6.26.0 - Flutter: - :path: Flutter - flutter_local_notifications: - :path: ".symlinks/plugins/flutter_local_notifications/ios" - google_sign_in: - :path: ".symlinks/plugins/google_sign_in/ios" - path_provider: - :path: ".symlinks/plugins/path_provider/ios" - shared_preferences: - :path: ".symlinks/plugins/shared_preferences/ios" - url_launcher: - :path: ".symlinks/plugins/url_launcher/ios" - -CHECKOUT OPTIONS: - FirebaseFirestore: - :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git - :tag: 6.26.0 - -SPEC CHECKSUMS: - AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 - cloud_firestore: db3dab8f6a348f0f6ec01c3ba911ec5ac5e0df1a - Firebase: 7cf5f9c67f03cb3b606d1d6535286e1080e57eb6 - firebase_auth: 8ae6798925da84bf8745668a73c936b148c1b04d - firebase_core: 00e54a4744164a6b5a250b96dd1ad5afaba7a342 - firebase_crashlytics: d98ee7212fc6a7102c0f775a7cc30cd3f7041f5a - firebase_messaging: 666d9994651b1ecf8c582b52dd913f3fa58c17ef - FirebaseAnalyticsInterop: 3f86269c38ae41f47afeb43ebf32a001f58fcdae - FirebaseAuth: 7047aec89c0b17ecd924a550c853f0c27ac6015e - FirebaseAuthInterop: a0f37ae05833af156e72028f648d313f7e7592e9 - FirebaseCore: f42e5e5f382cdcf6b617ed737bf6c871a6947b17 - FirebaseCoreDiagnostics: 4505e4d4009b1d93f605088ee7d7764d5f0d1c84 - FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850 - FirebaseCrashlytics: a87cce5746d3335995bd18b1b60d073cd05a6920 - FirebaseFirestore: 2cf6944bc538e57c94d8332bae501178edb70727 - FirebaseInstallations: 6f5f680e65dc374397a483c32d1799ba822a395b - FirebaseInstanceID: cef67c4967c7cecb56ea65d8acbb4834825c587b - FirebaseMessaging: 29543feb343b09546ab3aa04d008ee8595b43c44 - Flutter: 0e3d915762c693b495b44d77113d4970485de6ec - flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 - google_sign_in: 6bd214b9c154f881422f5fe27b66aaa7bbd580cc - GoogleDataTransport: 9a8a16f79feffc7f42096743de2a7c4815e84020 - GoogleDataTransportCCTSupport: 489c1265d2c85b68187a83a911913d190012158d - GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 - GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 - GTMAppAuth: 197a8dabfea5d665224aa00d17f164fc2248dab9 - GTMSessionFetcher: 6f5c8abbab8a9bce4bb3f057e317728ec6182b10 - nanopb: c43f40fadfe79e8b8db116583945847910cbabc9 - path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c - PromisesObjC: 8c196f5a328c2cba3e74624585467a557dcb482f - Protobuf: 3dac39b34a08151c6d949560efe3f86134a3f748 - shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d - url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef - -PODFILE CHECKSUM: 0cceffd53e919b13a6eae7e7c3ebfcbec8b672e0 - -COCOAPODS: 1.9.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index f154592ca..66724fdcd 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 46; objects = { /* Begin PBXBuildFile section */ @@ -151,15 +151,12 @@ buildPhases = ( 84A3871B02ECAE1C37386DD1 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, - D9429A6B347AE78FF52D5DB5 /* [CP] Prepare Artifacts */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 19C30BF24B9B3764322558E0 /* [CP] Embed Pods Frameworks */, B95F8B29E8B1475B6CE0DCBC /* [CP] Copy Pods Resources */, - 3834E8522344353A0065EDE5 /* Auto increment Xcode version number */, 03E104E1253E7F040083B7F0 /* ShellScript */, ); buildRules = ( @@ -241,41 +238,6 @@ shellPath = /bin/sh; shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n${PODS_ROOT}/FirebaseCrashlytics/run\n"; }; - 19C30BF24B9B3764322558E0 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 3834E8522344353A0065EDE5 /* Auto increment Xcode version number */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Auto increment Xcode version number"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh $SRCROOT/auto_increment_version.sh\n"; - }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -331,35 +293,21 @@ buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_ROOT}/FirebaseFirestore/FirebaseFirestore/Resources/gRPCCertificates-Cpp.bundle", + "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle", ); name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates-Cpp.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; - D9429A6B347AE78FF52D5DB5 /* [CP] Prepare Artifacts */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-artifacts-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Prepare Artifacts"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-artifacts-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-artifacts.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -434,7 +382,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"${PODS_CONFIGURATION_BUILD_DIR}/BoringSSL-GRPC\"/**", @@ -490,10 +438,7 @@ ); INFOPLIST_FILE = Runner/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -503,6 +448,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.ramaz.ramaz.student-life"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; name = Profile; @@ -552,7 +498,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -599,7 +545,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"${PODS_CONFIGURATION_BUILD_DIR}/BoringSSL-GRPC\"/**", @@ -655,10 +601,7 @@ ); INFOPLIST_FILE = Runner/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -668,6 +611,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.ramaz.ramaz.student-life"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -689,10 +633,7 @@ ); INFOPLIST_FILE = Runner/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -702,6 +643,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.ramaz.ramaz.student-life"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16e..919434a62 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/pubspec.lock b/pubspec.lock index 421af320f..e0e221fdf 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -147,7 +147,7 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.1.0" firebase_core_platform_interface: dependency: transitive description: @@ -168,14 +168,14 @@ packages: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "2.0.2" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "3.0.2" firebase_messaging: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 540fa0994..6ae3fd9d1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: # Firebase/Google cloud_firestore: ^1.0.5 firebase_auth: ^1.0.1 - firebase_crashlytics: ^1.0.0 + firebase_crashlytics: ^2.0.2 firebase_messaging: ^9.0.1 google_sign_in: ^5.0.1 From 2716a4c2b4f378fd567efbcaddbae5a2bd3659fc Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 27 Apr 2021 08:56:24 -0400 Subject: [PATCH 188/251] Reintroduce code to properly initialize brightness --- lib/src/widgets/ambient/brightness_changer.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/src/widgets/ambient/brightness_changer.dart b/lib/src/widgets/ambient/brightness_changer.dart index 98120b421..7632cf7c4 100644 --- a/lib/src/widgets/ambient/brightness_changer.dart +++ b/lib/src/widgets/ambient/brightness_changer.dart @@ -55,6 +55,12 @@ class BrightnessChangerState extends State { onFalse: Icons.brightness_low, ) ); + + @override + void initState() { + super.initState(); + _brightness = Services.instance.prefs.brightness; + } @override Widget build (BuildContext context) { From 3d778b071a21cd7d537f184981fd69ea0ead680e Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 27 Apr 2021 09:42:45 -0400 Subject: [PATCH 189/251] Switch IDB version back to 2 --- lib/src/services/local_db.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index deb5da93f..5db0517f4 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -171,7 +171,7 @@ class LocalDatabase extends Database { try { database = await (await idbFactory).open( "ramaz.db", - version: 3, + version: 2, onUpgradeNeeded: (idb.VersionChangeEvent event) { switch(event.oldVersion) { case 0: event.database From a2ed9a0e9cde3031ecb130572f7ccb27b02877db Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 27 Apr 2021 10:46:15 -0400 Subject: [PATCH 190/251] Fixed login bug --- lib/app.dart | 2 +- lib/src/pages/route_initializer.dart | 5 +++-- lib/src/services/databases.dart | 14 ++++++++------ lib/src/services/local_db.dart | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 7459af3e3..4f4f48412 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -17,7 +17,7 @@ class RamLife extends StatelessWidget { /// The routes for this app. static final Map routes = { Routes.login: (_) => RouteInitializer( - onError: null , + onError: null, isAllowed: () => true, child: const Login(), ), diff --git a/lib/src/pages/route_initializer.dart b/lib/src/pages/route_initializer.dart index 680c44d9b..273db4a83 100644 --- a/lib/src/pages/route_initializer.dart +++ b/lib/src/pages/route_initializer.dart @@ -54,7 +54,6 @@ class RouteInitializerState extends State { try { if (!Services.instance.isReady) { await Services.instance.init(); - ThemeChanger.of(context).brightness = caseConverter ( value: Services.instance.prefs.brightness, onTrue: Brightness.light, @@ -62,15 +61,17 @@ class RouteInitializerState extends State { onNull: MediaQuery.of(context).platformBrightness, ); } + if (Auth.isSignedIn && !Models.instance.isReady) { await Models.instance.init(); } - } catch (error) { + } catch (error, stack) { await Services.instance.crashlytics.log("Error. Disposing models"); Models.instance.dispose(); if (widget.onError != null) { await Navigator.of(context).pushReplacementNamed(widget.onError!); } + await Services.instance.crashlytics.recordError(error, stack); } if (!widget.isAllowed()) { await Navigator.of(context).pushReplacementNamed(widget.onFailure); diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart index 65c02bc08..5c70fb26d 100644 --- a/lib/src/services/databases.dart +++ b/lib/src/services/databases.dart @@ -23,12 +23,14 @@ class Databases extends Database { await cloudDatabase.init(); await localDatabase.init(); - // Download this month's calendar, in case it changed - await localDatabase.saveSchedules(await cloudDatabase.getSchedules()); - final int month = DateTime.now().month; - await localDatabase.setCalendar( - month, await cloudDatabase.getCalendarMonth(month) - ); + if (cloudDatabase.isSignedIn) { + // Download this month's calendlar, in case it changed + await localDatabase.saveSchedules(await cloudDatabase.getSchedules()); + final int month = DateTime.now().month; + await localDatabase.setCalendar( + month, await cloudDatabase.getCalendarMonth(month) + ); + } } /// Downloads all the data and saves it to the local database. diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart index 5db0517f4..deb5da93f 100644 --- a/lib/src/services/local_db.dart +++ b/lib/src/services/local_db.dart @@ -171,7 +171,7 @@ class LocalDatabase extends Database { try { database = await (await idbFactory).open( "ramaz.db", - version: 2, + version: 3, onUpgradeNeeded: (idb.VersionChangeEvent event) { switch(event.oldVersion) { case 0: event.database From dc48dc7be552e7a9df82936691f87e094625aa84 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 27 Apr 2021 17:39:48 -0400 Subject: [PATCH 191/251] Added IT as testers --- firebase/firestore/constants.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/firebase/firestore/constants.yaml b/firebase/firestore/constants.yaml index 53986b31f..480d52d26 100644 --- a/firebase/firestore/constants.yaml +++ b/firebase/firestore/constants.yaml @@ -16,4 +16,10 @@ testers: last: "Account" taubj@ramaz.org: first: "Jennifer" - last: "Taub" \ No newline at end of file + last: "Taub" + shafnera@ramaz.org: + first: "Adina" + last: "Shafner" + mentj@ramaz.org: + first: "John" + last: "Ment" From a23c94172149d1223d68ab7a7ebffeb23707a568 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 27 Apr 2021 17:59:46 -0400 Subject: [PATCH 192/251] Temporarily patched --- lib/src/pages/builders/sports_builder.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/pages/builders/sports_builder.dart b/lib/src/pages/builders/sports_builder.dart index bdba8f548..a051f961f 100644 --- a/lib/src/pages/builders/sports_builder.dart +++ b/lib/src/pages/builders/sports_builder.dart @@ -224,7 +224,7 @@ class SportBuilderState extends State { ] ), const SizedBox(height: 20), - SportsTile( + if (model.ready) SportsTile( model.game, onTap: () async => model.scores = await SportsScoreUpdater.updateScores(context, model.game) From 3296354237f50abb89e371d9151df8dd4f159136 Mon Sep 17 00:00:00 2001 From: todesj <70974284+todesj@users.noreply.github.com> Date: Tue, 27 Apr 2021 22:50:03 -0400 Subject: [PATCH 193/251] Fixed Ios issue (#69) Bumps iOS to 3.0.0 Nice. --- ios/Runner.xcodeproj/project.pbxproj | 6 +-- ios/Runner/Info.plist | 2 +- pubspec.lock | 61 ++++++++++++---------------- pubspec.yaml | 5 ++- 4 files changed, 35 insertions(+), 39 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 66724fdcd..9297574a5 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -444,7 +444,7 @@ "$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Pods", ); - MARKETING_VERSION = 2.0.2; + MARKETING_VERSION = 3.0.0; PRODUCT_BUNDLE_IDENTIFIER = "com.ramaz.ramaz.student-life"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -607,7 +607,7 @@ "$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Pods", ); - MARKETING_VERSION = 2.0.2; + MARKETING_VERSION = 3.0.0; PRODUCT_BUNDLE_IDENTIFIER = "com.ramaz.ramaz.student-life"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -639,7 +639,7 @@ "$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Pods", ); - MARKETING_VERSION = 2.0.2; + MARKETING_VERSION = 3.0.0; PRODUCT_BUNDLE_IDENTIFIER = "com.ramaz.ramaz.student-life"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 03394fc14..e7e22e284 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) + $(MARKETING_VERSION) CFBundleSignature ???? CFBundleURLTypes diff --git a/pubspec.lock b/pubspec.lock index e0e221fdf..716964486 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,14 +14,14 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "2.0.13" + version: "3.1.2" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.6.0" + version: "2.0.0" async: dependency: transitive description: @@ -63,21 +63,21 @@ packages: name: cloud_firestore url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.0.7" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.0.3" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.0.7" collection: dependency: transitive description: @@ -85,20 +85,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" crypto: dependency: transitive description: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.5" + version: "3.0.1" fake_async: dependency: transitive description: @@ -126,23 +119,23 @@ packages: name: firebase_auth url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.2" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.2.0" firebase_auth_web: dependency: transitive description: name: firebase_auth_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.1.0" firebase_core: - dependency: transitive + dependency: "direct main" description: name: firebase_core url: "https://pub.dartlang.org" @@ -182,21 +175,21 @@ packages: name: firebase_messaging url: "https://pub.dartlang.org" source: hosted - version: "9.0.1" + version: "9.1.3" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.3" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.0.6" flutter: dependency: "direct main" description: flutter @@ -208,14 +201,14 @@ packages: name: flutter_launcher_icons url: "https://pub.dartlang.org" source: hosted - version: "0.7.5" + version: "0.9.0" flutter_local_notifications: dependency: "direct main" description: name: flutter_local_notifications url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "5.0.0+2" flutter_local_notifications_platform_interface: dependency: transitive description: @@ -246,7 +239,7 @@ packages: name: google_sign_in url: "https://pub.dartlang.org" source: hosted - version: "5.0.1" + version: "5.0.2" google_sign_in_platform_interface: dependency: transitive description: @@ -281,7 +274,7 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.1.14" + version: "3.0.2" intl: dependency: transitive description: @@ -351,14 +344,14 @@ packages: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.1" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.1" pedantic: dependency: transitive description: @@ -372,7 +365,7 @@ packages: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "3.0.4" + version: "4.1.0" platform: dependency: transitive description: @@ -393,21 +386,21 @@ packages: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.1.1" + version: "4.2.1" quiver: dependency: transitive description: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" sembast: dependency: transitive description: name: sembast url: "https://pub.dartlang.org" source: hosted - version: "3.0.0+4" + version: "3.0.2" shared_preferences: dependency: "direct main" description: @@ -510,7 +503,7 @@ packages: name: timezone url: "https://pub.dartlang.org" source: hosted - version: "0.7.0-nullsafety.0" + version: "0.7.0" typed_data: dependency: transitive description: @@ -573,7 +566,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.5" xdg_directories: dependency: transitive description: @@ -587,14 +580,14 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "4.2.0" + version: "5.1.0" yaml: dependency: transitive description: name: yaml url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "3.1.0" sdks: dart: ">=2.12.0 <3.0.0" flutter: ">=1.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 6ae3fd9d1..89b304ac8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,6 +20,9 @@ dependencies: # Firebase/Google cloud_firestore: ^1.0.5 firebase_auth: ^1.0.1 + + firebase_core: ^1.1.0 + firebase_crashlytics: ^2.0.2 firebase_messaging: ^9.0.1 google_sign_in: ^5.0.1 @@ -43,7 +46,7 @@ dev_dependencies: flutter_test: sdk: flutter matcher: any - flutter_launcher_icons: ^0.7.0 + flutter_launcher_icons: ^0.9.0 # pedantic: ^1.4.0 flutter_icons: From 5a76f2cb6dc7ebdda1365e90725fb707474afd54 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 27 Apr 2021 23:01:34 -0400 Subject: [PATCH 194/251] Migrated from ModelListener widget to ModelListener extends State (#66) * Migrated from ModelListener widget to ModelListener extends State --- lib/src/models/view/calendar_editor.dart | 5 + lib/src/models/view/home.dart | 28 ++- lib/src/pages/admin/calendar.dart | 26 +- lib/src/pages/admin/schedules.dart | 88 ++++--- lib/src/pages/builders/day_builder.dart | 159 ++++++------ lib/src/pages/builders/reminder_builder.dart | 237 +++++++++--------- lib/src/pages/builders/sports_builder.dart | 237 +++++++++--------- lib/src/pages/dashboard.dart | 116 ++++----- lib/src/pages/feedback.dart | 73 +++--- lib/src/pages/home.dart | 39 +-- lib/src/pages/reminders.dart | 38 ++- lib/src/pages/schedule.dart | 117 +++++---- lib/src/pages/sports.dart | 222 ++++++++-------- lib/src/widgets/generic/class_list.dart | 56 +++-- lib/src/widgets/generic/footer.dart | 104 ++++---- lib/src/widgets/generic/model_listener.dart | 94 ++----- .../responsive_scaffold/navigation_item.dart | 19 +- .../widgets/responsive_scaffold/scaffold.dart | 108 +++++--- 18 files changed, 901 insertions(+), 865 deletions(-) diff --git a/lib/src/models/view/calendar_editor.dart b/lib/src/models/view/calendar_editor.dart index 65b29018d..50894d40a 100644 --- a/lib/src/models/view/calendar_editor.dart +++ b/lib/src/models/view/calendar_editor.dart @@ -54,6 +54,11 @@ class CalendarEditor with ChangeNotifier { : month > 7 ? currentYear - 1 : currentYear ]; + /// Loads the current month to create the calendar. + CalendarEditor() { + loadMonth(DateTime.now().month - 1); + } + /// Loads a month from the database and pads it accordingly. void loadMonth(int month) => subscriptions [month] ??= Services .instance.database.cloudDatabase.getCalendarStream(month + 1) diff --git a/lib/src/models/view/home.dart b/lib/src/models/view/home.dart index ce25da3c7..b53d0da46 100644 --- a/lib/src/models/view/home.dart +++ b/lib/src/models/view/home.dart @@ -3,10 +3,10 @@ import "package:flutter/foundation.dart"; import "package:ramaz/models.dart"; import "package:ramaz/services.dart"; -/// A view model for the home page. +/// A view model for the dashboard page. /// /// This model doesn't actually do much, it just listens to any data models -/// that are relevant to the home page. Because we're using [ChangeNotifier], +/// that are relevant to the dashboard. Because we're using [ChangeNotifier], /// as its the only [Listenable] with a [dispose] method, we can't simply use /// [Listenable.merge]. /// @@ -15,11 +15,20 @@ import "package:ramaz/services.dart"; /// model. Instead, we have to reference it through [Models], which will always /// have an up-to-date instance. // ignore: prefer_mixin -class HomeModel with ChangeNotifier { +class DashboardModel with ChangeNotifier { + /// The underlying data representing this widget. + final ScheduleModel schedule = Models.instance.schedule; + + /// The reminders data model. + final Reminders reminders = Models.instance.reminders; + + /// The sports data model. + final Sports sports = Models.instance.sports; + /// Listens to [ScheduleModel] (and by extension, [Reminders]) and [Sports]. - HomeModel() { - Models.instance.schedule.addListener(notifyListeners); - Models.instance.sports.addListener(notifyListeners); + DashboardModel() { + schedule.addListener(notifyListeners); + sports.addListener(notifyListeners); } // Do not attempt to clean up this code by using a list. @@ -28,12 +37,11 @@ class HomeModel with ChangeNotifier { // be used instead. @override void dispose() { - Models.instance.schedule.removeListener(notifyListeners); - Models.instance.sports.removeListener(notifyListeners); + schedule.removeListener(notifyListeners); + sports.removeListener(notifyListeners); super.dispose(); } - /// Refreshes the database. /// /// This only updates the calendar and sports games, not the user profile. To @@ -42,7 +50,7 @@ class HomeModel with ChangeNotifier { try { await Services.instance.database.updateCalendar(); await Services.instance.database.updateSports(); - await Models.instance.schedule.initCalendar(); + await schedule.initCalendar(); } catch (error) { // ignore: avoid_catches_without_on_clauses // We just want to allow the user to retry. But still rethrow. onFailure(); diff --git a/lib/src/pages/admin/calendar.dart b/lib/src/pages/admin/calendar.dart index 5352d8441..bafaef544 100644 --- a/lib/src/pages/admin/calendar.dart +++ b/lib/src/pages/admin/calendar.dart @@ -63,7 +63,9 @@ class AdminCalendarPage extends StatefulWidget { } /// The state for the admin calendar page. -class AdminCalendarState extends State { +class AdminCalendarState extends ModelListener< + CalendarEditor, AdminCalendarPage +> { /// The months of the year. /// /// These will be the headers of all the months. @@ -80,29 +82,11 @@ class AdminCalendarState extends State { "Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat" ]; - /// The underlying data model. - final CalendarEditor model = CalendarEditor(); - - /// Rebuilds the widget when the data changes. - void listener() => setState(() {}); - - @override - void initState() { - super.initState(); - model - ..addListener(listener) - ..loadMonth(_currentMonth); - } - @override - void dispose() { - model - ..removeListener(listener) - ..dispose(); - super.dispose(); - } + CalendarEditor getModel() => CalendarEditor(); int _currentMonth = DateTime.now().month - 1; + /// The current month being viewed. /// /// Changing this will load the month from the database if needed. diff --git a/lib/src/pages/admin/schedules.dart b/lib/src/pages/admin/schedules.dart index 02f048a1f..f3958f48a 100644 --- a/lib/src/pages/admin/schedules.dart +++ b/lib/src/pages/admin/schedules.dart @@ -6,53 +6,63 @@ import "package:ramaz/pages.dart"; import "package:ramaz/widgets.dart"; /// A page to show the admin's custom schedules. -class AdminSchedulesPage extends StatelessWidget { +class AdminSchedulesPage extends StatefulWidget { /// Creates a page for admins to manage schedules. const AdminSchedulesPage(); + @override + AdminScheduleState createState() => AdminScheduleState(); +} + +/// The state for the scheudules page. +/// +/// Creates and listens to an [AdminScheduleModel]. +class AdminScheduleState extends + ModelListener +{ + @override + AdminScheduleModel getModel() => AdminScheduleModel(); + // If the user is on this page, they are an admin. // So, model.admin != null @override - Widget build(BuildContext context) => ModelListener( - model: () => AdminScheduleModel(), - builder: (_, AdminScheduleModel model, __) => ResponsiveScaffold( - appBar: AppBar(title: const Text("Custom schedules")), - drawer: const NavigationDrawer(), - floatingActionButton: FloatingActionButton( - onPressed: () async { - final Schedule? schedule = await ScheduleBuilder.buildSchedule(context); - if (schedule == null) { - return; - } - await model.createSchedule(schedule); - }, - child: const Icon(Icons.add), - ), - bodyBuilder: (_) => Padding( - padding: const EdgeInsets.all(20), - child: model.schedules.isEmpty - ? const Center ( - child: Text ( - "There are no schedules yet. Feel free to add one.", - textScaleFactor: 1.5, - textAlign: TextAlign.center, - ) + Widget build(BuildContext context) => ResponsiveScaffold( + appBar: AppBar(title: const Text("Custom schedules")), + drawer: const NavigationDrawer(), + floatingActionButton: FloatingActionButton( + onPressed: () async { + final Schedule? schedule = await ScheduleBuilder.buildSchedule(context); + if (schedule == null) { + return; + } + await model.createSchedule(schedule); + }, + child: const Icon(Icons.add), + ), + bodyBuilder: (_) => Padding( + padding: const EdgeInsets.all(20), + child: model.schedules.isEmpty + ? const Center ( + child: Text ( + "There are no schedules yet. Feel free to add one.", + textScaleFactor: 1.5, + textAlign: TextAlign.center, ) - : ListView( - children: [ - for (final Schedule schedule in model.schedules) - ListTile( - title: Text(schedule.name), - onTap: () async { - final Schedule? newSchedule = - await ScheduleBuilder.buildSchedule(context, preset: schedule); - if (newSchedule != null) { - await model.replaceSchedule(newSchedule); - } - }, - ) - ] ) + : ListView( + children: [ + for (final Schedule schedule in model.schedules) + ListTile( + title: Text(schedule.name), + onTap: () async { + final Schedule? newSchedule = + await ScheduleBuilder.buildSchedule(context, preset: schedule); + if (newSchedule != null) { + await model.replaceSchedule(newSchedule); + } + }, + ) + ] ) ) ); diff --git a/lib/src/pages/builders/day_builder.dart b/lib/src/pages/builders/day_builder.dart index dc0258e43..ef5975c73 100644 --- a/lib/src/pages/builders/day_builder.dart +++ b/lib/src/pages/builders/day_builder.dart @@ -11,7 +11,7 @@ import "package:ramaz/widgets.dart"; /// /// If [day] is provided, then the fields [DayBuilderModel.name], /// [DayBuilderModel.schedule], are set to [Day.name] and [Day.schedule]. -class DayBuilder extends StatelessWidget { +class DayBuilder extends StatefulWidget { /// The date this widget is modifying. final DateTime date; @@ -29,85 +29,94 @@ class DayBuilder extends StatelessWidget { }); @override - Widget build(BuildContext context) => ModelListener( - model: () => DayBuilderModel(day: day, date: date), - // ignore: sort_child_properties_last - child: TextButton( - onPressed: () => Navigator.of(context).pop(), - child: const Text("Cancel"), - ), - builder: (_, DayBuilderModel model, Widget? cancel) => AlertDialog( - title: const Text("Edit day"), - content: Column ( - mainAxisSize: MainAxisSize.min, - children: [ - Text("Date: ${date.month}/${date.day}"), - const SizedBox(height: 20), - SwitchListTile( - title: const Text("School?"), - value: model.hasSchool, - onChanged: (bool value) => model.hasSchool = value, - ), - Container( - width: double.infinity, - child: Wrap ( - alignment: WrapAlignment.spaceBetween, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Text("Day", textAlign: TextAlign.center), - DropdownButton( - value: model.name, - hint: const Text("Day"), - onChanged: !model.hasSchool ? null : - (String? value) => model.name = value, - items: [ - for (final String dayName in Models.instance.schedule.user.dayNames) - DropdownMenuItem( - value: dayName, - child: Text(dayName), - ) - ], - ) - ] - ), + DayBuilderState createState() => DayBuilderState(); +} + +/// The state for a [DayBuilder]. +/// +/// Creates a [DayBuilderModel]. +class DayBuilderState extends ModelListener { + @override + DayBuilderModel getModel() => DayBuilderModel( + day: widget.day, + date: widget.date + ); + + @override + Widget build(BuildContext context) => AlertDialog( + title: const Text("Edit day"), + content: Column ( + mainAxisSize: MainAxisSize.min, + children: [ + Text("Date: ${widget.date.month}/${widget.date.day}"), + const SizedBox(height: 20), + SwitchListTile( + title: const Text("School?"), + value: model.hasSchool, + onChanged: (bool value) => model.hasSchool = value, + ), + Container( + width: double.infinity, + child: Wrap ( + alignment: WrapAlignment.spaceBetween, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Text("Day", textAlign: TextAlign.center), + DropdownButton( + value: model.name, + hint: const Text("Day"), + onChanged: !model.hasSchool ? null : + (String? value) => model.name = value, + items: [ + for (final String dayName in Models.instance.schedule.user.dayNames) + DropdownMenuItem( + value: dayName, + child: Text(dayName), + ) + ], + ) + ] ), - const SizedBox(height: 20), - Container( - width: double.infinity, - child: Wrap ( - runSpacing: 3, - children: [ - const Text("Schedule"), - DropdownButton( - value: model.schedule?.name, - hint: const Text("Schedule"), - onChanged: !model.hasSchool ? null : (String? value) => - model.schedule = Schedule.schedules.firstWhere( - (Schedule schedule) => schedule.name == value + ), + const SizedBox(height: 20), + Container( + width: double.infinity, + child: Wrap ( + runSpacing: 3, + children: [ + const Text("Schedule"), + DropdownButton( + value: model.schedule?.name, + hint: const Text("Schedule"), + onChanged: !model.hasSchool ? null : (String? value) => + model.schedule = Schedule.schedules.firstWhere( + (Schedule schedule) => schedule.name == value + ), + items: [ + for (final Schedule schedule in Schedule.schedules) + DropdownMenuItem( + value: schedule.name, + child: Text(schedule.name), ), - items: [ - for (final Schedule schedule in Schedule.schedules) - DropdownMenuItem( - value: schedule.name, - child: Text(schedule.name), - ), - ], - ) - ] - ) + ], + ) + ] ) - ] - ), - actions: [ - cancel!, - ElevatedButton( - onPressed: !model.ready ? null : () async { - await upload(model.day); - Navigator.of(context).pop(); - }, - child: const Text("Save", style: TextStyle(color: Colors.white)), ) ] ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("Cancel"), + ), + ElevatedButton( + onPressed: !model.ready ? null : () async { + await widget.upload(model.day); + Navigator.of(context).pop(); + }, + child: const Text("Save", style: TextStyle(color: Colors.white)), + ) + ] ); } diff --git a/lib/src/pages/builders/reminder_builder.dart b/lib/src/pages/builders/reminder_builder.dart index cda688ef1..46416db52 100644 --- a/lib/src/pages/builders/reminder_builder.dart +++ b/lib/src/pages/builders/reminder_builder.dart @@ -45,10 +45,15 @@ class ReminderBuilder extends StatefulWidget { /// /// [State.initState] is needed to instantiate a [TextEditingController] /// exactly once. -class ReminderBuilderState extends State { +class ReminderBuilderState extends ModelListener< + RemindersBuilderModel, ReminderBuilder +> { /// The text controller to hold the message of the [Reminder]. final TextEditingController controller = TextEditingController(); + @override + RemindersBuilderModel getModel() => RemindersBuilderModel(widget.reminder); + @override void initState() { super.initState(); @@ -56,121 +61,121 @@ class ReminderBuilderState extends State { } @override - Widget build(BuildContext context) => ModelListener( - model: () => RemindersBuilderModel(widget.reminder), - // ignore: sort_child_properties_last - child: TextButton( - onPressed: Navigator.of(context).pop, - child: const Text("Cancel"), - ), - builder: (BuildContext context, RemindersBuilderModel model, Widget? back) => - AlertDialog( - title: Text (widget.reminder == null ? "Create reminder" : "Edit reminder"), - actions: [ - back!, - ElevatedButton( - onPressed: model.ready - ? () => Navigator.of(context).pop(model.build()) - : null, - child: const Text("Save"), - ) - ], - content: Column ( - mainAxisSize: MainAxisSize.min, - children: [ - TextField ( - controller: controller, - onChanged: model.onMessageChanged, - textCapitalization: TextCapitalization.sentences, - ), - const SizedBox (height: 20), - RadioListTile ( - value: ReminderTimeType.period, - groupValue: model.type, - // if toggleable is false (default), the value can never be null - onChanged: (value) => model.toggleRepeatType(value!), - title: Text ( - "${model.shouldRepeat ? 'Repeats every' : 'On'} period" - ), - ), - RadioListTile ( - value: ReminderTimeType.subject, - groupValue: model.type, - // if toggleable is false (default), the value can never be null - onChanged: (value) => model.toggleRepeatType(value!), - title: Text ( - "${model.shouldRepeat ? 'Repeats every' : 'On'} subject" - ), - ), - const SizedBox (height: 20), - if (model.type == ReminderTimeType.period) ...[ - ListTile ( - title: const Text ("Day"), - trailing: DropdownButton( - items: [ - for (final String dayName in Models.instance.schedule.user.dayNames) - DropdownMenuItem( - value: dayName, - child: Text(dayName), - ), - ], - onChanged: (String? value) { - if (value != null) { - model.changeDay(value); - } - }, - value: model.dayName, - hint: const Text("Day"), - ), - ), - ListTile ( - title: const Text ("Period"), - trailing: DropdownButton ( - items: [ - for (final String period in model.periods ?? []) - DropdownMenuItem( - value: period, - child: Text (period), - ) - ], - onChanged: (String? value) { - if (value != null) { - model.changePeriod(value); - } - }, - value: model.period, - hint: const Text ("Period"), - ) - ) - ] else if (model.type == ReminderTimeType.subject) - ListTile ( - title: const Text ("Class"), - trailing: DropdownButton( - items: [ - for (final String course in model.courses) - DropdownMenuItem( - value: course, - child: Text("${ReminderBuilder.trimString(course, 14)}..."), - ) - ], - onChanged: (String? value) { - if (value != null) { - model.changeCourse(value); - } - }, - value: model.course, - isDense: true, - hint: const Text ("Class"), - ) - ), - SwitchListTile ( - value: model.shouldRepeat, - onChanged: model.toggleRepeat, - title: const Text ("Repeat"), - secondary: const Icon (Icons.repeat), - ), - ] - ) + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => AlertDialog( + title: Text (widget.reminder == null ? "Create reminder" : "Edit reminder"), + actions: [ + TextButton( + onPressed: Navigator.of(context).pop, + child: const Text("Cancel"), + ), + ElevatedButton( + onPressed: model.ready + ? () => Navigator.of(context).pop(model.build()) + : null, + child: const Text("Save"), ) + ], + content: Column ( + mainAxisSize: MainAxisSize.min, + children: [ + TextField ( + controller: controller, + onChanged: model.onMessageChanged, + textCapitalization: TextCapitalization.sentences, + ), + const SizedBox (height: 20), + RadioListTile ( + value: ReminderTimeType.period, + groupValue: model.type, + // if toggleable is false (default), the value can never be null + onChanged: (value) => model.toggleRepeatType(value!), + title: Text ( + "${model.shouldRepeat ? 'Repeats every' : 'On'} period" + ), + ), + RadioListTile ( + value: ReminderTimeType.subject, + groupValue: model.type, + // if toggleable is false (default), the value can never be null + onChanged: (value) => model.toggleRepeatType(value!), + title: Text ( + "${model.shouldRepeat ? 'Repeats every' : 'On'} subject" + ), + ), + const SizedBox (height: 20), + if (model.type == ReminderTimeType.period) ...[ + ListTile ( + title: const Text ("Day"), + trailing: DropdownButton( + items: [ + for (final String dayName in Models.instance.schedule.user.dayNames) + DropdownMenuItem( + value: dayName, + child: Text(dayName), + ), + ], + onChanged: (String? value) { + if (value != null) { + model.changeDay(value); + } + }, + value: model.dayName, + hint: const Text("Day"), + ), + ), + ListTile ( + title: const Text ("Period"), + trailing: DropdownButton ( + items: [ + for (final String period in model.periods ?? []) + DropdownMenuItem( + value: period, + child: Text (period), + ) + ], + onChanged: (String? value) { + if (value != null) { + model.changePeriod(value); + } + }, + value: model.period, + hint: const Text ("Period"), + ) + ) + ] else if (model.type == ReminderTimeType.subject) + ListTile ( + title: const Text ("Class"), + trailing: DropdownButton( + items: [ + for (final String course in model.courses) + DropdownMenuItem( + value: course, + child: Text("${ReminderBuilder.trimString(course, 14)}..."), + ) + ], + onChanged: (String? value) { + if (value != null) { + model.changeCourse(value); + } + }, + value: model.course, + isDense: true, + hint: const Text ("Class"), + ) + ), + SwitchListTile ( + value: model.shouldRepeat, + onChanged: model.toggleRepeat, + title: const Text ("Repeat"), + secondary: const Icon (Icons.repeat), + ), + ] + ) ); } \ No newline at end of file diff --git a/lib/src/pages/builders/sports_builder.dart b/lib/src/pages/builders/sports_builder.dart index bdba8f548..cd3644801 100644 --- a/lib/src/pages/builders/sports_builder.dart +++ b/lib/src/pages/builders/sports_builder.dart @@ -110,13 +110,18 @@ class SportsBuilder extends StatefulWidget { /// A state for [SportsBuilder]. /// /// This state keeps [TextEditingController]s intact. -class SportBuilderState extends State { +class SportBuilderState extends ModelListener< + SportsBuilderModel, SportsBuilder +> { /// A controller to hold [SportsBuilder.parent]'s team name. final TextEditingController teamController = TextEditingController(); /// A controller to hold [SportsBuilder.parent]'s opponent. final TextEditingController opponentController = TextEditingController(); + @override + SportsBuilderModel getModel() => SportsBuilderModel(widget.parent); + @override void initState() { teamController.text = widget.parent?.team ?? ""; @@ -125,126 +130,130 @@ class SportBuilderState extends State { } @override - Widget build(BuildContext context) => ModelListener( - model: () => SportsBuilderModel(widget.parent), - builder: (_, SportsBuilderModel model, __) => Scaffold( - appBar: AppBar(title: const Text("Add game")), - bottomSheet: !model.loading ? null : Container( - height: 60, - padding: const EdgeInsets.all(10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: const [Text("Saving..."), CircularProgressIndicator()] - ) - ), - body: ListView( - padding: const EdgeInsets.all(20), - children: [ - FormRow( - "Sport", - DropdownButtonFormField( - hint: const Text("Choose a sport"), - value: model.sport, - onChanged: (Sport? value) => model.sport = value, - items: [ - for (final Sport sport in Sport.values) - DropdownMenuItem( - value: sport, - child: Text(SportsGame.capitalize(sport)) - ) - ], - ), - sized: true, - ), - FormRow( - "Team", - TextField( - onChanged: (String value) => model.team = value, - textCapitalization: TextCapitalization.words, - controller: teamController, - ), - sized: true, - ), - FormRow( - "Opponent", - TextField( - onChanged: (String value) => model.opponent = value, - textCapitalization: TextCapitalization.words, - controller: opponentController, - ), - sized: true, + void dispose() { + teamController.dispose(); + opponentController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => Scaffold( + appBar: AppBar(title: const Text("Add game")), + bottomSheet: !model.loading ? null : Container( + height: 60, + padding: const EdgeInsets.all(10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: const [Text("Saving..."), CircularProgressIndicator()] + ) + ), + body: ListView( + padding: const EdgeInsets.all(20), + children: [ + FormRow( + "Sport", + DropdownButtonFormField( + hint: const Text("Choose a sport"), + value: model.sport, + onChanged: (Sport? value) => model.sport = value, + items: [ + for (final Sport sport in Sport.values) + DropdownMenuItem( + value: sport, + child: Text(SportsGame.capitalize(sport)) + ) + ], ), - FormRow( - "Away game", - Checkbox( - value: model.away, - // If tristate == false (default), value never be null - onChanged: (bool? value) => model.away = value!, - ), + sized: true, + ), + FormRow( + "Team", + TextField( + onChanged: (String value) => model.team = value, + textCapitalization: TextCapitalization.words, + controller: teamController, ), - FormRow.editable( - title: "Date", - value: SportsTile.formatDate(model.date), - whenNull: Icons.date_range, - setNewValue: () async => model.date = await pickDate( - initialDate: DateTime.now(), - context: context - ), + sized: true, + ), + FormRow( + "Opponent", + TextField( + onChanged: (String value) => model.opponent = value, + textCapitalization: TextCapitalization.words, + controller: opponentController, ), - FormRow.editable( - title: "Start time", - value: model.start?.format(context), - whenNull: Icons.access_time, - setNewValue: () async => model.start = await showTimePicker( - context: context, - initialTime: model.start ?? TimeOfDay.now(), - ), + sized: true, + ), + FormRow( + "Away game", + Checkbox( + value: model.away, + // If tristate == false (default), value never be null + onChanged: (bool? value) => model.away = value!, ), - FormRow.editable( - title: "End time", - value: model.end?.format(context), - whenNull: Icons.access_time, - setNewValue: () async => model.end = await showTimePicker( - context: context, - initialTime: model.end ?? TimeOfDay.now(), - ), + ), + FormRow.editable( + title: "Date", + value: SportsTile.formatDate(model.date), + whenNull: Icons.date_range, + setNewValue: () async => model.date = await pickDate( + initialDate: DateTime.now(), + context: context ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "Tap on the card to change the scores", - textScaleFactor: 0.9 - ), - TextButton( - onPressed: () => model.scores = null, - child: const Text("Clear"), - ) - ] + ), + FormRow.editable( + title: "Start time", + value: model.start?.format(context), + whenNull: Icons.access_time, + setNewValue: () async => model.start = await showTimePicker( + context: context, + initialTime: model.start ?? TimeOfDay.now(), ), - const SizedBox(height: 20), - SportsTile( - model.game, - onTap: () async => model.scores = - await SportsScoreUpdater.updateScores(context, model.game) - ?? model.scores + ), + FormRow.editable( + title: "End time", + value: model.end?.format(context), + whenNull: Icons.access_time, + setNewValue: () async => model.end = await showTimePicker( + context: context, + initialTime: model.end ?? TimeOfDay.now(), ), - ButtonBar( - children: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: const Text("Cancel"), - ), - ElevatedButton( - onPressed: !model.ready ? null : - () => Navigator.of(context).pop(model.game), - child: const Text("Save"), - ) - ] - ) - ] - ) + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + "Tap on the card to change the scores", + textScaleFactor: 0.9 + ), + TextButton( + onPressed: () => model.scores = null, + child: const Text("Clear"), + ) + ] + ), + const SizedBox(height: 20), + SportsTile( + model.game, + onTap: () async => model.scores = + await SportsScoreUpdater.updateScores(context, model.game) + ?? model.scores + ), + ButtonBar( + children: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("Cancel"), + ), + ElevatedButton( + onPressed: !model.ready ? null : + () => Navigator.of(context).pop(model.game), + child: const Text("Save"), + ) + ] + ) + ] ) ); } diff --git a/lib/src/pages/dashboard.dart b/lib/src/pages/dashboard.dart index 74a5987b0..9393d78bd 100644 --- a/lib/src/pages/dashboard.dart +++ b/lib/src/pages/dashboard.dart @@ -9,25 +9,22 @@ const List weekdayNames = [ ]; /// Shows relevant info about today on the home page. -class Dashboard extends NavigationItem { - /// The underlying data representing this widget. - final ScheduleModel scheduleModel = Models.instance.schedule; - - /// The reminders data model. - final Reminders remindersModel = Models.instance.reminders; - - /// The sports data model. - final Sports sportsModel = Models.instance.sports; +class Dashboard extends NavigationItem { + @override + DashboardModel get model => super.model!; /// Creates the dashboard page. - Dashboard() : - super(label: "Dashboard", icon: const Icon(Icons.dashboard)); + Dashboard() : super( + label: "Dashboard", + icon: const Icon(Icons.dashboard), + model: DashboardModel(), + ); @override AppBar get appBar => AppBar( title: const Text("Dashboard"), actions: [ - if (scheduleModel.hasSchool) + if (model.schedule.hasSchool) Builder( builder: (BuildContext context) => TextButton( onPressed: () => Scaffold.of(context).openEndDrawer(), @@ -38,21 +35,27 @@ class Dashboard extends NavigationItem { ); @override - Widget? get sideSheet => !scheduleModel.hasSchool ? null : ClassList( - // if there is school, then: - // scheduleModel.today != null - // scheduleModel.periods != null - day: scheduleModel.today!, - periods: scheduleModel.nextPeriod == null - ? scheduleModel.periods! - : scheduleModel.periods!.getRange ( - (scheduleModel.periodIndex ?? -1) + 1, - scheduleModel.periods!.length - ), - headerText: scheduleModel.period == null - ? "Today's Schedule" - : "Upcoming Classes" - ); + Widget? get sideSheet { + if (!model.schedule.hasSchool) { + return null; + } + final ScheduleModel schedule = model.schedule; + return ClassList( + // if there is school, then: + // model!.schedule.today != null + // model!.schedule.periods != null + day: schedule.today!, + periods: schedule.nextPeriod == null + ? schedule.periods! + : schedule.periods!.getRange ( + (schedule.periodIndex ?? -1) + 1, + schedule.periods!.length + ), + headerText: schedule.period == null + ? "Today's Schedule" + : "Upcoming Classes" + ); + } /// Allows the user to refresh data. /// @@ -60,50 +63,47 @@ class Dashboard extends NavigationItem { /// log out and log back in. /// /// This has to be a separate function since it can recursively call itself. - Future refresh(BuildContext context, HomeModel model) => model.refresh( + Future refresh(BuildContext context) => model.refresh( () => ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: const Text("No Internet"), action: SnackBarAction( label: "RETRY", - onPressed: () => refresh(context, model), + onPressed: () => refresh(context), ), ) ) ); @override - Widget build(BuildContext context) => ModelListener( - model: () => HomeModel(), - builder: (BuildContext context, HomeModel model, _) => RefreshIndicator( - onRefresh: () => refresh(context, model), - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20), - children: [ - Text ( - scheduleModel.today == null - ? "There is no school today" - : "Today is ${scheduleModel.today!.name}", - style: Theme.of(context).textTheme.headline3, - textAlign: TextAlign.center + Widget build(BuildContext context) => RefreshIndicator( + onRefresh: () => refresh(context), + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20), + children: [ + Text ( + model.schedule.today == null + ? "There is no school today" + : "Today is ${model.schedule.today!.name}", + style: Theme.of(context).textTheme.headline3, + textAlign: TextAlign.center + ), + const SizedBox (height: 20), + if (model.schedule.hasSchool) ...[ + ScheduleSlot(), + const SizedBox(height: 10), + ], + if (model.sports.todayGames.isNotEmpty) ...[ + Text( + "Sports games", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline5, ), - const SizedBox (height: 20), - if (scheduleModel.hasSchool) ...[ - ScheduleSlot(), - const SizedBox(height: 10), - ], - if (sportsModel.todayGames.isNotEmpty) ...[ - Text( - "Sports games", - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.headline5, - ), - const SizedBox(height: 10), - for (final int index in sportsModel.todayGames) - SportsTile(sportsModel.games [index]) - ] + const SizedBox(height: 10), + for (final int index in model.sports.todayGames) + SportsTile(model.sports.games [index]) ] - ) + ] ) ); } diff --git a/lib/src/pages/feedback.dart b/lib/src/pages/feedback.dart index f505f291e..be44b1d7b 100644 --- a/lib/src/pages/feedback.dart +++ b/lib/src/pages/feedback.dart @@ -7,46 +7,51 @@ import "package:ramaz/models.dart"; import "drawer.dart"; /// A page to submit feedback. -class FeedbackPage extends StatelessWidget { +class FeedbackPage extends StatefulWidget { /// Creates the feedback page. const FeedbackPage(); + @override + FeedbackState createState() => FeedbackState(); +} + +/// The state for the feedback page. +class FeedbackState extends ModelListener { + @override + FeedbackModel getModel() => FeedbackModel(); + @override Widget build (BuildContext context) => ResponsiveScaffold( drawer: const NavigationDrawer(), appBar: AppBar(title: const Text ("Send Feedback")), - bodyBuilder: (_) => ModelListener( - model: () => FeedbackModel(), - builder: (BuildContext context, FeedbackModel model, _) => Center( - child: SizedBox( - width: 400, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - TextField( - autofocus: true, - maxLength: 500, - onChanged: (String text) => model.message = text, - textCapitalization: TextCapitalization.sentences, - ), - const SizedBox(height: 20), - CheckboxListTile( - value: model.anonymous, - // If tristate == false (default), value != null - onChanged: (bool? value) => model.anonymous = value!, - title: const Text("Anonymous"), - subtitle: const Text( - "To keep your name and email hidden, check this box." - ) - ), - const SizedBox(height: 50), - ElevatedButton.icon( - label: const Text ("Submit"), - icon: const Icon(Icons.send), - onPressed: !model.ready - ? null - : () { + bodyBuilder: (_) => Center( + child: SizedBox( + width: 400, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextField( + autofocus: true, + maxLength: 500, + onChanged: (String text) => model.message = text, + textCapitalization: TextCapitalization.sentences, + ), + const SizedBox(height: 20), + CheckboxListTile( + value: model.anonymous, + // If tristate == false (default), value != null + onChanged: (bool? value) => model.anonymous = value!, + title: const Text("Anonymous"), + subtitle: const Text( + "To keep your name and email hidden, check this box." + ) + ), + const SizedBox(height: 50), + ElevatedButton.icon( + label: const Text ("Submit"), + icon: const Icon(Icons.send), + onPressed: !model.ready ? null : () { model.send(); Navigator.of(context).pop(); } @@ -54,6 +59,6 @@ class FeedbackPage extends StatelessWidget { ] ) ) - )) + ) ); } diff --git a/lib/src/pages/home.dart b/lib/src/pages/home.dart index 579f84231..ca94985af 100644 --- a/lib/src/pages/home.dart +++ b/lib/src/pages/home.dart @@ -11,46 +11,25 @@ import "schedule.dart"; /// /// The home page combines different helpful pages. For good UI, limit this to /// 3-5 pages. Other pages should go in the side menu. -class HomePage extends StatefulWidget { +class HomePage extends StatelessWidget { /// Which sub-page should be shown by default. - final int? pageIndex; + final int pageIndex; /// Creates the home page, starting at a certain sub-page if necessary. /// /// Use this for app-wide navigation. For example, to navigate to the reminders /// page, pass in 2 for [pageIndex]. - const HomePage({this.pageIndex}); - - @override - HomePageState createState() => HomePageState(); -} - -/// The state for the home page. -/// -/// Manages what page is currently loaded. -class HomePageState extends State { - /// The different sub-pages. - final List navItems = [ - Dashboard(), - ResponsiveSchedule(), - ResponsiveReminders(), - ]; - - /// Which sub-page is currently active. - late int index; - - @override - void initState() { - super.initState(); - index = widget.pageIndex ?? 0; - } + const HomePage({this.pageIndex = 0}); @override Widget build(BuildContext context) => ResponsiveBuilder( builder: (_, LayoutInfo layout, __) => ResponsiveScaffold.navBar( - navItems: navItems, - navIndex: index, - onNavIndexChanged: (int value) => setState(() => index = value), + navItems: [ + Dashboard(), + ResponsiveSchedule(), + ResponsiveReminders(), + ], + initialNavIndex: pageIndex, drawer: const NavigationDrawer(), secondaryDrawer: const NavigationDrawer(), ) diff --git a/lib/src/pages/reminders.dart b/lib/src/pages/reminders.dart index 9b4181afa..5b6780d95 100644 --- a/lib/src/pages/reminders.dart +++ b/lib/src/pages/reminders.dart @@ -7,13 +7,17 @@ import "package:ramaz/widgets.dart"; /// The reminders page. /// /// Allows CRUD operations on reminders. -class ResponsiveReminders extends NavigationItem { - /// The data model for reminders. - final Reminders model = Models.instance.reminders; +class ResponsiveReminders extends NavigationItem { + @override + Reminders get model => super.model!; /// Creates the reminders page. - ResponsiveReminders() : - super(label: "Reminders", icon: const Icon(Icons.notifications)); + ResponsiveReminders() : super( + label: "Reminders", + icon: const Icon(Icons.notifications), + model: Models.instance.reminders, + shouldDispose: false, + ); @override AppBar get appBar => AppBar(title: const Text ("Reminders")); @@ -28,24 +32,18 @@ class ResponsiveReminders extends NavigationItem { ); @override - Widget build(BuildContext context) => ModelListener( - model: () => Models.instance.reminders, - dispose: false, - // ignore: sort_child_properties_last - child: const Center ( + Widget build(BuildContext context) => model.reminders.isEmpty + ? const Center ( child: Text ( "You don't have any reminders yet", textScaleFactor: 1.5, textAlign: TextAlign.center, ), - ), - builder: (_, Reminders model, Widget? empty) => model.reminders.isEmpty - ? empty! // widget is supplied above - : ListView.separated ( - itemCount: model.reminders.length, - separatorBuilder: (_, __) => const Divider(), - itemBuilder: (BuildContext context, int index) => - ReminderTile(index: index), - ) - ); + ) + : ListView.separated ( + itemCount: model.reminders.length, + separatorBuilder: (_, __) => const Divider(), + itemBuilder: (BuildContext context, int index) => + ReminderTile(index: index), + ); } diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index 71c19858c..f152b9607 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -9,13 +9,17 @@ import "package:ramaz/widgets.dart"; /// /// Users can use the calendar button to check the schedule for a given date /// or create a custom [Day] from the drop-down menus. -class ResponsiveSchedule extends NavigationItem { - /// The data model for the schedule. - final ScheduleViewModel model = ScheduleViewModel(); +class ResponsiveSchedule extends NavigationItem { + @override + ScheduleViewModel get model => super.model!; /// Creates the schedule page. - ResponsiveSchedule() : - super(label: "Schedule", icon: const Icon(Icons.schedule)); + ResponsiveSchedule() : super( + label: "Schedule", + icon: const Icon(Icons.schedule), + model: ScheduleViewModel(), + shouldDispose: true, + ); /// Allows the user to select a day in the calendar to view. /// @@ -51,61 +55,56 @@ class ResponsiveSchedule extends NavigationItem { ); /// Lets the user know that they chose an invalid schedule combination. - void handleInvalidSchedule(BuildContext context) => - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text("Invalid schedule")) - ); + void handleInvalidSchedule(BuildContext context) => ScaffoldMessenger + .of(context) + .showSnackBar(const SnackBar(content: Text("Invalid schedule"))); @override - Widget build (BuildContext context) => ModelListener( - model: () => model, - dispose: false, - builder: (_, ScheduleViewModel model, __) => Column( - children: [ - ListTile ( - title: const Text ("Day"), - trailing: DropdownButton ( - value: model.day.name, - onChanged: (String? value) => model.update( - newName: value, - onInvalidSchedule: () => handleInvalidSchedule(context), - ), - items: [ - for (final String dayName in Models.instance.schedule.user.dayNames) - DropdownMenuItem( - value: dayName, - child: Text(dayName), - ) - ] - ) - ), - ListTile ( - title: const Text ("Schedule"), - trailing: DropdownButton ( - value: model.day.schedule, - onChanged: (Schedule? schedule) => model.update( - newSchedule: schedule, - onInvalidSchedule: () => handleInvalidSchedule(context), - ), - items: [ - for (final Schedule schedule in Schedule.schedules) - DropdownMenuItem( - value: schedule, - child: Text (schedule.name), - ), - ] - ) - ), - const SizedBox (height: 20), - const Divider(), - const SizedBox (height: 20), - Expanded( - child: ClassList( - day: model.day, - periods: Models.instance.user.data.getPeriods(model.day) - ) - ), - ] - ) + Widget build(BuildContext context) => Column( + children: [ + ListTile ( + title: const Text ("Day"), + trailing: DropdownButton ( + value: model.day.name, + onChanged: (String? value) => model.update( + newName: value, + onInvalidSchedule: () => handleInvalidSchedule(context), + ), + items: [ + for (final String dayName in Models.instance.schedule.user.dayNames) + DropdownMenuItem( + value: dayName, + child: Text(dayName), + ) + ] + ) + ), + ListTile ( + title: const Text ("Schedule"), + trailing: DropdownButton ( + value: model.day.schedule, + onChanged: (Schedule? schedule) => model.update( + newSchedule: schedule, + onInvalidSchedule: () => handleInvalidSchedule(context), + ), + items: [ + for (final Schedule schedule in Schedule.schedules) + DropdownMenuItem( + value: schedule, + child: Text (schedule.name), + ), + ] + ) + ), + const SizedBox (height: 20), + const Divider(), + const SizedBox (height: 20), + Expanded( + child: ClassList( + day: model.day, + periods: Models.instance.user.data.getPeriods(model.day) + ) + ), + ] ); } diff --git a/lib/src/pages/sports.dart b/lib/src/pages/sports.dart index 475c0668b..0f715f698 100644 --- a/lib/src/pages/sports.dart +++ b/lib/src/pages/sports.dart @@ -64,51 +64,6 @@ class GenericSportsView extends StatelessWidget { ); } -/// Creates the AppBar for the sports page. -AppBar buildAppBar(SportsModel model) => AppBar( - title: const Text("Sports"), - bottom: const TabBar( - tabs: [ - Tab(text: "Upcoming"), - Tab(text: "Recent"), - ] - ), - actions: [ - ModelListener( - model: () => model, - dispose: false, - builder: (BuildContext context, __, ___) => !model.isAdmin ? Container() - : IconButton( - icon: const Icon(Icons.add), - tooltip: "Add a game", - onPressed: model.adminFunc(() async => - model.data.addGame(await SportsBuilder.createGame(context)) - ), - ), - ), - PopupMenuButton( - icon: const Icon(Icons.sort), - onSelected: (SortOption option) => model.sortOption = option, - tooltip: "Sort games", - itemBuilder: (_) => [ - const PopupMenuItem( - value: SortOption.chronological, - child: Text("By date"), - ), - const PopupMenuItem( - value: SortOption.sport, - child: Text("By sport"), - ) - ] - ), - IconButton( - icon: const Icon(Icons.live_tv), - onPressed: () => launch(Urls.sportsLivestream), - tooltip: "Watch livestream", - ) - ] -); - /// Creates a [GenericSportsView] based on the sorting option. Widget getLayout(BuildContext context, SportsModel model) { switch(model.sortOption) { @@ -166,97 +121,140 @@ void openMenu({ title: Text(model.data.games [index].description), children: [ SimpleDialogOption( - onPressed: () async { - Navigator.of(newContext).pop(); - final Scores? scores = await SportsScoreUpdater.updateScores( - context, model.data.games [index] - ); - if (scores == null) { - return; - } - model.loading = true; - await Models.instance.sports.replace( - index, - model.data.games [index].replaceScores(scores) - ); - model.loading = false; - }, - child: const Text("Edit scores", textScaleFactor: 1.2), + onPressed: () async { + Navigator.of(newContext).pop(); + final Scores? scores = await SportsScoreUpdater.updateScores( + context, model.data.games [index] + ); + if (scores == null) { + return; + } + model.loading = true; + await Models.instance.sports.replace( + index, + model.data.games [index].replaceScores(scores) + ); + model.loading = false; + }, + child: const Text("Edit scores", textScaleFactor: 1.2), ), const SizedBox(height: 10), SimpleDialogOption( onPressed: () async { - Navigator.of(newContext).pop(); - model.loading = true; - await Models.instance.sports.replace( - index, - model.data.games [index].replaceScores(null) - ); - model.loading = false; + Navigator.of(newContext).pop(); + model.loading = true; + await Models.instance.sports.replace( + index, + model.data.games [index].replaceScores(null) + ); + model.loading = false; }, child: const Text("Remove scores", textScaleFactor: 1.2), ), const SizedBox(height: 10), SimpleDialogOption( - onPressed: () async { - Navigator.of(newContext).pop(); - model.loading = true; - await Models.instance.sports.replace( - index, - await SportsBuilder.createGame(context, model.data.games [index]) - ); - model.loading = false; - }, - child: const Text("Edit game", textScaleFactor: 1.2), + onPressed: () async { + Navigator.of(newContext).pop(); + model.loading = true; + await Models.instance.sports.replace( + index, + await SportsBuilder.createGame(context, model.data.games [index]) + ); + model.loading = false; + }, + child: const Text("Edit game", textScaleFactor: 1.2), ), const SizedBox(height: 10), SimpleDialogOption( - onPressed: () async { - Navigator.of(newContext).pop(); - final bool? confirm = await showDialog( - context: context, - builder: (BuildContext context) => AlertDialog( - title: const Text("Confirm"), - content: const Text("Are you sure you want to delete this game?"), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(false), - child: const Text("Cancel"), - ), - ElevatedButton( - onPressed: () => Navigator.of(context).pop(true), - child: const Text("Confirm"), - ) - ] - ) - ); - if (confirm ?? false) { - model.loading = true; - await Models.instance.sports.delete(index); - model.loading = false; - } - }, - child: const Text("Remove game", textScaleFactor: 1.2), + onPressed: () async { + Navigator.of(newContext).pop(); + final bool? confirm = await showDialog( + context: context, + builder: (BuildContext context) => AlertDialog( + title: const Text("Confirm"), + content: const Text("Are you sure you want to delete this game?"), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: const Text("Cancel"), + ), + ElevatedButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text("Confirm"), + ) + ] + ) + ); + if (confirm ?? false) { + model.loading = true; + await Models.instance.sports.delete(index); + model.loading = false; + } + }, + child: const Text("Remove game", textScaleFactor: 1.2), ), ] ) ); /// A page to show recent and upcoming games to the user. -class SportsPage extends StatelessWidget { +class SportsPage extends StatefulWidget { /// Creates the sports page. const SportsPage(); + @override + SportsPageState createState() => SportsPageState(); +} + +/// The state for the sports page. +class SportsPageState extends ModelListener { + @override + SportsModel getModel() => SportsModel(Models.instance.sports); + @override Widget build(BuildContext context) => DefaultTabController( length: 2, - child: ModelListener( - model: () => SportsModel(Models.instance.sports), - builder: (_, SportsModel model, __) => ResponsiveScaffold( - appBar: buildAppBar(model), - drawer: const NavigationDrawer(), - bodyBuilder: (_) => getLayout(context, model), + child: ResponsiveScaffold( + appBar: AppBar( + title: const Text("Sports"), + bottom: const TabBar( + tabs: [ + Tab(text: "Upcoming"), + Tab(text: "Recent"), + ] + ), + actions: [ + if (model.isAdmin) IconButton( + icon: const Icon(Icons.add), + tooltip: "Add a game", + onPressed: model.adminFunc(() async => + model.data.addGame(await SportsBuilder.createGame(context)) + ), + ), + PopupMenuButton( + icon: const Icon(Icons.sort), + onSelected: (SortOption option) => model.sortOption = option, + tooltip: "Sort games", + itemBuilder: (_) => [ + const PopupMenuItem( + value: SortOption.chronological, + child: Text("By date"), + ), + const PopupMenuItem( + value: SortOption.sport, + child: Text("By sport"), + ) + ] + ), + IconButton( + icon: const Icon(Icons.live_tv), + onPressed: () => launch(Urls.sportsLivestream), + tooltip: "Watch livestream", + ) + ] ), - ) + drawer: const NavigationDrawer(), + bodyBuilder: (_) => getLayout(context, model), + ), ); } diff --git a/lib/src/widgets/generic/class_list.dart b/lib/src/widgets/generic/class_list.dart index 82a98c2d2..82013339c 100644 --- a/lib/src/widgets/generic/class_list.dart +++ b/lib/src/widgets/generic/class_list.dart @@ -83,7 +83,7 @@ class ClassPanel extends StatelessWidget { /// A list of all the classes for a given day. /// /// The list is composed of [ClassPanel]s, one for each period in the day. -class ClassList extends StatelessWidget { +class ClassList extends StatefulWidget { /// The day whose periods should be represented. final Day day; @@ -96,36 +96,42 @@ class ClassList extends StatelessWidget { final String? headerText; /// Creates a list of [ClassPanel] widgets to represent periods in a day. - const ClassList ({ + const ClassList({ required this.day, required this.periods, this.headerText, }); + @override + ClassListState createState() => ClassListState(); +} + +/// A state for the class list. +class ClassListState extends ModelListener { + /// Creates a state that can read reminders + ClassListState() : super(shouldDispose: false); + @override - Widget build(BuildContext context) => ModelListener( - model: () => Models.instance.reminders, - dispose: false, - // ignore: sort_child_properties_last - child: DrawerHeader ( - child: Center ( - child: Text ( - headerText ?? "", - textScaleFactor: 2, - textAlign: TextAlign.center, + Reminders getModel() => Models.instance.reminders; + + @override + Widget build(BuildContext context) => ListView( + shrinkWrap: true, + children: [ + if (widget.headerText != null) DrawerHeader( + child: Center ( + child: Text ( + widget.headerText ?? "", + textScaleFactor: 2, + textAlign: TextAlign.center, + ) ) - ) - ), - builder: (_, __, Widget? header) => ListView( - shrinkWrap: true, - children: [ - if (headerText != null) header!, // child is supplied - ...[ - for (final Period period in periods) - getPanel(period) - ], - ] - ) + ), + ...[ + for (final Period period in widget.periods) + getPanel(period) + ], + ] ); /// Creates a [ClassPanel] for a given period. @@ -144,7 +150,7 @@ class ClassList extends StatelessWidget { : "${period.name}: ${period.getName(subject)}", reminders: Models.instance.reminders.getReminders( period: period.name, - dayName: day.name, + dayName: widget.day.name, subject: subject?.name, ), activity: period.activity, diff --git a/lib/src/widgets/generic/footer.dart b/lib/src/widgets/generic/footer.dart index cf86464af..2ff10738d 100644 --- a/lib/src/widgets/generic/footer.dart +++ b/lib/src/widgets/generic/footer.dart @@ -11,59 +11,67 @@ import "package:ramaz/widgets.dart"; /// /// The footer should be displayed on every page where the current schedule is /// not being shown. -class Footer extends StatelessWidget { +class Footer extends StatefulWidget { /// A scale factor for the footer text. static const double textScale = 1.25; + @override + FooterState createState() => FooterState(); +} + +/// The state of the footer. +/// +/// The footer refreshes whenever the schedule or reminders change. +class FooterState extends ModelListener { + /// Doesn't dispose the data model since it's used elsewhere. + FooterState() : super(shouldDispose: false); + + @override + ScheduleModel getModel() => Models.instance.schedule; + @override - Widget build (BuildContext context) => ModelListener( - model: () => Models.instance.schedule, - dispose: false, - // ignore: sort_child_properties_last - child: Container(height: 0, width: 0), - builder: (_, ScheduleModel schedule, Widget? blank) => - schedule.nextPeriod == null ? blank! : BottomSheet ( - enableDrag: false, - onClosing: () {}, - builder: (BuildContext context) => GestureDetector( - onTap: !Models.instance.reminders.hasNextReminder ? null : - () { - final NavigatorState nav = Navigator.of(context); - if (nav.canPop()) { - nav.pop(); - } - nav.pushReplacementNamed(Routes.home); - }, - child: SizedBox ( - height: 70, - child: Align ( - child: Column ( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text ( - // ternary already checked for schedule.nextPeriod == null - "Next: ${schedule.nextPeriod!.getName(schedule.nextSubject)}", - textScaleFactor: textScale - ), - Text ( - // ternary already checked for schedule.nextPeriod == null - (schedule.nextPeriod! - .getInfo(schedule.nextSubject) - ..removeWhere( - (String str) => ( - str.startsWith("Period: ") || - str.startsWith("Teacher: ") - ) + Widget build (BuildContext context) => model.nextPeriod == null ? Container() + : BottomSheet ( + enableDrag: false, + onClosing: () {}, + builder: (BuildContext context) => GestureDetector( + onTap: !Models.instance.reminders.hasNextReminder ? null : + () { + final NavigatorState nav = Navigator.of(context); + if (nav.canPop()) { + nav.pop(); + } + nav.pushReplacementNamed(Routes.home); + }, + child: SizedBox ( + height: 70, + child: Align ( + child: Column ( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text ( + // ternary already checked for schedule.nextPeriod == null + "Next: ${model.nextPeriod!.getName(model.nextSubject)}", + textScaleFactor: Footer.textScale + ), + Text ( + // ternary already checked for schedule.nextPeriod == null + (model.nextPeriod! + .getInfo(model.nextSubject) + ..removeWhere( + (String str) => ( + str.startsWith("Period: ") || + str.startsWith("Teacher: ") ) - ).join (". "), - textScaleFactor: textScale, - ), - if (schedule.nextPeriod?.activity != null) - const Text("There is an activity"), - if (Models.instance.reminders.hasNextReminder) - const Text ("Click to see reminder"), - ] - ) + ) + ).join (". "), + textScaleFactor: Footer.textScale, + ), + if (model.nextPeriod?.activity != null) + const Text("There is an activity"), + if (Models.instance.reminders.hasNextReminder) + const Text ("Click to see reminder"), + ] ) ) ) diff --git a/lib/src/widgets/generic/model_listener.dart b/lib/src/widgets/generic/model_listener.dart index 0e99d04cd..b5de6a69d 100644 --- a/lib/src/widgets/generic/model_listener.dart +++ b/lib/src/widgets/generic/model_listener.dart @@ -1,83 +1,41 @@ import "package:flutter/material.dart"; -/// A function to build a widget with a [ChangeNotifier] subclass. -typedef ModelBuilder = - Widget Function(BuildContext context, T model, Widget? child); - -/// A widget that listens to a [ChangeNotifier] and rebuilds the widget tree -/// when [ChangeNotifier.notifyListeners]. -class ModelListener extends StatefulWidget { - /// A function to create the model to listen to. +/// A widget that rebuilds when the underlying data changes. +abstract class ModelListener< + M extends ChangeNotifier, + T extends StatefulWidget +> extends State { + /// The data model to listen to. + late final M model; + + /// Whether we should dispose the model after use. /// - /// It is important that this be a function and not an instance, because - /// otherwise the model will be recreated every time the widget tree - /// is updated. With a function, this widget can choose when to create - /// the model. - final Model Function() model; - - /// The function to build the widget tree underneath this. - final ModelBuilder builder; + /// Some models are used multiple times, so they should not be disposed. + final bool shouldDispose; - /// An optional child to cache. - /// - /// This child is never re-built, so if there is an expensive widget that - /// does not depend on [model], it would go here and can be - /// re-used in [builder]. - final Widget? child; + /// Creates a widget that updates when the underlying data changes + ModelListener({this.shouldDispose = true}); - /// Whether or not to dispose the [model]. + /// The function to create the data model /// - /// Some models are used elsewhere in the app (like data models) while other - /// models (like view models) are only used in one screen. - final bool dispose; - - /// Creates a widget that listens to a [ChangeNotifier]. - const ModelListener ({ - required this.model, - required this.builder, - this.child, - this.dispose = true - }); - - @override - ModelListenerState createState() => ModelListenerState(); -} - -/// A state for a [ModelListener]. -class ModelListenerState - extends State> -{ - /// The model to listen to. - /// - /// This is different than [ModelListener.model], which is a function that is - /// called to create the model. Here is where the result of that function is - /// actually stored. - late final Model model; - - @override + /// This has to be overriden in a `State` + M getModel(); + + void _listener() => setState(() {}); + + @override void initState() { super.initState(); - model = widget.model()..addListener(listener); + model = getModel(); + model.addListener(_listener); } - - @override + + @override void dispose() { - try { - model.removeListener(listener); - } catch(_) { // ignore: avoid_catches_without_on_clauses - // The model may have already been disposed. If so, we're good. - } - if (widget.dispose) { + model.removeListener(_listener); + if (shouldDispose) { model.dispose(); } super.dispose(); } - - @override - Widget build (BuildContext context) => widget.builder ( - context, model, widget.child - ); - - /// Rebuilds the widget tree whenever [model] updates. - void listener() => setState(() {}); } diff --git a/lib/src/widgets/responsive_scaffold/navigation_item.dart b/lib/src/widgets/responsive_scaffold/navigation_item.dart index 8b6230d16..c3c21d770 100644 --- a/lib/src/widgets/responsive_scaffold/navigation_item.dart +++ b/lib/src/widgets/responsive_scaffold/navigation_item.dart @@ -4,8 +4,13 @@ import "package:flutter/material.dart"; /// /// This class maps to both [BottomNavigationBarItem] and /// [NavigationRailDestination] with an [icon] and [label] property. -@immutable -abstract class NavigationItem extends StatelessWidget { +abstract class NavigationItem { + /// The data model for this page, if any. + M? model; + + /// Whether this item's data model should be disposed. + bool shouldDispose; + /// The icon for this item. final Widget icon; @@ -15,7 +20,12 @@ abstract class NavigationItem extends StatelessWidget { final String label; /// Creates an abstraction for a navigation item. - const NavigationItem({required this.icon, required this.label}); + NavigationItem({ + required this.icon, + required this.label, + this.model, + this.shouldDispose = true, + }); /// Generates an item for [BottomNavigationBar]. BottomNavigationBarItem get bottomNavBar => @@ -36,4 +46,7 @@ abstract class NavigationItem extends StatelessWidget { /// The FAB location for this page. FloatingActionButtonLocation? get floatingActionButtonLocation => null; + + /// The main content on the page. + Widget build(BuildContext context); } diff --git a/lib/src/widgets/responsive_scaffold/scaffold.dart b/lib/src/widgets/responsive_scaffold/scaffold.dart index 1dbecd016..58fb0b86f 100644 --- a/lib/src/widgets/responsive_scaffold/scaffold.dart +++ b/lib/src/widgets/responsive_scaffold/scaffold.dart @@ -12,7 +12,7 @@ import "responsive_builder.dart"; /// primary navigation items (to avoid duplication in the UI). /// /// See the package documentation for how the layout is determined. -class ResponsiveScaffold extends StatelessWidget { +class ResponsiveScaffold extends StatefulWidget { /// The app bar. /// /// This does not change with the layout, except for showing a drawer menu. @@ -67,11 +67,8 @@ class ResponsiveScaffold extends StatelessWidget { /// [secondaryDrawer] that does not include these items. final List? navItems; - /// The index of the current navigation item in [navItems]. - final int? navIndex; - - /// A callback for when the user selects a navigation item. - final ValueChanged? onNavIndexChanged; + /// The initial index of the current navigation item in [navItems]. + final int? initialNavIndex; /// Creates a scaffold that responds to the screen size. const ResponsiveScaffold({ @@ -84,67 +81,112 @@ class ResponsiveScaffold extends StatelessWidget { }) : secondaryDrawer = null, navItems = null, - navIndex = null, - onNavIndexChanged = null; + initialNavIndex = null; /// Creates a responsive layout with primary navigation items. ResponsiveScaffold.navBar({ required this.drawer, required this.secondaryDrawer, required List this.navItems, - required int this.navIndex, - required this.onNavIndexChanged, + required int this.initialNavIndex, }) : - appBar = navItems [navIndex].appBar, - bodyBuilder = navItems [navIndex].build, - floatingActionButton = navItems [navIndex].floatingActionButton, - floatingActionButtonLocation = navItems [navIndex] + appBar = navItems [initialNavIndex].appBar, + bodyBuilder = navItems [initialNavIndex].build, + floatingActionButton = navItems [initialNavIndex].floatingActionButton, + floatingActionButtonLocation = navItems [initialNavIndex] .floatingActionButtonLocation, - sideSheet = navItems [navIndex].sideSheet; + sideSheet = navItems [initialNavIndex].sideSheet; /// Whether this widget is being used with a navigation bar. bool get hasNavBar => navItems != null; + @override + ResponsiveScaffoldState createState() => ResponsiveScaffoldState(); +} + +/// The state of the scaffold. +class ResponsiveScaffoldState extends State { + late int _navIndex; + + /// The index of the current navigation item in [ResponsiveScaffold.navItems]. + int get navIndex => _navIndex; + set navIndex(int value) { + _dispose(navItem); + _navIndex = value; + _listen(navItem); + setState(() {}); + } + + /// The currently selected navigation item, if any. + NavigationItem? get navItem => !widget.hasNavBar ? null + : widget.navItems! [navIndex]; + + /// Refreshes the page when the underlying data changes. + void listener() => setState(() {}); + + void _listen(NavigationItem? item) => item?.model?.addListener(listener); + void _dispose(NavigationItem? item) { + if (item != null) { + item.model?.removeListener(listener); + if (item.shouldDispose) { + item.model?.dispose(); + } + } + } + + @override + void initState() { + super.initState(); + _navIndex = widget.initialNavIndex ?? 0; + _listen(navItem); + } + + @override + void dispose() { + _dispose(navItem); + super.dispose(); + } + @override Widget build(BuildContext context) => ResponsiveBuilder( - child: bodyBuilder(context), // ignore: sort_child_properties_last + child: widget.bodyBuilder(context), // ignore: sort_child_properties_last builder: (BuildContext context, LayoutInfo info, Widget? child) => Scaffold( - appBar: appBar, + appBar: widget.appBar, drawer: info.hasStandardDrawer ? null - : Drawer(child: hasNavBar ? secondaryDrawer : drawer), - endDrawer: info.hasStandardSideSheet || sideSheet == null - ? null : Drawer(child: sideSheet), - floatingActionButton: floatingActionButton, - floatingActionButtonLocation: floatingActionButtonLocation, - bottomNavigationBar: !hasNavBar || !info.hasBottomNavBar + : Drawer(child: widget.hasNavBar ? widget.secondaryDrawer : widget.drawer), + endDrawer: info.hasStandardSideSheet || widget.sideSheet == null + ? null : Drawer(child: widget.sideSheet), + floatingActionButton: widget.floatingActionButton, + floatingActionButtonLocation: widget.floatingActionButtonLocation, + bottomNavigationBar: !widget.hasNavBar || !info.hasBottomNavBar ? null : BottomNavigationBar( type: BottomNavigationBarType.fixed, items: [ - for (final NavigationItem item in navItems!) + for (final NavigationItem item in widget.navItems!) item.bottomNavBar, ], - currentIndex: navIndex!, - onTap: onNavIndexChanged, + currentIndex: navIndex, + onTap: (int index) => navIndex = index, ), body: Row( children: [ - if (hasNavBar && info.hasNavRail) NavigationRail( + if (widget.hasNavBar && info.hasNavRail) NavigationRail( labelType: NavigationRailLabelType.all, destinations: [ - for (final NavigationItem item in navItems!) + for (final NavigationItem item in widget.navItems!) item.navRail, ], - selectedIndex: navIndex!, - onDestinationSelected: onNavIndexChanged, + selectedIndex: navIndex, + onDestinationSelected: (int index) => navIndex = index, ) - else if (info.hasStandardDrawer) drawer, + else if (info.hasStandardDrawer) widget.drawer, Expanded(child: child!), - if (sideSheet != null && info.hasStandardSideSheet) ...[ + if (widget.sideSheet != null && info.hasStandardSideSheet) ...[ const VerticalDivider(), SizedBox( width: 320, - child: Drawer(elevation: 0, child: sideSheet), + child: Drawer(elevation: 0, child: widget.sideSheet), ) ] ] From 23ac7c386face628241f3007ca9c12a38a899f79 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 29 Apr 2021 16:13:26 -0400 Subject: [PATCH 195/251] Fixed model dispose bug on home screen --- lib/src/widgets/responsive_scaffold/scaffold.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/src/widgets/responsive_scaffold/scaffold.dart b/lib/src/widgets/responsive_scaffold/scaffold.dart index 58fb0b86f..07873a803 100644 --- a/lib/src/widgets/responsive_scaffold/scaffold.dart +++ b/lib/src/widgets/responsive_scaffold/scaffold.dart @@ -128,9 +128,6 @@ class ResponsiveScaffoldState extends State { void _dispose(NavigationItem? item) { if (item != null) { item.model?.removeListener(listener); - if (item.shouldDispose) { - item.model?.dispose(); - } } } @@ -144,6 +141,11 @@ class ResponsiveScaffoldState extends State { @override void dispose() { _dispose(navItem); + for (final NavigationItem item in widget.navItems ?? []) { + if (item.shouldDispose) { + item.model?.dispose(); + } + } super.dispose(); } From b6de23aed08186d707b3fd8d08fee363e769c6c1 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Fri, 30 Apr 2021 01:22:40 -0400 Subject: [PATCH 196/251] Fixed HomeScreen page-switching issues --- .../widgets/responsive_scaffold/scaffold.dart | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/lib/src/widgets/responsive_scaffold/scaffold.dart b/lib/src/widgets/responsive_scaffold/scaffold.dart index 07873a803..4f9e5cc60 100644 --- a/lib/src/widgets/responsive_scaffold/scaffold.dart +++ b/lib/src/widgets/responsive_scaffold/scaffold.dart @@ -16,10 +16,10 @@ class ResponsiveScaffold extends StatefulWidget { /// The app bar. /// /// This does not change with the layout, except for showing a drawer menu. - final PreferredSizeWidget appBar; + final PreferredSizeWidget? appBar; /// The main body of the scaffold. - final WidgetBuilder bodyBuilder; + final WidgetBuilder? bodyBuilder; /// The full drawer to show. /// @@ -84,18 +84,17 @@ class ResponsiveScaffold extends StatefulWidget { initialNavIndex = null; /// Creates a responsive layout with primary navigation items. - ResponsiveScaffold.navBar({ + const ResponsiveScaffold.navBar({ required this.drawer, required this.secondaryDrawer, required List this.navItems, required int this.initialNavIndex, - }) : - appBar = navItems [initialNavIndex].appBar, - bodyBuilder = navItems [initialNavIndex].build, - floatingActionButton = navItems [initialNavIndex].floatingActionButton, - floatingActionButtonLocation = navItems [initialNavIndex] - .floatingActionButtonLocation, - sideSheet = navItems [initialNavIndex].sideSheet; + }) : + appBar = null, + sideSheet = null, + bodyBuilder = null, + floatingActionButton = null, + floatingActionButtonLocation = null; /// Whether this widget is being used with a navigation bar. bool get hasNavBar => navItems != null; @@ -125,11 +124,7 @@ class ResponsiveScaffoldState extends State { void listener() => setState(() {}); void _listen(NavigationItem? item) => item?.model?.addListener(listener); - void _dispose(NavigationItem? item) { - if (item != null) { - item.model?.removeListener(listener); - } - } + void _dispose(NavigationItem? item) => item?.model?.removeListener(listener); @override void initState() { @@ -151,17 +146,20 @@ class ResponsiveScaffoldState extends State { @override Widget build(BuildContext context) => ResponsiveBuilder( - child: widget.bodyBuilder(context), // ignore: sort_child_properties_last + // ignore: sort_child_properties_last + child: navItem?.build(context) ?? widget.bodyBuilder?.call(context), builder: (BuildContext context, LayoutInfo info, Widget? child) => Scaffold( - appBar: widget.appBar, + appBar: navItem?.appBar ?? widget.appBar, drawer: info.hasStandardDrawer ? null : Drawer(child: widget.hasNavBar ? widget.secondaryDrawer : widget.drawer), - endDrawer: info.hasStandardSideSheet || widget.sideSheet == null - ? null : Drawer(child: widget.sideSheet), - floatingActionButton: widget.floatingActionButton, - floatingActionButtonLocation: widget.floatingActionButtonLocation, - bottomNavigationBar: !widget.hasNavBar || !info.hasBottomNavBar - ? null + endDrawer: info.hasStandardSideSheet + || (navItem?.sideSheet ?? widget.sideSheet) == null + ? null : Drawer(child: navItem?.sideSheet ?? widget.sideSheet), + floatingActionButton: navItem?.floatingActionButton + ?? widget.floatingActionButton, + floatingActionButtonLocation: navItem?.floatingActionButtonLocation + ?? widget.floatingActionButtonLocation, + bottomNavigationBar: !widget.hasNavBar || !info.hasBottomNavBar ? null : BottomNavigationBar( type: BottomNavigationBarType.fixed, items: [ @@ -178,17 +176,23 @@ class ResponsiveScaffoldState extends State { destinations: [ for (final NavigationItem item in widget.navItems!) item.navRail, - ], + ], selectedIndex: navIndex, onDestinationSelected: (int index) => navIndex = index, ) else if (info.hasStandardDrawer) widget.drawer, Expanded(child: child!), - if (widget.sideSheet != null && info.hasStandardSideSheet) ...[ + if ( + (navItem?.sideSheet ?? widget.sideSheet) != null + && info.hasStandardSideSheet + ) ...[ const VerticalDivider(), SizedBox( width: 320, - child: Drawer(elevation: 0, child: widget.sideSheet), + child: Drawer( + elevation: 0, + child: navItem?.sideSheet ?? widget.sideSheet + ), ) ] ] From 80df3c633cc8acb32598b5579f144cb00874afe8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 13:16:13 -0400 Subject: [PATCH 197/251] Bump lodash from 4.17.19 to 4.17.21 in /firebase/rules_test (#74) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.19 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.19...4.17.21) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- firebase/rules_test/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firebase/rules_test/package-lock.json b/firebase/rules_test/package-lock.json index b4895a8c0..166e6f1bd 100644 --- a/firebase/rules_test/package-lock.json +++ b/firebase/rules_test/package-lock.json @@ -1706,9 +1706,9 @@ } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.camelcase": { From 3671298a93cdba55e591fba049029a7a9b1fb268 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 13:16:42 -0400 Subject: [PATCH 198/251] Bump lodash in /firebase/cloud_functions/functions (#75) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.19 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.19...4.17.21) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- firebase/cloud_functions/functions/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firebase/cloud_functions/functions/package-lock.json b/firebase/cloud_functions/functions/package-lock.json index 4eae2a601..7755da501 100644 --- a/firebase/cloud_functions/functions/package-lock.json +++ b/firebase/cloud_functions/functions/package-lock.json @@ -1491,9 +1491,9 @@ } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.at": { "version": "4.6.0", From 70b3cdef0482077210b0f978f776309d73790bb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 13:17:44 -0400 Subject: [PATCH 199/251] Bump grpc from 1.24.2 to 1.24.9 in /firebase/rules_test (#76) Bumps [grpc](https://github.com/grpc/grpc-node) from 1.24.2 to 1.24.9. - [Release notes](https://github.com/grpc/grpc-node/releases) - [Commits](https://github.com/grpc/grpc-node/commits) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- firebase/rules_test/package-lock.json | 1768 ++++++++++++++++++------- firebase/rules_test/package.json | 2 +- 2 files changed, 1313 insertions(+), 457 deletions(-) diff --git a/firebase/rules_test/package-lock.json b/firebase/rules_test/package-lock.json index 166e6f1bd..aeb7f394c 100644 --- a/firebase/rules_test/package-lock.json +++ b/firebase/rules_test/package-lock.json @@ -113,6 +113,505 @@ "@grpc/proto-loader": "^0.5.0", "grpc": "1.24.2", "tslib": "1.11.1" + }, + "dependencies": { + "grpc": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.2.tgz", + "integrity": "sha512-EG3WH6AWMVvAiV15d+lr+K77HJ/KV/3FvMpjKjulXHbTwgDZkhkcWbwhxFAoTdxTkQvy0WFcO3Nog50QBbHZWw==", + "dev": true, + "requires": { + "@types/bytebuffer": "^5.0.40", + "lodash.camelcase": "^4.3.0", + "lodash.clone": "^4.5.0", + "nan": "^2.13.2", + "node-pre-gyp": "^0.14.0", + "protobufjs": "^5.0.3" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.4", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "npm-packlist": { + "version": "1.4.6", + "bundled": true, + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true + } + } + }, + "protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "dev": true, + "requires": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + } + } } }, "@firebase/firestore-types": { @@ -274,6 +773,505 @@ "firebase": "7.11.0", "grpc": "1.24.2", "request": "2.88.2" + }, + "dependencies": { + "grpc": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.2.tgz", + "integrity": "sha512-EG3WH6AWMVvAiV15d+lr+K77HJ/KV/3FvMpjKjulXHbTwgDZkhkcWbwhxFAoTdxTkQvy0WFcO3Nog50QBbHZWw==", + "dev": true, + "requires": { + "@types/bytebuffer": "^5.0.40", + "lodash.camelcase": "^4.3.0", + "lodash.clone": "^4.5.0", + "nan": "^2.13.2", + "node-pre-gyp": "^0.14.0", + "protobufjs": "^5.0.3" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.4", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "npm-packlist": { + "version": "1.4.6", + "bundled": true, + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true + } + } + }, + "protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "dev": true, + "requires": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + } + } } }, "@firebase/util": { @@ -301,6 +1299,37 @@ "protobufjs": "^6.8.6" } }, + "@mapbox/node-pre-gyp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", + "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "tar": "^6.1.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -366,9 +1395,9 @@ "dev": true }, "@types/bytebuffer": { - "version": "5.0.40", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.40.tgz", - "integrity": "sha512-h48dyzZrPMz25K6Q4+NCwWaxwXany2FhQg/ErOcdZS1ZpsaDnDMZg8JYLMTGz7uvXKrcKGJUZJlZObyfgdaN9g==", + "version": "5.0.42", + "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.42.tgz", + "integrity": "sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==", "requires": { "@types/long": "*", "@types/node": "*" @@ -408,6 +1437,34 @@ "integrity": "sha512-wHNBMnkoEBiRAd3s8KTKwIuO9biFtTf0LehITzBhSco+HQI0xkXZbLOD55SW3Aqw3oUkHstkm5SPv58yaAdFPQ==", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "ajv": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", @@ -450,6 +1507,20 @@ "picomatch": "^2.0.4" } }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -504,8 +1575,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -526,7 +1596,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -611,6 +1680,11 @@ "readdirp": "~3.2.0" } }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -658,8 +1732,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "configuration-processor": { "version": "1.1.1", @@ -667,6 +1740,11 @@ "integrity": "sha1-8hiQhbJZ2M2eXnwqy67Fx/FiBaI=", "dev": true }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "core-js": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", @@ -676,8 +1754,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "dashdash": { "version": "1.14.1", @@ -726,6 +1803,16 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -924,11 +2011,18 @@ "mime-types": "^2.1.12" } }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.1.2", @@ -943,6 +2037,21 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -962,7 +2071,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -988,315 +2096,18 @@ "dev": true }, "grpc": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.2.tgz", - "integrity": "sha512-EG3WH6AWMVvAiV15d+lr+K77HJ/KV/3FvMpjKjulXHbTwgDZkhkcWbwhxFAoTdxTkQvy0WFcO3Nog50QBbHZWw==", + "version": "1.24.9", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.9.tgz", + "integrity": "sha512-BOq1AJocZJcG/6qyX3LX2KvKy91RIix10GFLhqWg+1L6b73uWIN2w0cq+lSi0q9mXfkjeFaBz83+oau7oJqG3Q==", "requires": { + "@mapbox/node-pre-gyp": "^1.0.4", "@types/bytebuffer": "^5.0.40", "lodash.camelcase": "^4.3.0", "lodash.clone": "^4.5.0", "nan": "^2.13.2", - "node-pre-gyp": "^0.14.0", "protobufjs": "^5.0.3" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.4", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "bundled": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true - } - } - }, - "ms": { - "version": "2.1.2", - "bundled": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^1.0.0", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==" - } - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true - }, - "npm-packlist": { - "version": "1.4.6", - "bundled": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true - }, "protobufjs": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", @@ -1307,133 +2118,6 @@ "glob": "^7.0.5", "yargs": "^3.10.0" } - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.5", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true - }, - "sax": { - "version": "1.2.4", - "bundled": true - }, - "semver": { - "version": "5.7.1", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^1.0.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true } } }, @@ -1474,6 +2158,11 @@ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -1497,6 +2186,30 @@ "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1516,7 +2229,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1525,8 +2237,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "invert-kv": { "version": "1.0.0", @@ -1619,6 +2330,11 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1736,6 +2452,29 @@ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", "dev": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, "mime-db": { "version": "1.43.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", @@ -1755,11 +2494,32 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, "mocha": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.0.tgz", @@ -1885,9 +2645,9 @@ "dev": true }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, "node-environment-flags": { "version": "1.0.6", @@ -1909,12 +2669,31 @@ "is-stream": "^1.0.1" } }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -1926,6 +2705,11 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", @@ -1964,7 +2748,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -2015,8 +2798,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "performance-now": { "version": "2.1.0", @@ -2036,6 +2818,11 @@ "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "promise-polyfill": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", @@ -2089,6 +2876,27 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "readdirp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", @@ -2151,6 +2959,14 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", @@ -2172,8 +2988,12 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "sprintf-js": { "version": "1.0.3", @@ -2228,6 +3048,21 @@ "function-bind": "^1.1.1" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -2251,6 +3086,19 @@ "has-flag": "^3.0.0" } }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2300,6 +3148,11 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -2359,7 +3212,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -2381,8 +3233,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xmlhttprequest": { "version": "1.8.0", @@ -2395,6 +3246,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yargs": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", diff --git a/firebase/rules_test/package.json b/firebase/rules_test/package.json index ccc0919a4..c9e2dcc8d 100644 --- a/firebase/rules_test/package.json +++ b/firebase/rules_test/package.json @@ -13,6 +13,6 @@ "prettier": "^1.19.1" }, "dependencies": { - "grpc": "^1.24.2" + "grpc": "^1.24.9" } } From e7b90ceccaf6a26ac04eb68826fd0794ffc876c8 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 12 May 2021 13:25:14 -0400 Subject: [PATCH 200/251] Add Blocking Issues to RamLife (#77) --- .github/workflows/blocking-issues.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/workflows/blocking-issues.yml diff --git a/.github/workflows/blocking-issues.yml b/.github/workflows/blocking-issues.yml new file mode 100644 index 000000000..2047af1b4 --- /dev/null +++ b/.github/workflows/blocking-issues.yml @@ -0,0 +1,15 @@ +name: Blocking Issues + +on: + issues: + types: [closed] + pull_request_target: + types: [opened, edited] + +jobs: + blocking_issues: + runs-on: ubuntu-latest + name: Checks for blocking issues + + steps: + - uses: Levi-Lesches/blocking-issues@v1 From c77123ce3bc08ea40ea912a5ed832c6d2e5b489c Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 13 May 2021 15:47:52 -0400 Subject: [PATCH 201/251] Completely redid the database (#70) * Added Firestore and Idb services and replaced Database Still have to delete local_db and cloud_db * Migrated Services.Databases -> Services.Database * Temp commit * Made databases a little more convenient * Added HybridCalendar to Database * Use cloud_firestore import from services/firestore.dart * Deleted old Databases * Made Idb more convenient to use * Added HybridReminders to Database * Temp * Fully replaced Databases -> Database * Updated app (models) to use new Database class * Switched reminder keypath from autoincrement to id * Migrated Reminder.hash -> Reminder.id * Updated new versions of Firebase libraries * Fixed type errors with new Firebase 2.0 --- lib/services.dart | 7 +- lib/src/data/reminder.dart | 12 +- .../data/reminders/period_reminder_time.dart | 3 - lib/src/data/reminders/reminder_time.dart | 3 - .../data/reminders/subject_reminder_time.dart | 4 - lib/src/models/data/reminders.dart | 20 +- lib/src/models/data/schedule.dart | 13 +- lib/src/models/data/sports.dart | 6 +- lib/src/models/data/user.dart | 11 +- lib/src/models/view/admin_schedules.dart | 2 +- .../view/builders/reminder_builder.dart | 7 + lib/src/models/view/calendar_editor.dart | 18 +- lib/src/models/view/feedback.dart | 2 +- lib/src/models/view/home.dart | 4 +- lib/src/pages/sports.dart | 4 +- lib/src/services/cloud_db.dart | 247 -------------- lib/src/services/database.dart | 197 +++++------- lib/src/services/databases.dart | 157 --------- .../services/databases/calendar/hybrid.dart | 55 ++++ .../databases/calendar/implementation.dart | 79 +++++ .../databases/calendar/interface.dart | 22 ++ lib/src/services/databases/hybrid.dart | 27 ++ .../services/databases/reminders/hybrid.dart | 41 +++ .../databases/reminders/implementation.dart | 49 +++ .../databases/reminders/interface.dart | 16 + .../services/databases/schedule/hybrid.dart | 38 +++ .../databases/schedule/implementation.dart | 35 ++ .../databases/schedule/interface.dart | 8 + lib/src/services/databases/sports/hybrid.dart | 29 ++ .../databases/sports/implementation.dart | 54 ++++ .../services/databases/sports/interface.dart | 10 + lib/src/services/databases/user/hybrid.dart | 31 ++ .../databases/user/implementation.dart | 44 +++ .../services/databases/user/interface.dart | 8 + lib/src/services/firestore.dart | 75 +++++ lib/src/services/idb.dart | 166 ++++++++++ lib/src/services/local_db.dart | 304 ------------------ lib/src/services/service.dart | 9 + lib/src/widgets/atomic/reminder_tile.dart | 2 +- pubspec.lock | 30 +- pubspec.yaml | 15 +- web/index.html | 10 +- 42 files changed, 964 insertions(+), 910 deletions(-) delete mode 100644 lib/src/services/cloud_db.dart delete mode 100644 lib/src/services/databases.dart create mode 100644 lib/src/services/databases/calendar/hybrid.dart create mode 100644 lib/src/services/databases/calendar/implementation.dart create mode 100644 lib/src/services/databases/calendar/interface.dart create mode 100644 lib/src/services/databases/hybrid.dart create mode 100644 lib/src/services/databases/reminders/hybrid.dart create mode 100644 lib/src/services/databases/reminders/implementation.dart create mode 100644 lib/src/services/databases/reminders/interface.dart create mode 100644 lib/src/services/databases/schedule/hybrid.dart create mode 100644 lib/src/services/databases/schedule/implementation.dart create mode 100644 lib/src/services/databases/schedule/interface.dart create mode 100644 lib/src/services/databases/sports/hybrid.dart create mode 100644 lib/src/services/databases/sports/implementation.dart create mode 100644 lib/src/services/databases/sports/interface.dart create mode 100644 lib/src/services/databases/user/hybrid.dart create mode 100644 lib/src/services/databases/user/implementation.dart create mode 100644 lib/src/services/databases/user/interface.dart create mode 100644 lib/src/services/firestore.dart create mode 100644 lib/src/services/idb.dart delete mode 100644 lib/src/services/local_db.dart diff --git a/lib/services.dart b/lib/services.dart index 8e286738e..c81ffec01 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -15,19 +15,16 @@ library ramaz_services; import "src/services/crashlytics.dart"; -import "src/services/databases.dart"; +import "src/services/database.dart"; import "src/services/notifications.dart"; import "src/services/preferences.dart"; import "src/services/push_notifications.dart"; import "src/services/service.dart"; export "src/services/auth.dart"; -export "src/services/cloud_db.dart"; export "src/services/crashlytics.dart"; export "src/services/database.dart"; -export "src/services/databases.dart"; export "src/services/firebase_core.dart"; -export "src/services/local_db.dart"; export "src/services/notifications.dart"; export "src/services/preferences.dart"; export "src/services/push_notifications.dart"; @@ -46,7 +43,7 @@ class Services implements Service { final Crashlytics crashlytics = Crashlytics.instance; /// The database bundle. - final Databases database = Databases(); + final Database database = Database(); /// The local notifications interface. /// diff --git a/lib/src/data/reminder.dart b/lib/src/data/reminder.dart index 35bdfcc29..b800747c6 100644 --- a/lib/src/data/reminder.dart +++ b/lib/src/data/reminder.dart @@ -41,10 +41,16 @@ class Reminder { /// The [ReminderTime] for this reminder. final ReminderTime time; + /// A unique ID for this reminder. + /// + /// Used to locate this in a database. + final String id; + /// Creates a new reminder. const Reminder({ required this.message, required this.time, + required this.id, }); /// Creates a new [Reminder] from a JSON object. @@ -53,6 +59,7 @@ class Reminder { /// to [ReminderTime.fromJson] Reminder.fromJson(dynamic json) : message = json ["message"], + id = json ["id"], time = ReminderTime.fromJson(Map.from(json ["time"])); @override String toString() => "$message ($time)"; @@ -61,9 +68,6 @@ class Reminder { Map toJson() => { "message": message, "time": time.toJson(), - "hash": hash, + "id": id, }; - - /// A unique identifier for this reminder. - String get hash => "$message-${time.hash}"; } diff --git a/lib/src/data/reminders/period_reminder_time.dart b/lib/src/data/reminders/period_reminder_time.dart index cf786b001..2a05c1015 100644 --- a/lib/src/data/reminders/period_reminder_time.dart +++ b/lib/src/data/reminders/period_reminder_time.dart @@ -47,7 +47,4 @@ class PeriodReminderTime extends ReminderTime { required String? subject, required String? period, }) => dayName == this.dayName && period == this.period; - - @override - String get hash => "$dayName-$period-$repeats"; } diff --git a/lib/src/data/reminders/reminder_time.dart b/lib/src/data/reminders/reminder_time.dart index 2baf4036f..326101c25 100644 --- a/lib/src/data/reminders/reminder_time.dart +++ b/lib/src/data/reminders/reminder_time.dart @@ -112,7 +112,4 @@ abstract class ReminderTime { /// Used for debugging and throughout the UI. @override String toString(); - - /// A unique identifier for this reminder. - String get hash; } diff --git a/lib/src/data/reminders/subject_reminder_time.dart b/lib/src/data/reminders/subject_reminder_time.dart index 635aed9c1..e300b40e5 100644 --- a/lib/src/data/reminders/subject_reminder_time.dart +++ b/lib/src/data/reminders/subject_reminder_time.dart @@ -36,8 +36,4 @@ class SubjectReminderTime extends ReminderTime { required String? subject, required String? period, }) => subject == name; - - @override - String get hash => "$name-$repeats"; } - diff --git a/lib/src/models/data/reminders.dart b/lib/src/models/data/reminders.dart index cb7bde681..5289ea794 100644 --- a/lib/src/models/data/reminders.dart +++ b/lib/src/models/data/reminders.dart @@ -31,7 +31,7 @@ class Reminders extends Model { @override Future init() async { reminders = [ - for (final Map json in await Services.instance.database.reminders) + for (final Map json in await Services.instance.database.reminders.getAll()) Reminder.fromJson(json) ]; } @@ -92,9 +92,15 @@ class Reminders extends Model { if (reminder == null) { return; } - final String oldHash = reminders [index].hash; + if (reminders [index].id != reminder.id) { + throw ArgumentError.value( + reminder.id, // value + "New reminder id", // name of value + "New reminder ID must match old reminder ID", // message + ); + } reminders [index] = reminder; - Services.instance.database.updateReminder(oldHash, reminder.toJson()); + Services.instance.database.reminders.set(reminder.toJson()); verifyReminders(index); notifyListeners(); } @@ -105,15 +111,15 @@ class Reminders extends Model { return; } reminders.add(reminder); - Services.instance.database.updateReminder(null, reminder.toJson()); + Services.instance.database.reminders.set(reminder.toJson()); notifyListeners(); } /// Deletes the reminder at a given index. - void deleteReminder(int index) { - final String oldHash = reminders [index].hash; + Future deleteReminder(int index) async { + final String id = reminders [index].id; + await Services.instance.database.reminders.delete(id); reminders.removeAt(index); - Services.instance.database.deleteReminder(oldHash); verifyReminders(index); // remove the reminder from the schedule notifyListeners(); } diff --git a/lib/src/models/data/schedule.dart b/lib/src/models/data/schedule.dart index 1541034be..3e5a4c19d 100644 --- a/lib/src/models/data/schedule.dart +++ b/lib/src/models/data/schedule.dart @@ -61,11 +61,18 @@ class ScheduleModel extends Model { /// Initializes the calendar. Future initCalendar() async { + final HybridCalendar calendarDatabase = Services.instance.database.calendar; + final List json = await calendarDatabase.getSchedules(); Schedule.schedules = [ - for (final Map json in await Services.instance.database.getSchedules()) - Schedule.fromJson(json) + for (final Map schedule in json) + Schedule.fromJson(schedule) + ]; + calendar = [ + for (int month = 1; month <= 12; month++) [ + for (final Map? day in await calendarDatabase.getMonth(month)) + day == null ? null : Day.fromJson(day) + ] ]; - calendar = Day.getCalendar(await Services.instance.database.calendar); setToday(); notifyListeners(); } diff --git a/lib/src/models/data/sports.dart b/lib/src/models/data/sports.dart index 527b2e2b3..8c83989f5 100644 --- a/lib/src/models/data/sports.dart +++ b/lib/src/models/data/sports.dart @@ -30,7 +30,7 @@ class Sports extends Model { @override Future init() async { timer = Timer.periodic(_minute, (_) => todayGames = getTodayGames()); - games = SportsGame.fromList(await Services.instance.database.sports); + games = SportsGame.fromList(await Services.instance.database.sports.getAll()); todayGames = getTodayGames(); now = DateTime.now(); } @@ -74,6 +74,6 @@ class Sports extends Model { /// Saves the games to the database. /// /// Used in any database CRUD methods. - Future saveGames() => - Services.instance.database.setSports(SportsGame.getJsonList(games)); + Future saveGames() => Services.instance.database.sports + .setAll(SportsGame.getJsonList(games)); } \ No newline at end of file diff --git a/lib/src/models/data/user.dart b/lib/src/models/data/user.dart index bd505e952..d52546349 100644 --- a/lib/src/models/data/user.dart +++ b/lib/src/models/data/user.dart @@ -30,10 +30,13 @@ class UserModel extends Model { @override Future init() async { - data = User.fromJson(await Services.instance.database.user); - subjects = Subject.getSubjects( - await Services.instance.database.getSections(data.sectionIDs) - ); + data = User.fromJson(await Services.instance.database.user.getProfile()); + subjects = { + for (final String id in data.sectionIDs) + id: Subject.fromJson( + await Services.instance.database.schedule.getCourse(id) + ) + }; final List? scopeStrings = await Auth.adminScopes; adminScopes = scopeStrings == null ? null : [ for (final String scope in scopeStrings) diff --git a/lib/src/models/view/admin_schedules.dart b/lib/src/models/view/admin_schedules.dart index e649f785d..c02d2d6dd 100644 --- a/lib/src/models/view/admin_schedules.dart +++ b/lib/src/models/view/admin_schedules.dart @@ -17,7 +17,7 @@ class AdminScheduleModel with ChangeNotifier { /// Saves the schedules to the database and refreshes. Future saveSchedules() async { - await Services.instance.database.saveSchedules(jsonSchedules); + await Services.instance.database.calendar.setSchedules(jsonSchedules); Schedule.schedules = schedules; notifyListeners(); } diff --git a/lib/src/models/view/builders/reminder_builder.dart b/lib/src/models/view/builders/reminder_builder.dart index 7c32450b7..2c3c59dff 100644 --- a/lib/src/models/view/builders/reminder_builder.dart +++ b/lib/src/models/view/builders/reminder_builder.dart @@ -2,6 +2,7 @@ import "package:flutter/foundation.dart"; import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; +import "package:ramaz/services.dart"; /// A view model for the dialog that allows the user to build a reminder. // ignore: prefer_mixin @@ -17,6 +18,9 @@ class RemindersBuilderModel with ChangeNotifier { /// The message for this reminder. String message = ""; + /// The ID for this reminder. + late String _id; + /// Whether this reminder repeats. /// /// This affects whether it will be deleted after @@ -51,9 +55,11 @@ class RemindersBuilderModel with ChangeNotifier { ] { if (reminder == null) { + _id = Services.instance.database.reminders.getId(); return; } + _id = reminder.id; message = reminder.message; time = reminder.time; shouldRepeat = time!.repeats; @@ -76,6 +82,7 @@ class RemindersBuilderModel with ChangeNotifier { /// Returns a new reminder from the model's fields. Reminder build() => Reminder ( message: message, + id: _id, time: ReminderTime.fromType( type: type!, dayName: dayName, diff --git a/lib/src/models/view/calendar_editor.dart b/lib/src/models/view/calendar_editor.dart index 50894d40a..3acd7d352 100644 --- a/lib/src/models/view/calendar_editor.dart +++ b/lib/src/models/view/calendar_editor.dart @@ -61,7 +61,7 @@ class CalendarEditor with ChangeNotifier { /// Loads a month from the database and pads it accordingly. void loadMonth(int month) => subscriptions [month] ??= Services - .instance.database.cloudDatabase.getCalendarStream(month + 1) + .instance.database.firestore.getCalendarStream(month + 1) .listen( (List cal) { calendar [month] = layoutMonth( @@ -119,16 +119,10 @@ class CalendarEditor with ChangeNotifier { final int index = calendar [date.month - 1]! .indexWhere((CalendarDay? day) => day != null); calendar [date.month - 1]! [index + date.day - 1]!.schoolDay = day; - await Services.instance.database.setCalendar( - date.month, - { - "calendar": [ - for (final CalendarDay? day in calendar [date.month - 1]!) - if (day != null) - day.schoolDay?.toJson(), - ], - "month": date.month - } - ); + await Services.instance.database.calendar.setMonth(date.month, [ + for (final CalendarDay? day in calendar [date.month - 1]!) + if (day != null) + day.schoolDay?.toJson(), + ]); } } diff --git a/lib/src/models/view/feedback.dart b/lib/src/models/view/feedback.dart index 307bc76f5..754749e34 100644 --- a/lib/src/models/view/feedback.dart +++ b/lib/src/models/view/feedback.dart @@ -34,7 +34,7 @@ class FeedbackModel with ChangeNotifier { Future send() async => Services .instance .database - .cloudDatabase + .firestore .sendFeedback( Feedback ( message: message!, diff --git a/lib/src/models/view/home.dart b/lib/src/models/view/home.dart index b53d0da46..c37ef1c11 100644 --- a/lib/src/models/view/home.dart +++ b/lib/src/models/view/home.dart @@ -48,8 +48,8 @@ class DashboardModel with ChangeNotifier { /// update user data, sign out and sign back in. Future refresh(VoidCallback onFailure) async { try { - await Services.instance.database.updateCalendar(); - await Services.instance.database.updateSports(); + await Services.instance.database.calendar.signIn(); + await Services.instance.database.sports.signIn(); await schedule.initCalendar(); } catch (error) { // ignore: avoid_catches_without_on_clauses // We just want to allow the user to retry. But still rethrow. diff --git a/lib/src/pages/sports.dart b/lib/src/pages/sports.dart index 0f715f698..4c2bef7f0 100644 --- a/lib/src/pages/sports.dart +++ b/lib/src/pages/sports.dart @@ -70,7 +70,7 @@ Widget getLayout(BuildContext context, SportsModel model) { case SortOption.chronological: return GenericSportsView( loading: model.loading, - onRefresh: model.adminFunc(Services.instance.database.updateSports), + onRefresh: model.adminFunc(Services.instance.database.sports.signIn), recents: model.recents, upcoming: model.upcoming, builder: (int index) => SportsTile( @@ -85,7 +85,7 @@ Widget getLayout(BuildContext context, SportsModel model) { case SortOption.sport: return GenericSportsView>>( loading: model.loading, - onRefresh: model.adminFunc(Services.instance.database.updateSports), + onRefresh: model.adminFunc(Services.instance.database.sports.signIn), recents: model.recentBySport.entries.toList(), upcoming: model.upcomingBySport.entries.toList(), builder: (MapEntry> entry) => Column( diff --git a/lib/src/services/cloud_db.dart b/lib/src/services/cloud_db.dart deleted file mode 100644 index f5fdd5e05..000000000 --- a/lib/src/services/cloud_db.dart +++ /dev/null @@ -1,247 +0,0 @@ -import "package:cloud_firestore/cloud_firestore.dart"; - -import "auth.dart"; -import "database.dart"; -import "firebase_core.dart"; - -/// Convenience methods on [CollectionReference]. -extension DocumentFinder on CollectionReference { - /// Returns a [DocumentReference] by querying a field. - Future findDocument(String field, String value) async { - final Query query = where(field, isEqualTo: value); - final QueryDocumentSnapshot snapshot = (await query.get()).docs.first; - final DocumentReference document = snapshot.reference; - return document; - } -} - -/// Convenience methods on [DocumentReference]. -extension NonNullData on DocumentReference { - /// Gets data from a document, throwing if null. - Future throwIfNull(String message) async { - final Map? value = (await get()).data(); - if (value == null) { - throw StateError(message); - } else { - return value; - } - } -} - -/// A wrapper around Cloud Firestore. -class CloudDatabase extends Database { - static final DateTime _now = DateTime.now(); - - /// The [FirebaseFirestore service]. - static final FirebaseFirestore firestore = FirebaseFirestore.instance; - - /// The field in the reminders document that stores the reminders. - static const String remindersKey = "reminders"; - - /// The field in the calendar document that stores the calendar. - static const String calendarKey = "calendar"; - - /// The field in the sports document that stores the games. - static const String sportsKey = "games"; - - /// The user data collection. - /// - /// Note that even though this is named students, faculty are supported too. - /// Each user has their own document to store their data. - /// - /// To access a document in this collection, use [userDocument]. - static final CollectionReference userCollection = - firestore.collection("students"); - - /// The course data collection. - /// - /// Sections, not courses, are stored in the database. Each section has its - /// own document with the data of that section. - /// - /// Do not access documents in this collection directly. - /// Use either [getSections] or [getSection]. - static final CollectionReference sectionCollection = - firestore.collection("classes"); - - /// The calendar collection. - /// - /// The calendar collection consists of 12 documents, one for each month. - /// Each document has its month's data in the [calendarKey] field. - /// - /// Do not access documents in this collection directly. - /// Instead, use [calendar] or [getCalendarMonth]. - static final CollectionReference calendarCollection = - firestore.collection("calendar"); - - /// The feedback collection. - /// - /// Users can only create new documents here, not edit existing ones. - /// - /// Do not access documents in this collection. - /// Instead, create new ones. - static final CollectionReference feedbackCollection = - firestore.collection("feedback"); - - /// The sports collection. - /// - /// Each academic year has its own document, with all the games for that year - /// in a list. This structure is still up for redesign, but seems to hold up. - /// - /// To access a document in this collection, use [sportsDocument]. - static final CollectionReference sportsCollection = - firestore.collection("sports"); - - /// The clubs collection in the database. - static final CollectionReference clubsCollection = - firestore.collection("clubs"); - - /// The document for this user's data. - /// - /// The collection is indexed by email. - DocumentReference get userDocument => - userCollection.doc(Auth.email); - - /// The reminders collection. - /// - /// Each user document has a sub-collection that has their a document for each - /// reminder. - CollectionReference get remindersCollection => - userDocument.collection("reminders"); - - /// The document for this academic year's sports games. - /// - /// The collection is indexed by `"$firstYear-$secondYear"` (eg, 2020-2021). - DocumentReference get sportsDocument => sportsCollection.doc(_now.month > 7 - ? "${_now.year}-${_now.year + 1}" - : "${_now.year - 1}-${_now.year}" - ); - - /// The document for the schedules of the calendar. - DocumentReference get schedulesDocument => - calendarCollection.doc("schedules"); - - // Service methods - - @override - Future init() => FirebaseCore.init(); - - /// Signs the user in. - /// - /// If the user does not have a reminders document, this function creates it. - @override - Future signIn() async { - await Auth.signIn(); - } - - // Database methods. - - @override - bool get isSignedIn => Auth.isSignedIn; - - @override - Future signOut() => Auth.signOut(); - - @override - Future get user => - userDocument.throwIfNull("User ${Auth.email} does not exist in the database"); - - /// No-op -- The user cannot edit their own profile. - /// - /// User profiles can only be modified by the admin SDK. - @override - Future setUser(Map json) async {} - - @override - Future getSection(String id) => - sectionCollection.doc(id).throwIfNull("Cannot find section: $id"); - - /// No-op -- The user cannot edit the courses list. - /// - /// The courses list can only be modified by the admin SDK. - @override - Future setSections(Map json) async {} - - @override - Future getCalendarMonth(int month) async { - final DocumentReference document = calendarCollection.doc(month.toString()); - return document.throwIfNull("No entry in calendar for $month"); - } - - @override - Future> getSchedules() async => List.from(( - await schedulesDocument.throwIfNull("Cannot find schedules") - ) ["schedules"]); - - @override - Future saveSchedules(List schedules) => - schedulesDocument.set({"schedules": schedules}); - - @override - Future setCalendar(int month, Map json) => - calendarCollection.doc(month.toString()) - .set(Map.from(json)); - - @override - Future> get reminders async { - final QuerySnapshot snapshot = - await remindersCollection.orderBy(FieldPath.documentId).get(); - final List documents = snapshot.docs; - return [ - for (final QueryDocumentSnapshot document in documents) - document.data() - ]; - } - - @override - Future updateReminder(String? oldHash, Map json) async { - if (oldHash == null) { - await remindersCollection.add(Map.from(json)); - } else { - final DocumentReference document = await remindersCollection - .findDocument("hash", oldHash); - await document.set(Map.from(json)); - } - } - - @override - Future deleteReminder(String oldHash) async => - (await remindersCollection.findDocument("hash", oldHash)).delete(); - - @override - Future> get sports async { - final Map data = await sportsDocument - .throwIfNull("No sports data found"); - return [ - for (final dynamic json in data [sportsKey]) - Map.from(json) - ]; - } - - @override - Future setSports(List json) => - sportsDocument.set({sportsKey: json}); - - /// Submits feedback. - Future sendFeedback( - Map json - ) => feedbackCollection.doc().set(Map.from(json)); - - /// Listens to a month for changes in the calendar. - Stream> getCalendarStream(int month) => - calendarCollection.doc(month.toString()).snapshots().map( - (DocumentSnapshot snapshot) => [ - for (final dynamic entry in snapshot.data()! ["calendar"]) - if (entry == null) null - else Map.from(entry) - ] - ); - - /// Registers the user for a club. - Future registerForClub(String clubId, Map json) { - final DocumentReference clubDocument = clubsCollection.doc(clubId); - final CollectionReference members = clubDocument.collection("members"); - final String email = Auth.email!; - final DocumentReference userDocument = members.doc(email); - return userDocument.set(Map.from(json)); - } -} diff --git a/lib/src/services/database.dart b/lib/src/services/database.dart index 9cb7f4e40..0b8627905 100644 --- a/lib/src/services/database.dart +++ b/lib/src/services/database.dart @@ -1,121 +1,82 @@ -import "service.dart"; +// ignore_for_file: directives_ordering -/// A database that can read and write data. -/// -/// A [Database] is a special type of [Service]. Whereas a service only needs -/// to know when the app starts and the user signs in, a database has other -/// responsibilities. +import "firestore.dart"; +import "idb.dart"; +import "service.dart"; + +import "databases/hybrid.dart"; + +import "databases/calendar/hybrid.dart"; +import "databases/reminders/hybrid.dart"; +import "databases/schedule/hybrid.dart"; +import "databases/sports/hybrid.dart"; +import "databases/user/hybrid.dart"; + +export "databases/calendar/hybrid.dart"; +export "databases/reminders/hybrid.dart"; +export "databases/schedule/hybrid.dart"; +export "databases/sports/hybrid.dart"; +export "databases/user/hybrid.dart"; + +/// A wrapper around all data in all database. /// -/// Functionally, a database needs to be able to determine whether the user -/// is signed in, so the app knows where to direct the user. Additionally, -/// since the data is tied to the user, the database needs to know when the -/// user is signing out, it can purge that data. Of course, the database also -/// needs to know when the user is signing in, so it can connect to the data. +/// The database is split into 2N parts: N types of data, with a Firestore and +/// IDB implementation for each. The local and cloud implementations are bundled +/// into [HybridDatabase]s, which we use here. /// -/// This class also serves to dictate what data the database should provide, -/// as well as their types. Most of the code in this class does exactly that. -abstract class Database extends Service { - /// The key to get the calendar within the returned JSON object. - /// - /// The calendar is stored along with its month, which means it cannot - /// be a list, and instead must be a `Map`. This key - /// gets the list out of the Map. - static const String calendarKey = "calendar"; - - /// Determines whether the user is signed in. - /// - /// From all the services, a [Database] is the only one that can, and is - /// expected to, know whether the user is signed in. - bool get isSignedIn; - - /// Signs the user out of the app. - /// - /// As opposed to [signIn], only databases need to know when the user is - /// signing out. It can be helpful for non-database services to know when the - /// user signs in, since this indicates they are truly ready to engage with - /// the app, but signing out carries no valuable information. The databases, - /// however, must purge all their data. - Future signOut(); - - // ---------- Data code below ---------- - - /// The user object as JSON - Future get user; - - /// Changes the user JSON object. - Future setUser(Map json); - - /// Gets one section (a course in Ramaz) as a JSON object. - /// - /// Do not use this directly. Instead, use [getSections]. - Future getSection(String id); - - /// The different classes (sections, not courses) for a schedule. - Future?> getSections( - Iterable ids - ) async => { - for (final String id in ids) - id: await getSection(id) - }; - - /// Changes the user's classes. - Future setSections(Map json); - - /// The calendar in JSON form. - /// - /// Admins can change this with [setCalendar]. - Future>> get calendar async => [ - for (int month = 1; month <= 12; month++) [ - for (final Map? day in (await getCalendarMonth(month)) [calendarKey]) - day == null ? null : Map.from(day) - ] - ]; - - /// Gets one month out of the calendar. - /// - /// Months are in the range 1-12. The value returned will be a JSON object - /// containing the month and the calendar. The calendar itself can be retrieved - /// with [calendarKey]. - Future getCalendarMonth(int month); - - /// Gets all available schedules. - Future> getSchedules(); - - /// Saves the list of available schedules. - Future saveSchedules(List schedules); - - /// Changes the calendar in the database. - /// - /// The fact that this method takes a [month] parameter while [calendar] does - /// not is an indicator that the calendar schema needs to be rewritten. - /// - /// [month] must be 1-12, not 0-11. - /// - /// Only admins can change this. - Future setCalendar(int month, Map json); - - /// The user's reminders. - Future> get reminders; - - /// Updates a reminder, creating it if necessary. - /// - /// This function queries the database for a reminder with the same hash and - /// updates it. - Future updateReminder(String? oldHash, Map json); - - /// Deletes a reminder at the given index. - /// - /// This function queries the database for a reminder with the same hash and - /// deletes it. - Future deleteReminder(String oldHash); - - /// The sports games. - /// - /// Admins can change this with [setSports]. - Future> get sports; - - /// Sets the sports games. - /// - /// Only admins can change this. - Future setSports(List json); -} \ No newline at end of file +/// This is the only class that brings the [Service] paradigm into the database +/// realm, so any and all initialization must be done here. Each database is +/// allowed to implement a [signIn] method, which will be called here. If data +/// needs to be downloaded and cached, that's where it will be done. +class Database extends DatabaseService { + /// The cloud database, using Firebase's Cloud Firestore. + final Firestore firestore = Firestore(); + + /// The local database. + final Idb idb = Idb(); + + // ---------------------------------------------------------------- + // The data managers for each category + // ---------------------------------------------------------------- + + /// The user data manager. + final HybridUser user = HybridUser(); + + /// The schedule data manager + final HybridSchedule schedule = HybridSchedule(); + + /// The calendar data manager. + final HybridCalendar calendar = HybridCalendar(); + + /// The reminders data manager. + final HybridReminders reminders = HybridReminders(); + + /// The sports data manager. + final HybridSports sports = HybridSports(); + + // ---------------------------------------------------------------- + + @override + Future init() async { + await firestore.init(); + await idb.init(); + } + + @override + Future signIn() async { + await firestore.signIn(); + await idb.signIn(); + + await user.signIn(); + await schedule.signIn(); + await calendar.signIn(); + await reminders.signIn(); + await sports.signIn(); + } + + @override + Future signOut() async { + await firestore.signOut(); + await idb.signOut(); + } +} diff --git a/lib/src/services/databases.dart b/lib/src/services/databases.dart deleted file mode 100644 index 5c70fb26d..000000000 --- a/lib/src/services/databases.dart +++ /dev/null @@ -1,157 +0,0 @@ -import "cloud_db.dart"; -import "database.dart"; -import "local_db.dart"; - -/// Bundles different databases to provide more complex functionality. -/// -/// This class is used to consolidate the results of the online database and -/// the on-device database. It works by downloading all the necessary data in -/// [signIn]. All reads are from [localDatabase], and all writes are to both -/// databases. -class Databases extends Database { - /// Provides a connection to the online database. - final CloudDatabase cloudDatabase = CloudDatabase(); - - /// The local device storage. - /// - /// Used to minimize the number of requests to the database and keep the app - /// offline-first. - final LocalDatabase localDatabase = LocalDatabase(); - - @override - Future init() async { - await cloudDatabase.init(); - await localDatabase.init(); - - if (cloudDatabase.isSignedIn) { - // Download this month's calendlar, in case it changed - await localDatabase.saveSchedules(await cloudDatabase.getSchedules()); - final int month = DateTime.now().month; - await localDatabase.setCalendar( - month, await cloudDatabase.getCalendarMonth(month) - ); - } - } - - /// Downloads all the data and saves it to the local database. - @override - Future signIn() async { - await cloudDatabase.signIn(); - await localDatabase.signIn(); - - await localDatabase.setUser(await cloudDatabase.user); - await updateCalendar(); - // await updateSports(); - - final List cloudReminders = - await cloudDatabase.reminders; - for (int index = 0; index < cloudReminders.length; index++) { - await localDatabase.updateReminder(index.toString(), cloudReminders [index]); - } - } - - /// Downloads the calendar and saves it to the local database. - Future updateCalendar() async { - for (int month = 1; month <= 12; month++) { - await localDatabase.setCalendar( - month, await cloudDatabase.getCalendarMonth(month) - ); - } - await localDatabase.saveSchedules(await cloudDatabase.getSchedules()); - } - - /// Downloads sports games and saves them to the local database. - Future updateSports() async { - await localDatabase.setSports(await cloudDatabase.sports); - } - - @override - bool get isSignedIn => - cloudDatabase.isSignedIn && localDatabase.isSignedIn; - - @override - Future signOut() async { - await cloudDatabase.signOut(); - await localDatabase.signOut(); - } - - @override - Future get user => localDatabase.user; - - // Cannot modify user profile. - @override - Future setUser(Map json) async {} - - /// Do not use this function. Use [getSections instead]. - /// - /// In a normal database, the [getSections] function works by calling - /// [getSection] repeatedly. So it would be this function that needs to be - /// overridden. However, this class uses other [Database]s, so instead, - /// this function is left blank and [getSections] uses other - /// [Database.getSections] to work. - @override - Future getSection(String id) async => {}; - - /// Gets section data. - /// - /// Checks the local database, and downloads it if the data is unavailable. - @override - Future> getSections( - Iterable ids - ) async { - Map? result = - await localDatabase.getSections(ids); - if (result == null) { - result = (await cloudDatabase.getSections(ids))!; - await localDatabase.setSections(result); - } - return result; - } - - // Cannot modify sections - @override - Future setSections(Map json) async {} - - @override - Future getCalendarMonth(int month) => - localDatabase.getCalendarMonth(month); - - @override - Future> getSchedules() => localDatabase.getSchedules(); - - @override - Future saveSchedules(List schedules) async { - await cloudDatabase.saveSchedules(schedules); - await localDatabase.saveSchedules(schedules); - } - - @override - Future setCalendar(int month, Map json) async { - await cloudDatabase.setCalendar(month, json); - await localDatabase.setCalendar(month, json); - } - - @override - Future> get reminders => localDatabase.reminders; - - @override - Future updateReminder(dynamic oldHash, Map json) async { - await cloudDatabase.updateReminder(oldHash, json); - await localDatabase.updateReminder(oldHash, json); - } - - @override - Future deleteReminder(dynamic oldHash) async { - await cloudDatabase.deleteReminder(oldHash); - await localDatabase.deleteReminder(oldHash); - } - - @override - Future> get sports => localDatabase.sports; - - @override - Future setSports(List json) async { - await cloudDatabase.setSports(json); - await localDatabase.setSports(json); - } -} \ No newline at end of file diff --git a/lib/src/services/databases/calendar/hybrid.dart b/lib/src/services/databases/calendar/hybrid.dart new file mode 100644 index 000000000..284e6b08d --- /dev/null +++ b/lib/src/services/databases/calendar/hybrid.dart @@ -0,0 +1,55 @@ +import "../hybrid.dart"; + +import "implementation.dart"; +import "interface.dart"; + +/// Handles calendar data in the cloud and on the device. +/// +/// The calendar and schedules should always be downloaded at the same time, +/// because changes to the calendar may reference newly created schedules. +/// +/// For accuracy, the current month's calendar should be updated every day. +/// Make sure to call [update] once per day. +// ignore: lines_longer_than_80_chars +class HybridCalendar extends HybridDatabase implements CalendarInterface { + @override + final CloudCalendar cloud = CloudCalendar(); + + @override + final LocalCalendar local = LocalCalendar(); + + @override + Future signIn() async { + await local.setSchedules(await cloud.getSchedules()); + for (int month = 1; month <= 12; month++) { + await local.setMonth(month, await cloud.getMonth(month)); + } + } + + @override + Future> getMonth(int month) => local.getMonth(month); + + @override + Future setMonth(int month, List json) async { + await cloud.setMonth(month, json); + await local.setMonth(month, json); + } + + @override + Future> getSchedules() => local.getSchedules(); + + @override + Future setSchedules(List json) async { + await cloud.setSchedules(json); + await local.setSchedules(json); + } + + /// Downloads the parts of the calendar necessary to be up-to-date. + /// + /// Just saves the schedules and the current month. + Future update() async { + final int currentMonth = DateTime.now().month; + await local.setSchedules(await cloud.getSchedules()); + await local.setMonth(currentMonth, await cloud.getMonth(currentMonth)); + } +} diff --git a/lib/src/services/databases/calendar/implementation.dart b/lib/src/services/databases/calendar/implementation.dart new file mode 100644 index 000000000..ce7e06980 --- /dev/null +++ b/lib/src/services/databases/calendar/implementation.dart @@ -0,0 +1,79 @@ +import "../../firestore.dart"; +import "../../idb.dart"; + +import "interface.dart"; + +/// Handles calendar data in the cloud. +/// +/// Each month is in a document labeled with the month number, from 1-12. The +/// actual data itself is in `calendar` field, alongside the `month` field. +/// +/// The schedules are in a document called `schedules`, under the field +/// `schedules`. +class CloudCalendar implements CalendarInterface { + /// The calendar collection in Firestore. + static final CollectionReference> calendar = Firestore + .instance.collection("calendar"); + + /// The document inside [calendar] that holds the schedules. + static final DocumentReference> schedules = + calendar.doc("schedules"); + + @override + Future> getMonth(int month) async { + final Map json = await calendar.doc(month.toString()) + .throwIfNull("Month $month not found in cloud database"); + return List.from(json ["calendar"]); + } + + @override + Future setMonth(int month, List json) => calendar + .doc(month.toString()).set({"month": month, "calendar": json}); + + @override + Future> getSchedules() async => List.from( + (await schedules.throwIfNull("Cannot find schedules")) ["schedules"] + ); + + @override + Future setSchedules(List json) => schedules + .set({"schedules": json}); +} + +/// Handles calendar data on the device. +/// +/// The calendar is held in an object store where they key is the month numbered +/// 1-12. +/// +/// The schedules are in another object store where the names are the keys. +class LocalCalendar implements CalendarInterface { + @override + Future> getMonth(int month) async { + final Map json = await Idb.instance.throwIfNull( + storeName: Idb.calendarStoreName, + key: month, + message: "Cannot find $month in local database", + ); + return List.from(json ["calendar"]); + } + + @override + Future setMonth(int month, List json) => Idb.instance.update( + storeName: Idb.calendarStoreName, + value: {"month": month, "calendar": json}, + ); + + @override + Future> getSchedules() => Idb.instance + .getAll(Idb.scheduleStoreName); + + @override + Future setSchedules(List json) async { + for (final Map schedule in json) { + await Idb.instance.update( + storeName: Idb.scheduleStoreName, + value: schedule, + ); + } + } +} diff --git a/lib/src/services/databases/calendar/interface.dart b/lib/src/services/databases/calendar/interface.dart new file mode 100644 index 000000000..46dcd3569 --- /dev/null +++ b/lib/src/services/databases/calendar/interface.dart @@ -0,0 +1,22 @@ +/// Defines methods for the calendar data. +abstract class CalendarInterface { + /// Gets one month from the calendar. + /// + /// [month] is 1-12, not 0-11. The returned list contains a JSON form of each + /// day. Null days represent no school. + Future> getMonth(int month); + + /// Saves a month of the calendar. + /// + /// [month] is 1-12, not 0-11. See the [getMonth] for the structure of [json]. + Future setMonth(int month, List json); + + /// Gets all the schedules in the calendar. + /// + /// So far, schedules cannot be handled individually, since there is no way + /// to know which schedules need to be used and which don't. + Future> getSchedules(); + + /// Saves all the schedules. + Future setSchedules(List json); +} diff --git a/lib/src/services/databases/hybrid.dart b/lib/src/services/databases/hybrid.dart new file mode 100644 index 000000000..15a3c63df --- /dev/null +++ b/lib/src/services/databases/hybrid.dart @@ -0,0 +1,27 @@ +/// Bundles cloud and local databases together. +/// +/// The app uses an online and offline database for two reasons. +/// +/// 1. So the app can work offline +/// 2. So we don't hit quotas on our cloud database. +/// +/// [T] is an interface that describes what data a class needs to access for a +/// given category of data. [T] should be implemented twice, for online and +/// offline functionality. This class serves to tie them together. +/// +/// Simply extend this class and implement [T] and you now have a database that +/// can access both the cloud and the on-device database. Implement each method +/// of [T] by choosing which source to use for the data. +/// +/// The [signIn] method allows data to flow from the online to local database. +/// Use it to initialize any data the app expects be on-device. +abstract class HybridDatabase { + /// The interface for this data in the online database. + T get cloud; + + /// The interface for this data in the offline database. + T get local; + + /// Initializes any data necessary for sign-in + Future signIn(); +} diff --git a/lib/src/services/databases/reminders/hybrid.dart b/lib/src/services/databases/reminders/hybrid.dart new file mode 100644 index 000000000..6af0b2e12 --- /dev/null +++ b/lib/src/services/databases/reminders/hybrid.dart @@ -0,0 +1,41 @@ +import "../hybrid.dart"; + +import "implementation.dart"; +import "interface.dart"; + +/// Handles reminders in the cloud and on the device. +/// +/// Reminders are downloaded after sign-in, and are updated locally and online. +// ignore: lines_longer_than_80_chars +class HybridReminders extends HybridDatabase implements RemindersInterface { + @override + final CloudReminders cloud = CloudReminders(); + + @override + final LocalReminders local = LocalReminders(); + + @override + Future signIn() async { + for (final Map reminder in await cloud.getAll()) { + await local.set(reminder); + } + } + + @override + Future> getAll() => local.getAll(); + + @override + Future set(Map json) async { + await cloud.set(json); + await local.set(json); + } + + @override + Future delete(String id) async { + await cloud.delete(id); + await local.delete(id); + } + + /// Generates a unique ID for a new reminder. + String getId() => cloud.getId(); +} diff --git a/lib/src/services/databases/reminders/implementation.dart b/lib/src/services/databases/reminders/implementation.dart new file mode 100644 index 000000000..a24e2f8a3 --- /dev/null +++ b/lib/src/services/databases/reminders/implementation.dart @@ -0,0 +1,49 @@ +import "../../firestore.dart"; +import "../../idb.dart"; + +import "../user/implementation.dart"; + +import "interface.dart"; + +/// Handles reminder data in the cloud. +/// +/// Reminders are stored in a subcollection of the user document, where each +/// document has the reminder id as its ID. +class CloudReminders implements RemindersInterface { + /// The reminders subcollection for this user. + static CollectionReference get reminders => CloudUser.userDocument + .collection("reminders"); + + @override + Future> getAll() => reminders.getAll(); + + @override + Future set(Map json) => reminders.doc(json ["id"]) + .set(Map.from(json)); + + @override + Future delete(String id) => reminders.doc(id).delete(); + + /// Generates a random ID. + String getId() => reminders.doc().id; +} + +/// Handles reminder data in the on-device database. +/// +/// Reminders are stored in an object store where the keypath is `id`. +class LocalReminders implements RemindersInterface { + @override + Future> getAll() => Idb.instance.getAll(Idb.reminderStoreName); + + @override + Future set(Map json) => Idb.instance.update( + storeName: Idb.reminderStoreName, + value: json, + ); + + @override + Future delete(String id) => Idb.instance.delete( + storeName: Idb.reminderStoreName, + key: id, + ); +} diff --git a/lib/src/services/databases/reminders/interface.dart b/lib/src/services/databases/reminders/interface.dart new file mode 100644 index 000000000..942d42240 --- /dev/null +++ b/lib/src/services/databases/reminders/interface.dart @@ -0,0 +1,16 @@ +/// Defines methods for the reminder data. +/// +/// Reminders are indexed by a unique ID that doesn't change. This ID should be +/// placed in `json ["id"]`. +abstract class RemindersInterface { + /// Gets all the user's reminders. + Future> getAll(); + + /// Updates a single reminder. + /// + /// If the reminder already exists, it will be overwritten. + Future set(Map json); + + /// Deletes the reminder at the given id. + Future delete(String id); +} diff --git a/lib/src/services/databases/schedule/hybrid.dart b/lib/src/services/databases/schedule/hybrid.dart new file mode 100644 index 000000000..75015cd39 --- /dev/null +++ b/lib/src/services/databases/schedule/hybrid.dart @@ -0,0 +1,38 @@ +import "../hybrid.dart"; + +import "implementation.dart"; +import "interface.dart"; + +/// Handles user data in the cloud and on the device. +/// +/// Courses are downloaded one-by-one after sign-in. However, which courses to +/// download is unknown until the user profile is parsed. Therefore, [signIn] +/// is left empty, and the logic should instead go to middleware. +// ignore: lines_longer_than_80_chars +class HybridSchedule extends HybridDatabase implements ScheduleInterface { + @override + final ScheduleInterface cloud = CloudSchedule(); + + @override + final ScheduleInterface local = LocalSchedule(); + + @override + Future signIn() async { } + + @override + Future getCourse(String id) async { + Map? result = await local.getCourse(id); + if (result == null) { + final Map course = (await cloud.getCourse(id))!; + result = course; + await local.setCourse(id, result); + } + return result; + } + + @override + Future setCourse(String id, Map json) async { + await cloud.setCourse(id, json); + await local.setCourse(id, json); + } +} diff --git a/lib/src/services/databases/schedule/implementation.dart b/lib/src/services/databases/schedule/implementation.dart new file mode 100644 index 000000000..c7df28d2a --- /dev/null +++ b/lib/src/services/databases/schedule/implementation.dart @@ -0,0 +1,35 @@ +import "../../firestore.dart"; +import "../../idb.dart"; + +import "interface.dart"; + +/// Handles schedule date in the cloud. +/// +/// Each course is its own document in the `classes` collection. The keys are +/// the courses section-IDs, so they're really "sections", not courses. +class CloudSchedule implements ScheduleInterface { + /// The courses collection in Firestore. + static final CollectionReference courses = Firestore.instance + .collection("classes"); + + @override + Future getCourse(String id) => courses.doc(id) + .throwIfNull("Course $id not found"); + + @override + Future setCourse(String id, Map json) async { } +} + +/// Handles schedule data on the device. +/// +/// Each course is its own record in the `sections` object store, whose +/// keypath is the `id` field (the section-IDs). +class LocalSchedule implements ScheduleInterface { + @override + Future getCourse(String id) => Idb.instance + .get(Idb.sectionStoreName, id); + + @override + Future setCourse(String id, Map json) => Idb.instance + .update(storeName: Idb.sectionStoreName, value: json); +} diff --git a/lib/src/services/databases/schedule/interface.dart b/lib/src/services/databases/schedule/interface.dart new file mode 100644 index 000000000..afc124269 --- /dev/null +++ b/lib/src/services/databases/schedule/interface.dart @@ -0,0 +1,8 @@ +/// Defines methods for the schedule data. +abstract class ScheduleInterface { + /// Gets a course from the database. + Future getCourse(String id); + + /// Saves a course into the database. + Future setCourse(String id, Map json); +} diff --git a/lib/src/services/databases/sports/hybrid.dart b/lib/src/services/databases/sports/hybrid.dart new file mode 100644 index 000000000..6c1d7db34 --- /dev/null +++ b/lib/src/services/databases/sports/hybrid.dart @@ -0,0 +1,29 @@ +import "../hybrid.dart"; + +import "implementation.dart"; +import "interface.dart"; + +/// Handles sports in the cloud and on the device. +/// +/// Sports are downloaded after sign-in, and should be updated on a weekly +/// basis. They should also be manually refreshable. +// ignore: lines_longer_than_80_chars +class HybridSports extends HybridDatabase implements SportsInterface { + @override + final SportsInterface cloud = CloudSports(); + + @override + final SportsInterface local = LocalSports(); + + @override + Future signIn() async => local.setAll(await cloud.getAll()); + + @override + Future> getAll() => local.getAll(); + + @override + Future setAll(List json) async { + await cloud.setAll(json); + await local.setAll(json); + } +} diff --git a/lib/src/services/databases/sports/implementation.dart b/lib/src/services/databases/sports/implementation.dart new file mode 100644 index 000000000..ef84567e3 --- /dev/null +++ b/lib/src/services/databases/sports/implementation.dart @@ -0,0 +1,54 @@ +import "../../firestore.dart"; +import "../../idb.dart"; + +import "interface.dart"; + +/// Handles sports data in the cloud. +/// +/// Sports games are in documents by school year. See [schoolYear] for how that +/// is determined. Each document has a `games` field with a list of games. +class CloudSports implements SportsInterface { + /// The collection for sports games. + static final CollectionReference> sports = Firestore + .instance.collection("sports"); + + /// The current school year. + /// + /// For example, in the '20-'21 school year, this returns `2020`. + static int get schoolYear { + final DateTime now = DateTime.now(); + final int currentYear = now.year; + final int currentMonth = now.month; + return currentMonth > 7 ? currentYear : currentYear - 1; + } + + /// The document for the current year. + static DocumentReference> get gamesDocument => + sports.doc(schoolYear.toString()); + + @override + Future> getAll() async { + final Map json = await gamesDocument + .throwIfNull("Could not find sports games for this year"); + return List.from(json ["games"]); + } + + @override + Future setAll(List json) => gamesDocument.set({"games": json}); +} + +/// Handles sports data in the on-device database. +/// +/// Each sports game is another entry in the sports table. For compatibility +/// with the cloud database, sports are updated in batch. +class LocalSports implements SportsInterface { + @override + Future> getAll() => Idb.instance.getAll(Idb.sportsStoreName); + + @override + Future setAll(List json) async { + for (final Map game in json) { + await Idb.instance.update(storeName: Idb.sportsStoreName, value: game); + } + } +} diff --git a/lib/src/services/databases/sports/interface.dart b/lib/src/services/databases/sports/interface.dart new file mode 100644 index 000000000..7e6ef1a70 --- /dev/null +++ b/lib/src/services/databases/sports/interface.dart @@ -0,0 +1,10 @@ +/// Defines methods for the sports data. +/// +/// Sports are split by school year. +abstract class SportsInterface { + /// Gets all the sports games for this year. + Future> getAll(); + + /// Sets the sports games for this year. + Future setAll(List json); +} diff --git a/lib/src/services/databases/user/hybrid.dart b/lib/src/services/databases/user/hybrid.dart new file mode 100644 index 000000000..497162a05 --- /dev/null +++ b/lib/src/services/databases/user/hybrid.dart @@ -0,0 +1,31 @@ +import "../hybrid.dart"; + +import "implementation.dart"; +import "interface.dart"; + +/// Handles user data in the cloud and on the device. +/// +/// User profile is loaded once, on sign-in. Once this is complete, +/// the full profile is always assumed to be on-device. +class HybridUser extends HybridDatabase implements UserInterface { + @override + final UserInterface cloud = CloudUser(); + + @override + final UserInterface local = LocalUser(); + + @override + Future signIn() async { + final Map userData = await cloud.getProfile(); + await local.setProfile(userData); + } + + @override + Future getProfile() => local.getProfile(); + + @override + Future setProfile(Map json) async { + await cloud.setProfile(json); + await local.setProfile(json); + } +} diff --git a/lib/src/services/databases/user/implementation.dart b/lib/src/services/databases/user/implementation.dart new file mode 100644 index 000000000..173aab033 --- /dev/null +++ b/lib/src/services/databases/user/implementation.dart @@ -0,0 +1,44 @@ +import "../../auth.dart"; +import "../../firestore.dart"; +import "../../idb.dart"; + +import "interface.dart"; + +/// Handles user data in the cloud database. +/// +/// User profiles are saved under the "students" collection where document +/// keys are the user's email, guaranteed to be unique. +/// +/// Users cannot currently modify their own profiles. Use the Admin SDK instead. +class CloudUser implements UserInterface { + /// The users collection in firestore. + static final CollectionReference users = Firestore.instance + .collection("students"); + + /// The document for this user. + static DocumentReference get userDocument => users.doc(Auth.email!); + + @override + Future getProfile() => userDocument + .throwIfNull("User not in the database"); + + // Users cannot currently edit their own profiles. + @override + Future setProfile(Map json) async { } +} + +/// Handles user data in the local database. +/// +/// The user is stored as the only record in the user's table. +class LocalUser implements UserInterface { + @override + Future getProfile() => Idb.instance.throwIfNull( + storeName: Idb.userStoreName, + key: Auth.email!, + message: "User email innaccessible", + ); + + @override + Future setProfile(Map json) => Idb.instance + .update(storeName: Idb.userStoreName, value: json); +} diff --git a/lib/src/services/databases/user/interface.dart b/lib/src/services/databases/user/interface.dart new file mode 100644 index 000000000..f891a1d1f --- /dev/null +++ b/lib/src/services/databases/user/interface.dart @@ -0,0 +1,8 @@ +/// Defines methods for the user profile. +abstract class UserInterface { + /// The user profile. + Future getProfile(); + + /// Sets the user profile. + Future setProfile(Map json); +} diff --git a/lib/src/services/firestore.dart b/lib/src/services/firestore.dart new file mode 100644 index 000000000..f0b27b7bc --- /dev/null +++ b/lib/src/services/firestore.dart @@ -0,0 +1,75 @@ +import "package:cloud_firestore/cloud_firestore.dart"; + +import "auth.dart"; +import "firebase_core.dart"; +import "service.dart"; + +export "package:cloud_firestore/cloud_firestore.dart"; + +/// Convenience methods on [CollectionReference]. +extension CollectionHelpers on CollectionReference { + /// Returns a [DocumentReference] by querying a field. + Future findDocument(String field, String value) async { + final Query query = where(field, isEqualTo: value); + final QuerySnapshot querySnapshot = await query.get(); + final QueryDocumentSnapshot snapshot = querySnapshot.docs.first; + final DocumentReference document = snapshot.reference; + return document; + } + + /// Gets all the documents in a collection. + Future> getAll() async => [ + for (final QueryDocumentSnapshot doc in (await get()).docs) + doc.data() + ]; +} + +/// Convenience methods on [DocumentReference]. +extension DocumentHelpers on DocumentReference { + /// Gets data from a document, throwing if null. + Future throwIfNull(String message) async { + final Map? value = (await get()).data(); + if (value == null) { + throw StateError(message); + } else { + return value; + } + } +} + +/// The Firestore database service. +/// +/// This service does not provide any helper methods for data. That is reserved +/// for another service that will specify which data it is responsible for. +/// This service just manages the connection to Firestore. +/// +/// This class provides the basic initialization behind Firestore, and +/// doesn't expose any methods that will help retreive data. Any methods that +/// are provided don't have an offline equivalent. +class Firestore extends DatabaseService { + /// The singleton instance of this service. + static final FirebaseFirestore instance = FirebaseFirestore.instance; + + @override + Future init() => FirebaseCore.init(); + + @override + Future signIn() => Auth.signIn(); + + @override + Future signOut() => Auth.signOut(); + + /// Submits feedback to the feedback collection. + Future sendFeedback(Map json) => instance.collection("feedback").doc() + .set(Map.from(json)); + + /// Listens to a month for changes in the calendar. + Stream> getCalendarStream(int month) => instance + .collection("calendar").doc(month.toString()).snapshots().map( + (DocumentSnapshot> snapshot) => [ + for (final dynamic entry in snapshot.data()! ["calendar"]) + if (entry == null) null + else Map.from(entry) + ] + ); +} diff --git a/lib/src/services/idb.dart b/lib/src/services/idb.dart new file mode 100644 index 000000000..a348d7535 --- /dev/null +++ b/lib/src/services/idb.dart @@ -0,0 +1,166 @@ +import "package:idb_shim/idb_shim.dart"; + +import "local_db/idb_factory_stub.dart" + if (dart.library.io) "local_db/idb_factory_io.dart" + if (dart.library.html) "local_db/idb_factory_web.dart"; + +import "service.dart"; + +/// Helper functions for [ObjectStore]. +extension ObjectStoreHelpers on ObjectStore { + /// Gets the data at the key in this object store. + Future get(Object key) async { + final dynamic result = await getObject(key); + return result == null ? null : + Map.from(result); + } +} + +/// Provides convenience methods on a [Database]. +/// +/// This extension mostly abstracts details of IDB and handles type-safety. +extension DatabaseHelpers on Database { + /// Gets data at a key in an object store. + Future get(String storeName, Object key) => + transaction(storeName, idbModeReadOnly) + .objectStore(storeName) + .get(key); + + /// Gets data from an object store, throwing if it doesn't exist. + Future throwIfNull({ + required String storeName, + required Object key, + required String message, + }) async { + final Map? result = await get(storeName, key); + if (result == null) { + throw StateError(message); + } else { + return result; + } + } + + /// Sets data in an object store, overwriting if necessary. + Future update({ + required String storeName, + required Object value, + Object? key + }) => transaction(storeName, idbModeReadWrite) + .objectStore(storeName) + .put(value, key); + + /// Deletes data from an object store. + Future delete({ + required String storeName, + required Object key, + }) => transaction(storeName, idbModeReadWrite) + .objectStore(storeName) + .delete(key); + + /// Gets all the data in an object store. + Future> getAll(String storeName) async => [ + for ( + final dynamic entry in + await transaction(storeName, idbModeReadOnly) + .objectStore(storeName).getAll() + ) Map.from(entry) + ]; +} + +/// A database that's hosted on the user's device. +/// +/// On mobile, the database is based on a complex JSON file. On web, the browser +/// has a built-in database called IndexedDb (idb for short). The mobile +/// implementation is built to match the idb schema. +/// +/// In idb, a table is called an "object store". There are two ways of +/// identifying rows: either by a key (a unique column), or an auto-incrementing +/// value. The choice should be made based on the data in that object store. +/// +/// Reading and writing data is done with transactions. This process is +/// abstracted by extensions like [DatabaseHelpers] and [ObjectStoreHelpers]. +/// +/// Another quirk of idb is that object stores can only be created on startup. +/// One way this is relevant is sign-in. If it turns out that the user +/// is not signed in, it would be too late to create new object stores. That's +/// why [init] creates new object stores, so that it runs right away. +/// +/// Another consequence of having to consolidate object store creation in the +/// very beginning is that there is a strict way of migrating from one database +/// schema to another. Each database schema has a version number. When the app +/// starts, the [init] function checks to see what version the database is on. +/// If the code demands a new version, there must be code to create and destroy +/// object stores until the schemas match. The simplest way to do that is by +/// using a switch statement. A switch statement cascades, meaning the changes +/// from one version to another will follow each other, which should always +/// lead to an up-to-date schema. +class Idb extends DatabaseService { + /// The idb Database object + static late final Database instance; + + /// The name for the users object store. + static const String userStoreName = "users"; + + /// The name for the sections object store. + static const String sectionStoreName = "sections"; + + /// The name for the calendar object store. + static const String calendarStoreName = "calendar"; + + /// The name for the reminders object store. + static const String reminderStoreName = "reminders"; + + /// The name for the sports object store. + static const String sportsStoreName = "sports"; + + /// The name for the schedules object store. + static const String scheduleStoreName = "schedules"; + + /// The names of all the object stores. + static const List storeNames = [ + userStoreName, + sectionStoreName, + calendarStoreName, + reminderStoreName, + sportsStoreName, + scheduleStoreName, + ]; + + @override + Future init() async { + final IdbFactory _factory = await idbFactory; + try { + instance = await _factory.open( + "ramlife.db", + version: 1, + onUpgradeNeeded: (VersionChangeEvent event) { + switch(event.oldVersion) { + case 0: event.database + ..createObjectStore(userStoreName, keyPath: "email") + ..createObjectStore(sectionStoreName, keyPath: "id") + ..createObjectStore(calendarStoreName, keyPath: "month") + ..createObjectStore(reminderStoreName, autoIncrement: true) + ..createObjectStore(sportsStoreName, autoIncrement: true) + ..createObjectStore(scheduleStoreName, keyPath: "name"); + } + }, + ); + } on StateError { + await _factory.deleteDatabase("ramlife.db"); + return init(); + } + } + + @override + Future signIn() async { } + + @override + Future signOut() async { + final Transaction transaction = instance + .transactionList(storeNames, idbModeReadWrite); + + for (final String storeName in storeNames) { + await transaction.objectStore(storeName).clear(); + } + } +} diff --git a/lib/src/services/local_db.dart b/lib/src/services/local_db.dart deleted file mode 100644 index deb5da93f..000000000 --- a/lib/src/services/local_db.dart +++ /dev/null @@ -1,304 +0,0 @@ -import "package:idb_shim/idb_shim.dart" as idb; - -import "auth.dart"; -import "database.dart"; -import "local_db/idb_factory_stub.dart" - if (dart.library.io) "local_db/idb_factory_io.dart" - if (dart.library.html) "local_db/idb_factory_web.dart"; - -extension on Stream { - Future firstWhereOrNull(bool Function(T) test) async { - await for (final T element in this) { - if (test(element)) { - return element; - } - } - return null; - } -} - -/// Provides convenience methods around an [idb.ObjectStore]. -extension on idb.ObjectStore { - /// Gets the data at the key in this object store. - /// - /// This extension provides type safety. - Future get(Object key) async { - final dynamic result = await getObject(key); - return result == null ? null : - Map.from(result); - } -} - -/// Provides convenience methods on a [Database]. -extension on idb.Database { - /// Gets data at a key in an object store. - /// - /// This code handles transactions so other code doesn't have to. - Future get(String storeName, Object key) => - transaction(storeName, idb.idbModeReadOnly) - .objectStore(storeName) - .get(key); - - Future throwIfNull({ - required String storeName, - required Object key, - required String message, - }) async { - final Map? result = await get(storeName, key); - if (result == null) { - throw StateError(message); - } else { - return result; - } - } - - /// Adds data at a key to an object store. - /// - /// This code handles transactions so other code doesn't have to. - Future add(String storeName, Object value) => - transaction(storeName, idb.idbModeReadWrite) - .objectStore(storeName) - .add(value); - - /// Updates data in an object store. - /// - /// This function does not care if the key already exists, it will simply - /// update it. - /// - /// This code can produce unexpected behavior if the object store does not - /// have a key. - /// - /// This code handles transactions so other code doesn't have to. - Future update(String storeName, Object value, [Object? key]) => - transaction(storeName, idb.idbModeReadWrite) - .objectStore(storeName) - .put(value, key); - - /// Gets all the data in an object store. - /// - /// Also provides strong type safety on those values, treating them like JSON - /// objects. This code handles transactions so other code doesn't have to. - Future> getAll(String storeName) async => [ - for ( - final dynamic entry in - await transaction(storeName, idb.idbModeReadOnly) - .objectStore(storeName).getAll() - ) Map.from(entry) - ]; - - /// Finds an entry in an object store by a field and value. - /// - /// Returns null if no key is given. - Future findEntry({ - required String storeName, - required String? key, - required String path - }) async => key == null ? null : transaction(storeName, idb.idbModeReadWrite) - .objectStore(storeName) - .index(path) - .openCursor(range: idb.KeyRange.only(key), autoAdvance: true) - .firstWhereOrNull( - (idb.CursorWithValue cursor) => cursor.key == key, - ); - - Future objectCount(String storeName) => - transaction(storeName, idb.idbModeReadOnly) - .objectStore(storeName) - .count(); -} - -/// A database that's hosted on the user's device. -/// -/// On mobile, the database is based on a complex JSON file. On web, the browser -/// has a built-in database called IndexedDb (idb for short). The mobile -/// implementation is built to match the idb schema. -/// -/// In idb, a table is called an "object store". There are two ways of -/// identifying rows: either by a key (a unique column), or an auto-incrementing -/// value. The choice should be made based on the data in that object store. -/// -/// Reading and writing data is done with transactions. This process is -/// abstracted by extensions on [idb.ObjectStore] and [idb.Database]. -/// -/// Another quirk of idb is that object stores can only be created on startup. -/// One way this is relevant is in [isSignedIn]. If it turns out that the user -/// is not signed in, it would be too late to create new object stores. That's -/// why [init] creates new object stores, so that it runs right away. -/// -/// Another consequence of having to consolidate object store creation in the -/// very beginning is that there is a strict way of migrating from one database -/// schema to another. Each database schema has a version number. When the app -/// starts, the [init] function checks to see what version the database is on. -/// If the code demands a new version, there must be code to create and destroy -/// object stores until the schemas match. The simplest way to do that is by -/// using a switch statement. A switch statement cascades, meaning the changes -/// from one version to another will follow each other, which should always -/// lead to an up-to-date schema. -class LocalDatabase extends Database { - /// The name for the users object store. - static const String userStoreName = "users"; - - /// The name for the sections object store. - static const String sectionStoreName = "sections"; - - /// The name for the calendar object store. - static const String calendarStoreName = "calendar"; - - /// The name for the reminders object store. - static const String reminderStoreName = "reminders"; - - /// The name for the sports object store. - static const String sportsStoreName = "sports"; - - /// The name for the schedules object store. - static const String scheduleStoreName = "schedules"; - - /// All the object stores. - /// - /// This is used in [signOut] to purge all the data. - static const List storeNames = [ - userStoreName, sectionStoreName, calendarStoreName, reminderStoreName, - sportsStoreName, scheduleStoreName, - ]; - - /// The idb database itself. - /// - /// Not to be confused with a RamLife [Database]. - late idb.Database database; - - @override - Future init() async { - try { - database = await (await idbFactory).open( - "ramaz.db", - version: 3, - onUpgradeNeeded: (idb.VersionChangeEvent event) { - switch(event.oldVersion) { - case 0: event.database - ..createObjectStore(userStoreName, keyPath: "email") - ..createObjectStore(sectionStoreName, keyPath: "id") - ..createObjectStore(calendarStoreName, keyPath: "month") - ..createObjectStore(reminderStoreName, autoIncrement: true) - ..createObjectStore(sportsStoreName, autoIncrement: true); - continue one; - one: case 1: event.database - ..deleteObjectStore(reminderStoreName) - ..createObjectStore(reminderStoreName, autoIncrement: true) - .createIndex("hash", "hash", unique: true); - continue two; - two: case 2: event.database - .createObjectStore(scheduleStoreName, keyPath: "name"); - } - }, - ); - } on StateError { // ignore: avoid_catching_errors - await (await idbFactory).deleteDatabase("ramaz.db"); - await init(); - } - } - - @override - Future signIn() async {} - - @override - bool get isSignedIn => true; - - @override - Future signOut() async { - final idb.Transaction transaction = - database.transactionList(storeNames, idb.idbModeReadWrite); - for (final String storeName in storeNames) { - await transaction.objectStore(storeName).clear(); - } - } - - @override - Future get user => database.throwIfNull( - storeName: userStoreName, - key: Auth.email!, - message: "User has not been signed in" - ); - - @override - Future setUser(Map json) => - database.add(userStoreName, json); - - @override - Future getSection(String id) => database.throwIfNull( - storeName: sectionStoreName, - key: id, - message: "Section $id is not recognized", - ); - - @override - Future?> getSections( - Iterable ids - ) async => await database.objectCount(sectionStoreName) == 0 ? null - : super.getSections(ids); - - @override - Future setSections(Map json) async { - for (final Map entry in json.values) { - await database.add(sectionStoreName, entry); - } - } - - @override - Future getCalendarMonth(int month) => - database.throwIfNull( - storeName: calendarStoreName, - key: month, - message: "Cannot find $month in calendar" - ); - - @override - Future> getSchedules() => database.getAll(scheduleStoreName); - - @override - Future saveSchedules(List schedules) async { - for (final Map json in schedules) { - await database.update(scheduleStoreName, json); - } - } - - @override - Future setCalendar(int month, Map json) => - database.update(calendarStoreName, json); - - @override - Future> get reminders => - database.getAll(reminderStoreName); - - @override - Future updateReminder(String? oldHash, Map json) async { - final idb.CursorWithValue? cursor = await database.findEntry( - storeName: reminderStoreName, - key: oldHash, - path: "hash" - ); - return cursor?.update(json) ?? database - .transaction(reminderStoreName, idb.idbModeReadWrite) - .objectStore(reminderStoreName) - .put(json); - } - - @override - Future deleteReminder(dynamic oldHash) async => ( - await database.findEntry( - storeName: reminderStoreName, - key: oldHash, - path: "hash", - ) - )?.delete(); - - @override - Future> get sports => - database.getAll(sportsStoreName); - - @override - Future setSports(List json) async { - for (final Map entry in json) { - await database.update(sportsStoreName, entry); - } - } -} diff --git a/lib/src/services/service.dart b/lib/src/services/service.dart index a8fc1eb06..2399df688 100644 --- a/lib/src/services/service.dart +++ b/lib/src/services/service.dart @@ -32,3 +32,12 @@ abstract class Service { /// Override this function with code that facilitates the sign-in process. Future signIn(); } + +/// A service specific to databases. +/// +/// Databases need to know when the user signs out, as they should unlink the +/// user from all the data. +abstract class DatabaseService extends Service { + /// Provides the database a chance to unlink all data from the user. + Future signOut(); +} diff --git a/lib/src/widgets/atomic/reminder_tile.dart b/lib/src/widgets/atomic/reminder_tile.dart index c09152562..976dd1028 100644 --- a/lib/src/widgets/atomic/reminder_tile.dart +++ b/lib/src/widgets/atomic/reminder_tile.dart @@ -36,7 +36,7 @@ class ReminderTile extends StatelessWidget { subtitle: Text(reminder.time.toString()), onTap: () async { if (!Models.instance.schedule.isValidReminder(reminder)) { - reminders.deleteReminder(index); + await reminders.deleteReminder(index); ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("Deleted outdated reminder")) ); diff --git a/pubspec.lock b/pubspec.lock index 716964486..7e0d7ca26 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -63,21 +63,21 @@ packages: name: cloud_firestore url: "https://pub.dartlang.org" source: hosted - version: "1.0.7" + version: "2.1.0" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.0.3" + version: "5.0.1" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.7" + version: "2.0.1" collection: dependency: transitive description: @@ -119,77 +119,77 @@ packages: name: firebase_auth url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.1.4" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.0" + version: "4.2.2" firebase_auth_web: dependency: transitive description: name: firebase_auth_web url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.2" firebase_core: dependency: "direct main" description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.1" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.0.3" firebase_crashlytics: dependency: "direct main" description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.0.3" firebase_messaging: dependency: "direct main" description: name: firebase_messaging url: "https://pub.dartlang.org" source: hosted - version: "9.1.3" + version: "9.1.4" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.1.4" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.6" + version: "1.0.7" flutter: dependency: "direct main" description: flutter @@ -208,7 +208,7 @@ packages: name: flutter_local_notifications url: "https://pub.dartlang.org" source: hosted - version: "5.0.0+2" + version: "5.0.0+4" flutter_local_notifications_platform_interface: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 89b304ac8..06bce0c82 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,15 +17,12 @@ dependencies: sdk: flutter # ------------- Services ------------- - # Firebase/Google - cloud_firestore: ^1.0.5 - firebase_auth: ^1.0.1 - - firebase_core: ^1.1.0 - - firebase_crashlytics: ^2.0.2 - firebase_messaging: ^9.0.1 - google_sign_in: ^5.0.1 + cloud_firestore: ^2.1.0 + firebase_auth: ^1.1.4 + firebase_core: ^1.1.1 + firebase_crashlytics: ^2.0.3 + firebase_messaging: ^9.1.4 + google_sign_in: ^5.0.2 flutter_local_notifications: ^5.0.0 idb_shim: ^2.0.0 diff --git a/web/index.html b/web/index.html index fc46424e5..ce78610d5 100644 --- a/web/index.html +++ b/web/index.html @@ -27,12 +27,12 @@ - + - - - - + + + + From 26dae7707c363118df0167b0516d14610c723f8b Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 16 May 2021 14:40:57 -0400 Subject: [PATCH 202/251] Run bot on PR commit so the check passes --- .github/workflows/blocking-issues.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/blocking-issues.yml b/.github/workflows/blocking-issues.yml index 2047af1b4..c37e5a594 100644 --- a/.github/workflows/blocking-issues.yml +++ b/.github/workflows/blocking-issues.yml @@ -4,7 +4,7 @@ on: issues: types: [closed] pull_request_target: - types: [opened, edited] + types: [opened, synchronize, edited] jobs: blocking_issues: From caac713d0f40733b47839ae46862ab977ac23ce3 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 16 May 2021 15:21:55 -0400 Subject: [PATCH 203/251] Change IDB reminders from autoincrement to ID --- lib/src/services/idb.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/services/idb.dart b/lib/src/services/idb.dart index a348d7535..ce4fee0cb 100644 --- a/lib/src/services/idb.dart +++ b/lib/src/services/idb.dart @@ -139,7 +139,7 @@ class Idb extends DatabaseService { ..createObjectStore(userStoreName, keyPath: "email") ..createObjectStore(sectionStoreName, keyPath: "id") ..createObjectStore(calendarStoreName, keyPath: "month") - ..createObjectStore(reminderStoreName, autoIncrement: true) + ..createObjectStore(reminderStoreName, keyPath: "id") ..createObjectStore(sportsStoreName, autoIncrement: true) ..createObjectStore(scheduleStoreName, keyPath: "name"); } From 29e366ffe6f6ad207a396431d5efaacb3e472535 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 18 Jul 2021 16:00:00 -0400 Subject: [PATCH 204/251] Schedule search (#84) * Added schedule_search.dart * Added schedule search model * Update lib/src/models/view/schedule_search.dart Co-authored-by: Levi Lesches * Update lib/src/models/view/schedule_search.dart Co-authored-by: Levi Lesches * Fixes some formatting * Added docs and exported schedule_search.dart in lib/models.dart * Cleaned up schedule_search.dart * Cleaned up models.dart * Fixed Ios issue * Update version number * Ios bug fixes * Fixes merge conflict * Add Period.dayName, and Period.name (#81) * Added Subject.id, PeriodData.name, PeriodData.dayName (#80) * Added Subject.id, PeriodData.name, PerioData.dayName * Update lib/src/data/schedule/subject.dart Co-authored-by: Levi Lesches Co-authored-by: Levi Lesches * Allows querry to not be cap specific * Adds ability to search by subject id or name of the teacher. * Switched .toUppercase to .toLowercase. * Schedule search (#82) * added part of schedule_search UI * Hard coded buildResults * Finished schedule_search UI * Fixed minor formatting issues * Update lib/src/models/view/schedule_search.dart Co-authored-by: Levi Lesches * Update lib/src/models/view/schedule_search.dart Co-authored-by: Levi Lesches * Makes .toLowercase more effecient. * Fixes .toLowercase() issue * Update lib/src/models/view/schedule_search.dart * Update lib/src/models/view/schedule_search.dart * Schedule Search UI Enhancements (#88) * added part of schedule_search UI * Hard coded buildResults * Finished schedule_search UI * Fixed minor formatting issues * Enhanced the Schedule Search UI * Blue Zoom Links (#89) * added part of schedule_search UI * Hard coded buildResults * Finished schedule_search UI * Fixed minor formatting issues * Enhanced the Schedule Search UI * Made Zoom Links Blue * Removed Unused Imports Co-authored-by: todesj Co-authored-by: todesj <70974284+todesj@users.noreply.github.com> Co-authored-by: BraydenKO <58378705+BraydenKO@users.noreply.github.com> Co-authored-by: DavidTarrab <71798870+DavidTarrab@users.noreply.github.com> --- firebase/firestore/lib/src/data/schedule.dart | 2 + .../firestore/lib/src/sections/reader.dart | 15 +- lib/models.dart | 8 +- lib/src/data/schedule/period.dart | 16 +- lib/src/data/schedule/subject.dart | 5 + lib/src/models/view/schedule_search.dart | 43 ++++ lib/src/pages/schedule.dart | 209 +++++++++++++++++- 7 files changed, 275 insertions(+), 23 deletions(-) create mode 100644 lib/src/models/view/schedule_search.dart diff --git a/firebase/firestore/lib/src/data/schedule.dart b/firebase/firestore/lib/src/data/schedule.dart index 99d064b76..0be57a383 100644 --- a/firebase/firestore/lib/src/data/schedule.dart +++ b/firebase/firestore/lib/src/data/schedule.dart @@ -120,5 +120,7 @@ class Period extends Serializable { Map get json => { "room": room, "id": id, + "dayName": day, + "name": period.toString(), }; } diff --git a/firebase/firestore/lib/src/sections/reader.dart b/firebase/firestore/lib/src/sections/reader.dart index 12f5cb9eb..dd603727d 100644 --- a/firebase/firestore/lib/src/sections/reader.dart +++ b/firebase/firestore/lib/src/sections/reader.dart @@ -13,19 +13,6 @@ class SectionReader { row ["ID"]: row ["FULL_NAME"] }; - /// Maps section IDs to their respective faculty IDs. - // static Future> getSectionFacultyIds() async { - // final Map result = {}; - // await for(final Map row in csvReader(DataFiles.section)) { - // final String teacher = row ["FACULTY_ID"]; - // if (row ["SCHOOL_ID"] != "Upper" || teacher.isEmpty) { - // continue; - // } - // result [row ["SECTION_ID"]] = teacher; - // } - // return result; - // } - static Future> getSectionFacultyIds() async => { await for (final Map row in csvReader(DataFiles.section)) if (row ["SCHOOL_ID"] == "Upper" && row ["FACULTY_ID"].isNotEmpty) @@ -39,4 +26,4 @@ class ZoomLinkReader { if (row ["LINK"].isNotEmpty) row ["ID"]: row ["LINK"], }; -} \ No newline at end of file +} diff --git a/lib/models.dart b/lib/models.dart index d5c70d33b..e9164374d 100644 --- a/lib/models.dart +++ b/lib/models.dart @@ -32,22 +32,26 @@ import "src/models/data/schedule.dart"; import "src/models/data/sports.dart"; import "src/models/data/user.dart"; -// data models +// ------------ data models ------------ export "src/models/data/reminders.dart"; export "src/models/data/schedule.dart"; export "src/models/data/sports.dart"; export "src/models/data/user.dart"; -// view models +// ------------ view models ------------ export "src/models/view/admin_schedules.dart"; + +// These models are for creating data objects export "src/models/view/builders/day_builder.dart"; export "src/models/view/builders/reminder_builder.dart"; export "src/models/view/builders/schedule_builder.dart"; export "src/models/view/builders/sports_builder.dart"; + export "src/models/view/calendar_editor.dart"; export "src/models/view/feedback.dart"; export "src/models/view/home.dart"; export "src/models/view/schedule.dart"; +export "src/models/view/schedule_search.dart"; export "src/models/view/sports.dart"; /// Bundles all the data models together. diff --git a/lib/src/data/schedule/period.dart b/lib/src/data/schedule/period.dart index f28e8dc7a..0d376d408 100644 --- a/lib/src/data/schedule/period.dart +++ b/lib/src/data/schedule/period.dart @@ -30,12 +30,20 @@ class PeriodData { /// See the [Subject] class for more details. final String id; + /// The period's name. + final String name; + + /// The day this period occurs. + final String dayName; + /// A const constructor for a [PeriodData]. /// /// Free periods should be represented by null and not [PeriodData]. const PeriodData ({ required this.room, - required this.id + required this.id, + required this.name, + required this.dayName, }); /// Returns a [PeriodData] from a JSON object. @@ -43,11 +51,13 @@ class PeriodData { /// Both `json ["room"]` and `json ["id"]` must be non-null. factory PeriodData.fromJson(Map json) => PeriodData( room: json ["room"], - id: json ["id"] + id: json ["id"], + name: json ["name"], + dayName: json ["dayName"], ); @override - String toString() => "PeriodData ($id, $room)"; + String toString() => "PeriodData ($id, $room, $name, $dayName)"; @override int get hashCode => "$room-$id".hashCode; diff --git a/lib/src/data/schedule/subject.dart b/lib/src/data/schedule/subject.dart index 11474904d..068054135 100644 --- a/lib/src/data/schedule/subject.dart +++ b/lib/src/data/schedule/subject.dart @@ -28,6 +28,9 @@ class Subject { /// The teacher who teaches this subject. final String teacher; + /// The section-ID for this subject + final String id; + /// A link to a virtual class, like Zoom. final String? virtualLink; @@ -35,6 +38,7 @@ class Subject { const Subject ({ required this.name, required this.teacher, + required this.id, this.virtualLink, }); @@ -44,6 +48,7 @@ class Subject { Subject.fromJson(Map json) : name = json ["name"], teacher = json ["teacher"], + id = json ["id"], virtualLink = json ["virtualLink"]; @override diff --git a/lib/src/models/view/schedule_search.dart b/lib/src/models/view/schedule_search.dart new file mode 100644 index 000000000..2aed5d6f2 --- /dev/null +++ b/lib/src/models/view/schedule_search.dart @@ -0,0 +1,43 @@ +import "package:ramaz/data.dart"; +import "package:ramaz/models.dart"; + +/// Searches the user's classes and finds on what days and period it meets. +class ScheduleSearchModel { + /// A list of all the courses this user is enrolled in. + late List subjects; + + /// The user's schedule. + late Map> schedule; + + /// Gathers data for searching the user's schedule. + ScheduleSearchModel() { + final ScheduleModel model = Models.instance.schedule; + subjects = model.subjects.values.toList(); + schedule = model.user.schedule; + } + + /// Finds all courses that match the given query. + /// + /// The query parameter should be a part of a course's name, id, or teacher + /// and classes will be matched by searching against + /// [Subject.name], [Subject.id], or [Subject.teacher]. + /// + /// [query] must be a lower-case string. + List getMatchingClasses(String query) => [ + for (final Subject subject in subjects) + if ( + subject.name.toLowerCase().contains(query) + || subject.id.toLowerCase().contains(query) + || subject.teacher.toLowerCase().contains(query) + ) subject + ]; + + + /// Finds the periods when a given course meets. + List getPeriods(Subject subject) => [ + for (final List day in schedule.values) + for (final PeriodData? period in day) + if (period != null && period.id == subject.id) + period + ]; +} diff --git a/lib/src/pages/schedule.dart b/lib/src/pages/schedule.dart index f152b9607..4f6493541 100644 --- a/lib/src/pages/schedule.dart +++ b/lib/src/pages/schedule.dart @@ -1,6 +1,8 @@ // ignore_for_file: prefer_const_constructors_in_immutables import "package:flutter/material.dart"; +import "package:link_text/link_text.dart"; + import "package:ramaz/data.dart"; import "package:ramaz/models.dart"; import "package:ramaz/widgets.dart"; @@ -44,7 +46,19 @@ class ResponsiveSchedule extends NavigationItem { } @override - AppBar get appBar => AppBar(title: const Text("Schedule")); + AppBar get appBar => AppBar( + title: const Text("Schedule"), + actions: [ Builder( + builder: (BuildContext context) => IconButton( + icon: const Icon(Icons.search), + tooltip: "Search schedule", + onPressed: () => showSearch( + context: context, + delegate: CustomSearchDelegate(hintText: "Search for a class") + ), + ) + )] + ); @override Widget? get floatingActionButton => Builder( @@ -96,15 +110,202 @@ class ResponsiveSchedule extends NavigationItem { ] ) ), - const SizedBox (height: 20), - const Divider(), - const SizedBox (height: 20), + const Divider(height: 40), Expanded( child: ClassList( day: model.day, periods: Models.instance.user.data.getPeriods(model.day) + ), + ), + ] + ); +} + +/// A class that creates the search bar using ScheduleModel. +class CustomSearchDelegate extends SearchDelegate { + /// This model handles the searching logic. + final ScheduleSearchModel model = ScheduleSearchModel(); + + /// A constructor that constructs the search bar. + CustomSearchDelegate({ + required String hintText, + }) : super( + searchFieldLabel: hintText, + keyboardType: TextInputType.text, + textInputAction: TextInputAction.search, + ); + + @override + Widget buildLeading(BuildContext context) => ElevatedButton( + onPressed: () => Navigator.of(context).pop(), + child: const Icon(Icons.arrow_back) + ); + + @override + Widget buildSuggestions(BuildContext context) { + + final List subjects = model.getMatchingClasses(query.toLowerCase()); + + return ListView( + children: [ + const SizedBox(height: 15), + if (subjects.isNotEmpty) + for (Subject suggestion in subjects) + SuggestionWidget( + suggestion: suggestion, + onTap: () { + query = suggestion.name; + showResults(context); + }, + ) + else + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ Text( + "No Results Found", + style: Theme.of(context).textTheme.headline4 + ) + ]) + ] + ); + } + + @override + Widget buildResults(BuildContext context) { + + final List subjects = model.getMatchingClasses(query.toLowerCase()); + + return ListView( + children: [ + const SizedBox(height: 15), + if (subjects.isNotEmpty) + for ( + PeriodData period in + model.getPeriods(subjects.first) + ) + ResultWidget(period) + else + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ Text( + "No Results Found", + style: Theme.of(context).textTheme.headline4 + ) + ]) + ] + ); + } + + @override + List buildActions(BuildContext context) => [ + if (query != "") + IconButton( + icon: const Icon(Icons.close), + onPressed: () => query = "" + ) + ]; +} + +/// A class that creates each individual suggestion. +class SuggestionWidget extends StatelessWidget { + + /// The function to be run when the suggestion is clicked. + final VoidCallback onTap; + + /// The Subject given to the widget. + final Subject suggestion; + + /// A constructor that defines what a suggestion should have. + const SuggestionWidget({ + required this.suggestion, + required this.onTap + }); + + @override + Widget build(BuildContext context) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ InkWell( + onTap: onTap, + child: Row( + children: [ Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + suggestion.name, + style: Theme.of(context).textTheme.headline4 + ), + const SizedBox(height: 5), + Text( + "${suggestion.teacher} ${suggestion.id}", + style: Theme.of(context).textTheme.headline6 + ), + const SizedBox(height: 10), + if (suggestion.virtualLink != null) + LinkText( + "Link: ${suggestion.virtualLink}", + shouldTrimParams: true, + linkStyle: const TextStyle(color: Colors.blue) + ) + ] + ) + ) + ) + ]) + ), + const Divider( + height: 20, + indent: 40, + endIndent: 40 + ) + ] + ); +} + +/// A class that creates each individual result. +class ResultWidget extends StatelessWidget { + + /// The PeriodData given to the widget. + final PeriodData period; + + /// A constructor that defines what a result should have. + ResultWidget(this.period); + + @override + Widget build(BuildContext context) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListTile( + title: Text( + period.dayName, + style: Theme.of(context).textTheme.headline4 + ), + subtitle: Text( + "Period ${period.name} Room ${period.room}", + style: Theme.of(context).textTheme.headline6 ) ), + for (int reminder in Models.instance.reminders.getReminders( + dayName: period.dayName, + period: period.name, + subject: Models.instance.user.subjects[period.id]?.name + )) + Padding( + padding: const EdgeInsets.only(left: 7), + child: Row( + children: [ + const Icon(Icons.notifications), + const SizedBox(width: 3), + Text( + Models.instance.reminders.reminders[reminder].message, + style: Theme.of(context).textTheme.subtitle1 + ) + ] + ) + ), + const Divider(height: 20), ] ); } From 59ca9d12e65d54d99d49df52138ba00c667851d9 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Mon, 2 Aug 2021 01:25:58 -0400 Subject: [PATCH 205/251] . --- .github/CODEOWNERS | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 00357b849..b074670ac 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,10 +1,10 @@ -# Brayden has backend: data, testing, services and Firebase -/firebase/ @BraydenKO -/lib/data.dart @BraydenKO -/lib/services.dart @BraydenKO -/lib/src/data @BraydenKO -/lib/src/services @BraydenKO -/test/ @BraydenKO +# Josh Todes has backend: data, testing, services and Firebase +/firebase/ @todesj +/lib/data.dart @todesj +/lib/services.dart @todesj +/lib/src/data @todesj +/lib/src/services @todesj +/test/ @todesj # David Tarrab has frontend and android /android/ @DavidTarrab From 80e120795e351242a5dce2d77655e0fb2a731cdb Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 14 Sep 2021 20:52:35 -0400 Subject: [PATCH 206/251] Credits Page (#57) * Credits Page UI (#44) Credits page, without the credits data yet * Layout changes to CreditsPage * Improved emails * Changes to Credits Page * Made ContributorCard responsive * Update contributor.dart * Added David Tarrab's email and description * Shortened lines to less than 80 characters * Added more descriptions to the contributors * Update contributor.dart * Added yearbook photos of contributors -- Don't touch the copies * Cleanup * Cleaned up Credits page and reformatted links * updated my url and linkName in contributor.dart * Updated description on Credits Page' * Fixed circleavatar credits page bug Co-authored-by: DavidTarrab <71798870+DavidTarrab@users.noreply.github.com> Co-authored-by: todesj <70974284+todesj@users.noreply.github.com> Co-authored-by: BraydenKO <58378705+BraydenKO@users.noreply.github.com> --- images/contributors/brayden-kohler - Copy.jpg | Bin 0 -> 4470 bytes images/contributors/brayden-kohler.jpg | Bin 0 -> 26141 bytes images/contributors/david-tarrab - Copy.jpg | Bin 0 -> 512352 bytes images/contributors/david-tarrab.jpg | Bin 0 -> 241736 bytes images/contributors/eli-vovsha - Copy.jpg | Bin 0 -> 2219252 bytes images/contributors/eli-vovsha.jpg | Bin 0 -> 1169508 bytes images/contributors/josh-todes - Copy.jpg | Bin 0 -> 5249 bytes images/contributors/josh-todes.jpg | Bin 0 -> 25092 bytes images/contributors/levi-lesches - Copy.jpg | Bin 0 -> 1160815 bytes images/contributors/levi-lesches.jpg | Bin 0 -> 735578 bytes lib/app.dart | 3 + lib/data.dart | 1 + lib/pages.dart | 5 + lib/src/data/contributor.dart | 99 ++++++++++ lib/src/pages/credits.dart | 174 ++++++++++++++++++ lib/src/pages/drawer.dart | 22 +-- pubspec.lock | 6 +- pubspec.yaml | 5 + 18 files changed, 294 insertions(+), 21 deletions(-) create mode 100644 images/contributors/brayden-kohler - Copy.jpg create mode 100644 images/contributors/brayden-kohler.jpg create mode 100644 images/contributors/david-tarrab - Copy.jpg create mode 100644 images/contributors/david-tarrab.jpg create mode 100644 images/contributors/eli-vovsha - Copy.jpg create mode 100644 images/contributors/eli-vovsha.jpg create mode 100644 images/contributors/josh-todes - Copy.jpg create mode 100644 images/contributors/josh-todes.jpg create mode 100644 images/contributors/levi-lesches - Copy.jpg create mode 100644 images/contributors/levi-lesches.jpg create mode 100644 lib/src/data/contributor.dart create mode 100644 lib/src/pages/credits.dart diff --git a/images/contributors/brayden-kohler - Copy.jpg b/images/contributors/brayden-kohler - Copy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d100077ed8c5006c16e9ba339a3d982c09aae472 GIT binary patch literal 4470 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 AZ2$lO literal 0 HcmV?d00001 diff --git a/images/contributors/brayden-kohler.jpg b/images/contributors/brayden-kohler.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af24269bda75e0eeb2ba6e61038c137f21f2da9b GIT binary patch literal 26141 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 z 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

                          3pg@gmuO{L*eJC3Sq~ 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

                          -XH>=Woa>_jO*^`FGF-W2I_TcMi^r3h== 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 }qkn|Z^gj@z@kG!rJ6M;#q1J7x7ysV*jC)9 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

                          o%B!*oa+JmAb@EkZzen(;`F!pS`;&- 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

                          fS~H!o+}Q&@;4P>J3j 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

                          V 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⋙8FZm{ofv`$IhtMO>;OjHBY9{PBSgo)w7E0F4CF_C@N~j9Mi7__O4tEL z#GpUdhsDE_w>rr}IeSYgXb_SJ7%5O>-7-x6#1jd~yKW>+a56zxaF*>a(9A)tmTu_? zY%#c3do&cJEm0SF{V*9X|7cSffnOQ0K|yZo@|(#7FAGRbYGKwnx@T!N zLD1xC8cC`oxDC2xP6LyE{1*!cug0c3_cF0vX6iTvwh%93L;`vX3zY#9_Rv^utk6Zx ztTvisYANLLxG;RhQ50@<5s5~mmoF$G1Bqc{UXTcipccaGU`i)m?tpz7wpYu^T6852 zfEJ=MbBVU`850DB1;DMlEl(#fw%DEmTU;r4*b+iu$s{0WK>@tkp@L3l`Qf0v7z~6U zVP$P}bMY&~8Hq1|IXl21i0u6bjG({NQFdg+5A_j9pNIN?b^+;;uzA>WFS1k`?|SX2 z?M`~5;k~m;fw-*V(zihmecdL$g*gaF9j!58|Q*1JVMf=X3ednI(5_dyc$TTTNz$@6`!)Se^ zXLV%w^c$5sJ~ORTw50UtZ%wI#B9a${uc>$`3g1Di=51zO%nyEJg=+XLCV95H|MW=p(3f^Tm!DskD{c!l~dih;)%q+A^*oyd(Z zWvKTnY%+;cp36^gGkQ@8vrQ`cg0x*)Rr2`?3CmketRNBnJ!`wy!mWb5(yY|}@H<1I zOo*|%mOB0^0VhA_cQ&{xx#$@9i22+m3N+kPDI3W3(a0Xqv6gD;d@B=-PoJoEv(`BA zx>}Ph`fAm^P+aEPO7i!5yKS|EHOIbxT-O>)ni&_?>^^Xh;BM!V()kY@Hq?9UK5v#1 zv?4{8b_rR@>Pg(Ga!V~T@r=Q4Klbr%dXt_~dOXlbjt#qB+8%$m`9c^?9r(;gTEUrJc~yT^>d( z|1xtXb-|xo@pk(;JsxYBGyU#px?%&4ucG_R;6jF)ZdsRYn_4cTG zDeMp{`Dbxp{Yxi+7EYAUO=YmOOWv|x#1R-7c4=--kn|Zh1y8wfMN_!M@(m9_mm<{kUoz^6DOO#nHMq!1MLtzf=N+d-!$r zIDPk`v(T|<@`}c#$Itz)tR=7URw4pqF;5M`3BQ96&ju;!J^R_J#)yJ~`P8YgkT0{Z zOrpUVn5J(nu-dNIsv2?YMT<{@Uyy(&4Qd@`A#*O(61 z5I)|io_C#FH}2=TJ>o*Wj7Z1~jg&H4v$^=XG~8M821kGRTu8)%{KFmR<9SzWq_aj0 zCr*AFFgN>g(AT9%#N2^SUZZovu{i@$^tB&Mgl7ah^VLZ9VYcn_b2ZF8zenw9`Ff5s9|mlRA-lCwuck z|52Opv*eRv&_$JWIu|h050tHzN-XnXVS9Ehy+88f2OaKt^!)(J`{?6C+M0{f|Ef5; z9Wm6gDWr%->BoD1eoCC^5{u3)ds@YFqNTOHBdBNQ9VBh9p4QR~+ClKU(*7kN!_(!l zf(Yt{ntf094Y_k~bK7z^#%@PYYYhA6?-#Hw^!|Ch%SdTrs;0(w_PbN-O1IMvB;GYb z!<|$%xo557v8N~E_aoEWDd*VF03WN*?%6)3ZuYO9E{H^BFMB-`2;=R0ozxwoxToZS z?M;KcW&Lt}hjv`MOkdMZ?B2QsPbYo}@q`WR6!+AB&8brs|LrW~ZMBTXhFiN+^|iMj z{NBBMq9#B~^4+C=%vjOokdm0f`tBH%8vZ8#*qsOwZ`RI!Nx`J=6EDjEgrM;{RpE!5 z;-$#WA8zf2cxPQF-Eo31w;V?^xP5~eD{B5#%eEs8e?7{U3`MzbZl$YlWcQN{0TGFa z=6A~HlT_26B?kDrM7(;zoYm@~HlTJE74t<6(Sv+%qqsefry5}eN}m@$OQ`)+n`qVN zCu$ZyX(v@Uc}0_rO_|Zn46U~FalPlCte{1K)M8dpq>a1Ncu0_To7c>|S=90m&;FI8 z24y{At=)S{DHOiQU3a8qv_tiejC{RN+*P;FN28Y(D>W*4myrIP2X9m-IeNwpyGWhE zJVv*#%C<$lFx|`NTw`^v@>RNMM$6(v@Hv+UGQx41+58n8KHlNQo;^%q$L5&N>YIme z*=-GZ`%}k1eM{@jN%_0gt~=Q9@W;QNlY$OJs2td|S^2d^R4Si$ofvN&QP^Y+*t{x_ zrOXGM?$KR!PYIB4z2~KJH4j1cb#~UrGke+p?*8C-R9a{F-F5GRGKY@2>^EXMzSX>_oK|^;f7JNN9 zAc|mv60IO|k>d!&JUDbM1|`RLfret1-M0NwnZSL~*g`7KXapLbkcLSZ0nIcSzzF9@ z{xng6CNqB1Kw)nSLJ(0LrmG{{U>ri?2pn!l1yNIA446~Abi$+l7_mzGzl76C9SL2?R{4gq=UusW(u z0ify@khPK>xezjg{aXH(klgtbhPLr;E??9Vn$gCKB_L6bj68d$`7!2 zek6Y6TOAHpOEun_OJMTgDy0Or&_|bH2%k*g?x3R%syruXyyZ|Ifk-0zlZjBw&eTbX zIjQfs(kWS;_%wviX4M^`61Uk0h5iHQpMkRIKcGq!(+&^bg@rmD{NhixJjaC2wJ{A7QO%l4w-I>b_bYs{2!_pe%ahE$?J7{H5J{Nbio zemNg%)3Z(B;UyE+X;G!kzIa+^Y^boZv)opv!zLugRHQtGW;U%EzT>i8BcTqv$$~Bp z7V|7#;)QKHr3`C?e7YXRJy*&0rX%6b@kA~isR*z>O)><|x-;IIgGW&c+cPgePw7^1 zvr5rbl_ay9hxYxZqfEeaW@NNZ{}Uy%M`Fm^?ChG^%CgG;JS+mzFmlZWy@9_&5YaV? z@FS<|R}mc)i${eh6I+i!CXs8&OB;Lgg%! z;Ho7;V8E47Y=9UkH^sL2kHq1&m8A#VO4@MUA<)B*5xt29-9`%AZL~pAluEd2G}3}) z$o!yTE<-R-KwaG&ww7Jt>Y~!QlL^SzdQ^M{^sutB0IZGhjF^IeqRIeXx8e|5C|HRh z19h+bh}wKNq9GH_#{Lgln6Ts}7VOy!8Fgv6`!K~E6TCMTfzVTF3x(emLr2(DWW$^q z8;=Et9>#h9ydA^?K|Z1Fy27OI#tLkKJk8*X8fPK;!0@J_<>R3<*p zfG}7Ix(%>%F!aJ#Km*n|s+)ww!^SIbPf39#L;YEZiV@@y z>7p|Do9`)4Kd~|3JUzc$PB~r1V3$rLcZz`Z@X9OrkvXr9!aKzLDNsPj#5so0CM8SW z9w!Ue4W`vqK&Twa;}lG;Qi+20C;>^fA9#eNP=B0=2~5=GjPtcvJY=6B0;O}7rmFdK z`&TVi13K+ckg|%%hQ2O%2l!%oI}ptb9l8jLqWkpbSb_kYZU9tq3#zr*Whge{7RZDJ zcZmS-L||B$D+%dRcz^_dvRPcgh&>oC*Gz!@h=+|;yA2sp3NJShcPwB%=aZu1g9^C+ z=wYxe3xJ;&(rDZf|AJSt8Tlyi`va;bWvp>B?xPUyc}v+O&s%c$GK1RVjQh?{{jlf}6 zut)VBtN$GD9KYgh33x(sN@dLUGw~wZd;3qt(ua(}n z3+}mwVE3H-FrG1V_>-cJ)*}+(`Q17 zDZx6{T=-UWYr|u3uc*M1!;aX8fxBnq&fu;anO5pgH_gP+UvASJ$%7}k)SC;gpG(&n zjO%srT-U3YGn@4c+xW&fadS8i4ux}+ddQsSSzt*N4mj#(YtC%Ig! z`*NxMxpRiaMD-$t&77%5G4Y)woBtugAFr$5As=DfUeT!6&a1b|8JQC=9!(B$Ib;** zq`y_~6{F#PIp*1%>UE8sO!B-747WwkP(Q;m>Azx$k&cu zxZ(Cxs-6$GBhk^LxBc&nmF5xca$?aNE4D2v1CABx&(G<{1+GO^%idnv=VNGIJyfA2 zYvOfg#^;R<$DXWE%CmiA#!<>xI;^(RB^3;LHYay7gf~aVXA_i^!5ci~?PWZl;I35E z6_tppUsTIW^$E8z{O`QROwQe@JHJ-KqpSzo{fA?&Cf>ukHy;}Rz$z-^?h=Yf^6D4p zJ;6RKp>Xo;kJ9`kYf|*20QZjK(xeUv{bT=D?EJ?c*(iN(rI){I-I0Ja=?Lg2xfhID z_;Bwwt;sr?Hy^nzms%&V*mPZ*XN>yPHi|ec+jdYczh1BKVxQfN@zDFe8m+j6rSI;o z60#RO7WYLRoAA>)!hay3nz>(fjNm6=D<c`VX~D3y*Ime1CCX#ghE?pVL)Ow#k_G#wN=>=Ja;?J>(J2ggqs@DkLx_U1(qV z?Yyh5B)>Z+o+=w?S=YJP1HC~-WoosJ&kaPcPq!XBz<1*S)$95gOTUQIphQ*?NNS96 zBWoUTo4pu#Gv$K(=boyl+SRWY!%`=*ge#9>6y~c=?G4Z{DSh|(ueWLm%Ae#~qAEVz zdKxR%U?(b*BWV-=+^vE0r1wequTc$rexJ&==~x4X-q(IYs?V&~dvk>zGd3|w6%vrR zr_}DdZ7kz*%HCYOLb$iD7b}2jG-_6?m>5a>7%i)3N~vGb;a(yC4t+Zu_aQ<~@l)gb z=J!B7eY}9`Z(W;wfXb-1$ zs7Ti1;pNBbRvPs$!AvEfv3DW)^)jX_-M2$ zCy@Q0x`~Ja*aPmBIhWZboAwDznQjrH;>`%%s4YoNSrPZwh736)?@KGcQ(H%v~`d6y}q02sQ@o_ zXbLNodWf@d_d|?N*IOExqT=4$bDY8nzaH6Frmx7Bwq}n6oqJSZTrBsz*(vD2+hEVJ z^uyj7I$_VBbO@>uI_Asd2k!qUF0sbHs?vQKjXDa@Hz67(Z@$$U*$q5ki1fT*-mai?C#H`VNCLC@Pj+YenDN@?Z?Lt8<(5T~p5cHd4 z;NTiyAk-$2jI+EPIO2RvtokBD_&yA&5I~{KLtRxF94ALi0#q7yIb0`rq%6So1%4y} zb=i~+Cc5*y#%*pYf#EXEkXW9r#gar66<9kg0)t6tnSJ>R-KNil6v=Ehu2Pzh!viKp zL$!`>f`H0=3$hn#Q&A%zOl+82NFn>B;9wkL@BpI*Ic>zANAxBx7a??p z6A1*_wq;io$Dbh;$HvSiT9VKhcUsy%nsx!s_PCVgaTZP;E+wS=q)~0aZOPSTszp#O z-4z^=dy8pQuotygcAi&CQLWAHaHJySH5L#zz~Y$OO+`cGss+)6DyrdnJmm+~?6G~s2J+GjB>F8(zO6jT>79xg#UFS*-A z*(aAprHA~WJ!Up{k=+@kl~5h5#Ast0ZP!D`INTmReftXPR9vQ^K^PWZQx5v(Jp%GE z{j3{BVT~FK7QeQ7v(KO#0*PPk+;b7)uUd8PI@v_Vt>jJ0pFm6}`;V-{1;t7jibfgJ zZrFs@FXd#m%zxztf!iC`MdHS@!E5?m3jG#{_uXj!%no-2SqQ|DM`YX?dkIKVDIN6` z?iD$8X;A{VZa4bqL_Cd~o4ibUB_tS%Qgj9p;siF~KX(G=4HK6p+G9fF!|AS47?CjO zQ~TkD$rI7&QCANc27V+9;YSCgIX5DV!0Yxn#kVv}L}`mPw~nKo(l;VIdjQxGuK?Xo z0AXaAl2y?}C(=}L38lXL}R_CUKJ%lXOe#ej$M<2aeki zma&-MX)+ovv`z9QG9u}13M2+MIBowxFFMpwH63XGfDR0zZ>}_tnM?%f19m{)Vj95a zs~>}X6IRQD!cHhkGlIuDd@&(ojemm${4f%L*}7+ z3;-bT%fzpi+l?Tb-H3IpelOT>{`&4XN~kx;&~@KFFwV`at|kIGpnUt|LrWW^cy>gDv%Kjo$l2O7RfSx z+SlK^Z?Vak*WvM_1olLi-tL9GQ&&m_>wkxx8CVoBG%5+fHC)_Tbtn5M&rD~e?Y)+; zp#kSTx+AmZvbRz5w6fdRU3{!(mKvmq#^r?@RuTN83_Inv5%1-UG%-to_Z9;#7ifnsFJbXm0j?sWfPxq#w95c-vJn74<>acih-7D62#r;d)b-^P!XOMa|g{YjJk#E}VHP|+8 zLu4Z;PDb9ulJ^r zkCsV{82^l;Sc}PrHHovvb#ALp>I5fe_ZQUb0MoBvHpcttV^G>CH4P zdwucAajt0z*1#6F8De?s8}5~%D++}7T$c%squsDQ$_VX^_@2Z0rRn5el#E|s z`-pS=YK@&&n)`MmzH>j}RHNLPbHeiLxyS+D-0?fJTtqikCEe;MBKqCH9n|SM>@Sr|AO?-ur95fCR>%* zx*U2lOVwr|T(73C+t#Sk-%`uI+aq=1ai2Amvih8I=<%C2Dd1luWVzmD~Z> zYYH{*mmPJ}dCk9HD+=@~(H_k!sg#?|8{b*pGJL)5WGBAZzodK6{Nza3?(rNwWW=a) z$bWd_$=~V&5871%jFx@3g^zEXUZgSO1t;&=9G`Yu^uZ!%Cp)zq-LV^qMgdcjyzN_C zB+kc!t@o5pj5f`r|6qi2iVVsw4V}y$lssfaB%*H&-QgrZ6W*jH7Nf}{9pXw~74Pp< zdTD+nO(nW2fcl`YdtCl(xM@O0sH2bGsrNHWbVc(%tgBz-KII}I>I@q1;vrUhU(ReU zQfe*#AHO)cnHML_(qBzfgoSYu5-hV+!lt}WoqEt601S-K$Dw-}IJ2REC`+f=9&4j; z-kYXl$F+`kho%~^$iHUzZkeL~hfFqH+4+G&>Mfj_vwa$o>`H-=*gx*FQ;BTWAzAUb zm$KOcmp?c+@?5@qz?x9CM+Rl3b3tl|W$n8deReT9 zhx=rFP>!v|YlzS7$&!~q+)#Sy-)asIAS>dUQ3Ln zYFtjTn>fX94Cyt!5)?Gysk3~s#9Eexjq z_2!mo(vcWt%h4xAqn+*2=1bLQU+@o4DLrqt^0i_6t%K>W@Z~po{;BI9`+S?sX*&Dz zD-R`)YCkWu)jO@6u%gi#Sbl8vtLsR0u@DuXNJigXA|*Ske3nSdIV43ddKMmsFRNcN zQKl|7X$Rly^whEq*Vq)*bd>Ve9`3(*=3j;IsIfb&_S3I3m}75`zbeL=g_TlQZ0#zI ziBAgM6Cfg!pQPE-{KKGS?E9q#LP-J3$#R!!$;BPV4+Uh~Dlj5#!S@*0AUkg_%=UYF zd)`1hZ!~^(N9Nws%mG{3c-kd;^DX^0*T)Cjdr9kdx-C}yn|q^r$MQQf=->9puwqq) z9^Unj+ZZQ|%MN4)W|E{d{s~Z=Dsaf8Q-D zk&=D&si|L1apEr4T@$)oc3Gje_FS9SmDKm03-iCihU?ltm>2!XxEUr;viMlDefogB zld*f`%$P~>o3!YfIFu$5)W1K|`|>W?b7>WH*3dt~=eC2$C|fmyB>g<$iRxwLXMs8T zL%0C#8;$SVPVEm@5vr8&`}t!sJ8(wDAQJ~8w_ba%DxMRv|*malUgJmg&Oa1{-H)RD4 zJ}4(J1vC-~EIP3m0^b=E$h#LXvfy}N5C_QsN@)QYMu8v__+Cuop$Ce64Il~!g|fow zLIq|aw=AM7`2hKBo=^-FF4+&rw`vByMUlNPkLMEk8(8+n31~tz`zU1x#N*{a3Xl?F zVv!h7sNRhmNdjw`3`7Rzaket)GNy9~dr5bhi2%qievW~90al{~CVGye=!mhTe(Qm( z|Bs*qE-aJhm%8?jSxDp46d@RsR83dGU1%m~;BT?PBM51PWD-&e_;MLIy|+hba2CFT zSguYogyX^bM^*p`AkZuvaHWEzZody9>|5=XhHBo}tasaNfB8m4)d?8oYQS|^1j1M| zKa|s=(mJrbCgVX#acZRWUT8s8_e})X6TI~}{2572T!?9~>_tspp)J@OsdXq69Aa;5 z!d53-{H+@TIZ06e)2t3Kyx!=2c_M(y+h()PLdq%8m9&TBR##8b{ck00m4Ta2(n7Ai z45_I;AHooR(_yC+AIrw`@(MWHvoWsd(`>8)a3^FuFru;_RCId*T&AIyA|plQHL65k zZ!|>95@SH*t900>19J@z4+h@sD;8^Nzy_2bER}dzUzZ%j0u|o($FtjXf-W9d6>a=jl zwn_pds8meE^-v++sEopDG|;#oRoN-N%78lHc*JkD+r_4=4_&~+8AFUJ8Tt+wGc#+d zAUiv)kwhYGlXU!RmZ<@m_T?1OAu4~QZZ?I_$=NKFxswPIlWHXrl$eIf{(n`AaGIU9 z=7^MMeZ()S|o4Jj75l9$S zsF6hQhl@O1y`vHzsNut>Y zqI@XoGPvagifOc(Z1aMoDy|(Ao*qEwfu#@}lF1}KCuqElfns6-0Q2ba{DH14a3H9)0D73u?d(<>T^p7?SqUPH_ zbygTjBY57t5o35Z3x^PFJTDOeSF126H{6T4sJLDN977|5?eb9DE6~oS#=dh*hZZl3 zHk!^HgAdlXR1@GhT+BDb*u?)B1JVToJyCyNZT<^83xT@lcnEo68j)l(eM-+fgp4w_ z5O#zkLk?JbX;p~gTrJjgA_twA2H1&tAVXvzESvk03b zOB8+*Pa=ogtvHy(2cI|U&vOl%6$o4+3B34FUWv~jG6AtNGzR7D;Br)#9kpyJB_a7i zA1csfen_F1W)T!cK{i{6P1Eh#l4K)*hgqiLa#`3eK!(UQLm}M%Z QlrC8LAO?tw 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

                          &-#6|WF?PeT#mQ`{9bRg41Yw9PL^>es-(Zf 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⪚8cj+iUxwwuK;WV6lDl? zm;kv0Um`;QZHLtZQp89t@^2u22vBl7HPXK_qDu~37vO4^j$l^(cM%De)4U4@beO#F zpB5wCGvoO(09lg)0Lc#jt11rTl6*89+c7FbJpOMyt%LAvm~v$8PMo0M7EqDLDXQzW zD9@aQWBzC$o2+c5GNF{m2Cgx@6rijA#4@&+I1kvJ72%#_)xAQLZ>)-u?_e>J4OUOW zICS`8uDK$wMSyR_z+@N7jW})4)?~heVgjq{=l@9pt=o`wh}oiKyB-t@?>ig?A9)ov z6$K8zc2TDr*Pr{hXrG7F_FKIq<5|R(ld36!$}JP$Dz;dc4-Wk{ zR<+{|Jv4c{zxlGRzuK*R7WO(>W<=S2R#TalCN|Tho#9oFcD0Y$NG_H1->PAo zSrk~Xq0aEZKia8MdgErI+ifJ#-v4+1vTm2Pw=T@KQ@_oqUrg586;Lw5RkxuIt^M*h zWtR=9$F_fO1^$5i#+{$rO-!z~?Wa!XR;IO>SrBG+_Ei41D_43tqEL45awIQz&2Q4w zvdyQ?^4j8VPaOj3>)Ad3h98=tE^dBuZk=WrmXpxao#0V)cHfvfJ^Eu+*o|KVhX<17 zrcHYN9slC`ul6mT(RNI7%}fl8Q(;}UU&{{p;`1sj(~LbUtUg)fuz8nOucKLznEFnx zAMdK6V->%Vz-@HC zj~8{*u<6X27X1W4wkvZNU&G~A%1e(qHtE!6(15BNQRNQleHxne?CjLI@O=j#<#=>( zPsPh>RDY5)lWBypby!yNtYn6OLo%nf+jhf6i&~$kIN{`7J+mv(5BypSHvAEpG%#4< z_Q_SDM4g_L{pgbR7j+|DUz5AB6~Wf~UT>$9@PPBIbbXMM+c1@AN8QHUy60%Yqr00P z9o13MFmt!MTp5vK*&VCBadqxBxd9`|oJX!<+Z>Langec^O482a1$v_OV7(E$?;DD6 zb<*R+c`w|i-{W#V&F^d+9ZvCTK$d>)-RQq*@iS?!kTW;W-MVSrE`~4HQndZ-+D6K` z%?Z+%*>S(=^xVpcxTMl@G{IZ@W_W0zyG%bh!nRy_D|-GW#zCXsaSiXf?H|rouibNI zVw}!XDjx)w)9GQh+FAt4IjWnw7yq#1m*K(Im=lyp$s~1Vr21Z5(Bp`0TI~z(80sHv zEEw-QMAEO9yh<~Ky5<(h!no+SoU<%lcdwbedXEI<)M;frM_Yd}$b75L#Jq`U!13as zq1UE~4*{q0Cx+t60__hzwRP}!X|TJLBAqmG@>I_M7WMgtWNcTCe8sx@9*@smgEfMI zD(}lNM^BmjIbOH#f@pT<^`P>q-Of1#>Ul1ML$^s;D2TUwUavhC^GjpSMjrk?yM1wi zz53`4L^(NmNR`nOD0&M)vkPl}b39@!u)2La#Xb44@}r}-Bg-n%h+Vh+S~iYFm0L^OQc&lvqU@IqlxdxgbZqb9t1^O*wjWhpV-AT>SHgA6moRI0Q`1hL?Im zyA0QC+k;m69(4J$Vt@B-5`!LsL)ptU1#t_)?s8sMgDFPu(y4QLdz#W*u50znZ7^(% zB`1%>$?nD~6QKYfR=r!O187y+)tBNVHk=PZT;7cJ<-k$>W_JFDhuQ?_b=cTS%n4;pu**KX)=$_~+ySsI zn4%#clUPb1RIW!%Kwaky;@a?paX}+bxwM-?S^rsrxdGO<%&SmY%0?+s0aL6D2QVUF z8*KUso)T0E>~!B9sYCgG-@r1MSoROyG&%_VpwT-;vP{gfKSOCG#qFaarsdNR6W6I< z&1VBJUZ>iU;1fer`3n%PGa#t`wkTnFBNh`S5X6Ker*`imum;}6AeTTJLD%ZyF_esJ z&nXVnbKWbA2(s}wcorLUB802E&C=2clwyk?rY8W7b>WIDLdf>QI@7 zV6Y0H0^08^S%_XAf|(Ob&@n;VbzSe>6WaS@_3Q#z(f};JQVRw}B$xA^a%x)dV)-~^ zyACcfTue7mDrvh_xVf#(_H^9Z&Jcd}542Ec?A|V!a;?DqQpZy1yi!kU1fqgtLRcm(#Gi}L|3Q+zF zPyHu~k0h{^V6cwXFP7j1{XEpf6c_OZr#imO39`m&A6Meh2N1&2!aNHBiiRT?JmX=O zJk*TM1jCK(>wMV-CJ7=FFknWn3PurO3AE~gAWQhOmLBhvj#K=-3V~_yLCFpb>mDEF z%}2)|@1G#xSI$TCP$-BUAFG9PFEa5jR}qB;;`)jH1W*S7&BF%Hrhf=cEzp0ODPJ}T z8!wguIRr;NAju!lUwr2Bmp^(Vfr+HnBkO%qfElg24(*ck;`dnnZv9IXxM+xGvS zajH6ecJMW0AkkLO*Yo2V_keN#*4PhIwW|+HyMxmNXGe~juOCt@(29QEbmDAXZSk>4R+|kZO>X$d zWmhBe!6@|?Wy5I8=={{9Nx~z22dG_DBE1av&$R`nx(9>$trG3Ft8Q?s{9|5WaRZ!n z<*&WE&Ug1Lczh7g#T;Uir&IJ=y3B$e?=y5klJyred~$C(9GYb@edOXTM~`n?ZMY}S z+@^o?DHlDpR~fGga{{lWTZPpspc}C_;*}!U+i`!`w6}K}GzFbp+wF*&oeRvVw4se1 z6v{1@mz$Dv(fcvX{Bu-~&856>_UGv|i^NKP&AXT$PK0XZ@dL!F+6*r$q_;`?jP@KG zMJA$6#tU^$ymn))N~aqXnjh*S_S!^Khn=Ne zS51)5$ecG(PV`SsiN1v^i5Z;Hmx{Uar`hQpn=En?-Sz$wpUVrs{YckL&aBO`Pt_b3 zP3S`=u}Q*H_?!qno)Yimsj`VNc0*1&Gm_zNU43wU%H0#Q9^~mizO1sL+3F311+KwZ z{M{6qvrRQ97yoyd*Xgw-2J(c>Z5OlNa-U>8OcE5t+t#aCj-~qkUW7ifxKy`JOnmll zP2QL9To?UaZ)Q_rJ)UFo!*!EK+botVo(T_`G^z4O zzyEXnFSm~UjD1|vZ2bK}S>XC=Gf~+Y>noExi+@Nag{Mg4YcGEK9uY$o-pl_GJ#HQ( zl2Ur(I&O`v*Wey@P%+M(pj{yD{zTJ{-5_`^4h% zF!PuGOrHZmUkX!ahc*v^d(orYRxcwvL3Tvj;hkS8;P|%=Z+o9~1;6nDJ{-`?7SK7C< zcH?Sdc`*B_*7A0d+dk*_k8B-O4{tcAx$%ZFZrcl4G`gxH)kv$$#|h)iu1&jm;_+V* zSmE$9yWAV&3V%F9J|4q)_y^0`zusXpcAIP`uCvJU${k%hR%ZEjjeW?-*Hzk5B0+t- zvDc1}eF`O$Z+Wz=I~>h2FpP?EiH7eV&axgnb+Y^IrEI7{)`rdIEV z*w;BzNjin)Lg!XO>+CO-{v+4Zp4>P)DiDp|ifHV1d@yo2&MLb0|qO>%@zEvg4(*;&ZZ8sfn=F(c7@VTYqNFZ6KA`;<7+JJ6v(OBoYTA; zGe$Xo20wv;^rm<>r{GJN^)Fnn=O2Ct+k|V&|3fYjgzl8bxLv2$7CYW8CGj3vexNV= zyIN|yCE{(mN1CjocGvzFOf9o}tk)B5^r~eC_fwKjhoPazfYFanyRYb*oX7B+WHTY4* z(y|1oOe@s{=Tnu~EHbQNQ!-Y$unkG!f^s1HyQHsVcTqNzZA@;dd$9Ie=RXI6S?M7M zBtU&)LN-qalJ_L*uA?#wXl|FtIFaFkQT8xbgNj3iIzovr5uQ*j;Ky64lmw z=OhF1HGzlM%41*3MCLfjqG zpuFr4@H5j6u7evyPj?LHDBiou9d$bpNhN1#KY;blKmMlpse>FNkBFF?{#1#gloQ)BuQUe2yV=hJud~$vR!8{!8 z6Gzlhg_A2eFrDIJYfGV+_MsbAB?W3|`KlWvNWS!RqV*G9F=5%|azeOV0E3V6`FInB zg1{*YB8}=T)y#Dq%gxQsD@%go>V_X+wvC$D%}x zMBlN6t^4_UL`x!ai_J*;&pdVu_P=eeM0ZK06wg{7gg@A!Ay!DYM7^$*!1h7qF9^a~ z9D9cx2SwYW1XFTU2JbeU{CKPRQvog*4}gRLO|T7?@C;Oi$fbMM3x6|2#u;w|nuPvJ z)M8N^Si~!%KR^rGM9;B8l%AgVL;n>TLMbBh5qgaJTS2ECEg5(uRGmH9wztBt3eHUWrX6F5u*oGt^>&@odm>78BK zdPJ8MA^J9YZ}D)GN=GK=SRLh)^~fgp)@>Q6EkqolLPhliWi4+frqPTAsU?Lonm#qf0yWCiE(-9OY|))`?+U2+nSR6bCqPJSO!@5cPY z)x-=;dY|C+Flm5+W|_b(-`6)bj<@fKO{FoCVnKkI(=kO&gsKF}&>N7lY42T8C_>^N zfYw7#Ve8}3#ZZRELa+*bhsSg~J*X$FXQ@uqw8>`P@$1;bST~284l|Oz!^O3+M~g}y z@7=yl<#K}M>hA+pi7%XohR?a&2->qf?C-+y;_){pF7%CM4(D}epVeI_Jn3n`8o)fi z{%-4rKl(bRX2$E^yJp{{W%Sz8DB9ZG86PP;1T=Q{{joFtQVe?D35(B zuXx<|_q{D=_1tg7j1Eq*8mQ#h-l#nvJVLw2>*QzFU!3Ts(F(zrG4j~ZT`j7h@`_%3 zqK|#{oV%`UxOue)ZD~f`%G~%vnH%bZ@A185Zaq(Pa#ULhgV)z-mXiYXq|?_;HRh$f z#+FoZh3NRRtz8&u*^^D`4@VxvZ%PpKY3TK~J9n4pOSuoW$jH_Oa-bh_D6Nc~PRT-g z`wuVpZ@Vwo`d>i4?M$|7h+FQBe7RoRrA`e~tDw!Sq~6W9#aeIb3{}ZH%ICbb)$oo= z$Rg!EUH+#V{&>@6Qt}n6#3b(%G2vQxy<^~|N9sN=nV10H$i+m&={ovFtdPSQZggY! z`y_LVr<&0Z^IGEV1|u4Vk4f^aJSLw@YE*jANYLlLzej2_d{~x(;pnTAE|CXx%~byl z{37#j7;d5yjZlAI4cmSqv30G`^E5kEh?@64+qI@{yZRrhk9L)mERT4-6kzs7{?`^m z639-F(k2d4rn3DX-d;YC>=C4Bgga(`A8=6&tI0RWWN8$SpJ3edj9DgztS0Z*F^Q zdaY!txR@$ppNm>I_+gc4d!ONnk}HpIT}kjtb@J;v2Jm-XRoh$-v2D+~?qD7uv@%rm zvL2GYv{y#uhyph&S zS@IAki@sBZoOzmH*yKj`DoW|SMU8F?SnU|+{C4Xl(xjGQbyt?C_2>A6)ed3NSx#a} z{)H>nd43*pIj1l_k5kjT0?!X`+lh@F)KHdaU@+wsJ&F0}0&S!ne^cE8HaM=xUxCy~n04Gs@r>>b@nazT?YEPO$jb#c;4>Wc6bOtMU`bFaA_;{ywi*$g! zYfHbo$(0Zbx99O~a43IQEsS~Sa`LZrGn;qO$}E40wmKAf!;jDEt_rihc=j33w3M&( zr|0B3dqd$1uidDHxsleXIMK~G59;S<%OiV&My@rBM)$;XewxZpKPi=9$v^wn$X$mB zuTGhDnRTE@bG_L|r_x_Cg3>KmyC>T$LmJVjj!oJU*CMkWDV!POQ$1!6wnm1FIG1~j zoSzK@$E5CIRE1ORPSIxGnGG3~EM)(#sv8yl62CV#;g(S(`{UQ1jv9~S53|g*@;TFO z*~-@({_wieU%Z1okkDNnlipSMj-i|YAYhj4({~xk5B$IhU~D2~AEf&&cuLJ}`p7> zGcbs=g(;@7*%k~0ck_G}Rc#>N2L+p%!Bk84aqyEtyPjYQkqk(h4j7+9c@ufgj*J#d z)PmTYj#;YY{#azH0^}4_uX6p?-nqE|flZ^Qf|Cwnc4c7BgBZq9E=|9y7H7NQkJyES z$rT=YP?rJc*#kAah(>_KO{@H@@dX)2tQC2+zZPOU;rF<;6d2YJm+)D@#@V$;dw7756D9+J5D*+MX8vxo_U=k&V7>;!@* ziX4nOS@_S8GnyBwH;c3)GUj>{I0ZPsq46hUb=Ew~0Dw;{%WNdRkGV$CglW+*#0jTXov{ zoBpv`6x4W1nj;*t2W>AR(k^dKaYZfbLK{v8{!iG4*L(z$L8mb~doA6Z(a=@al%*<0 z4fFlr44p<=>cjG9`+!+Y5F=s6DQjRgiy*v8$cd_iSSh9to2QqK4j1E@pN{~)462k5 zSvYJuS2lR;aGi3rNwz#CGCK}~F#*UfgC5L77Xy$rjVhL-q_R{d+kgqdLrFpLs!35K zD|908MXPqKN@rRUE2TKl2||?-48dYKsuLVQB^W9kNugvlDFjZ2MASrq%Ml`{U!<5N zlNr3c4l+HF&=SP!Q0sz74M0lb`Cw&N)4aQK`8hJh<+L&>+7hG$_8uYIB<9#J zJrbTX56=uwagP+sqlvImIpFXq5Up~)oMP|Gr62>8X|CnW11x5ZYcs=E4rzqkvIT_T?%rc9A10){Usyc=F*Iw1FU2lg2-uW zV?Uc|4cU}#SGqPA@Fx)xYUM|E@}KqZ?JuxfE?t+~^7$JISX1Vk zFGQSZ9^hoxR27&F{xE)z7(v zXJVK78JrCFjYQha|B$OLth2cXh~bIW^MU?Rf&b=9W8sggfis>fTWl$B688Yr9`3snuAp$0Sz(YTL%v7}?(TbZrlqpv(~*l16S zS7(Yhp84}H8~vsb<$ruMWo1XI;v>&BSPzHSort`A&mr&j(d0l2wzhqS&*2$Lx1qu* z6VQGnb3=BnzV_a^^P2Cku`%+#es2^Ap(sZ<${F+swX(ammL(O6`#XVHTG!F=HlC2| z=A9RRXE$5gZ&MTM%grO|I9m$@?_$b1ez#EP>ZUNyGc>*OC)~E`KU?NHxAjyUu>63@ zi9cqxb+3P8;?~G1eFS|ys+Z@QbWdG-%ncdv^m*f|eDBr?J)a}p$({y=yGC$`zXcxA zyR@~C66WLc^`%HyJY9ayXyddiHlx?5o-4Ml5hWsBj>+5T?9~NlU>kmL@e;>N_VOmF zGGT~N#S^U+zMBxVl-#hjoeT8N`RBry)lvKG7poH9drCtWH=M(6jrskIm8!d>lfLC_ z*lV2NJtM+JKnvS}Vd_-=dfik|)@;<6%v{^?LR>yJc!PW4%Adi+xK@3%puo|(Z-bGk z!Sx4~p#{D^P2W>28$Dg^vy6-eMfLBa2571fl9;T*-Pqp3=o$M6uhwtHnk*w_-JBA? z@Yma1=>pN{9PaQ*jsP)1!aOi!z&~9x$3S^ubk-38O55fvG<7%siHtbX(5?>*yw!7 zP@Hi4X3Z~JR*hOV%-6jI9%|M%0%weDXooJfo?*E8Gppi9Q@!#7Jo;bOtG| zCjE~Ia#?G2R^%3h*li-#-egcRAM$OMW9}@JFSsqtob$$Je`btzom1PR-LqTCKRG#I z^;x^i_nzBK+3J>3Q}L)o(e}j66=S?b%`A+b2`RnQ8Utj}DRGMcclw7AeDbL!FWdzYn%f9~`n@ zr=t5Pugng?B|MtTdNKPBFXN-#eeX5IJ+VIOdn26vF8ODyeCy-ckIEQ-gX{hbD&p$D zWo#&8RZ(PQf;X`#n{4UxMnnBDHJ%ZfM?XEucM4X%Vz&Nam-DxIuJMMBXxrEIXoK@w zv}IZTIji5ty6#V*^7`uywLA8PE&UR%xRG>Y@=SMF*{Q!XYw8AeA9Vk1ul%kTuD@wL zZ$yx9SGQYUb2zf~Y=N*j@+3cSN2tYAH9w{ZD&g6N2=`!TmK{*Q?q~DjtV~a^;**E@6UW{%oRiozOIC>GLZAla zXke}Y;TpKXSq0`uILQvQug@^9OO-*hBgwe>z99DMMBp&C5j|5&1p_WQBi|AfWu^T1 zIq_QV1^x56hAy+6$fhet10uraILbqX@X%j|p3&zvd*lmv z5}Mu{*f0BqVq6diRZ6f!jWmzhvZkQ&w87Qca*+Qfhs+2>tZp?HYSu@JS*(y^p0?3I zPNjpMT$b4@uGGokamAT=Ixa>Lf7D&u5-TdN$q8^#o*WT*kO?(VqYo)KGRsQu?Sz;j z1QWi4OPMQ!Wqz-z0Z=DG84d{}`FOw>Qx=!GwE40{%9{NWuUMd!!a1D^__$YM4jvA$ zhbz$-xLPDCIXapG{wZ-ua!7;UQanjPV@eLZhNI5si&)Hae%L@*ACfBaCn=58I$xdf z$7B+iiUNnEK$>wOQjQcal^0Oy9lI|h zr=+`!!0a;1;l;n^hj04zGXsy65o5rY+<5ZGEHWhYVbEDP9NCB_Lo0c4*Pv#hzjUCB zK~MPii7VNsNYzvlr>R}1TuJ3}AI}NB{S1UpXcR?7x{T;kgu(RrtwZ4asUS3SU%@MX ztF(M)Wer2yz|D@Rf&0oqAPbgD!b6vS)WU){Mf1F;OE}!MKxc;$W3f>ygfa;E$RDfK(ebsF zc`*JFUzfk7atiOH--vpl+u1zC#{(RMK^QHhehVqiz$+ri5K zco72`H^lD+9A6jZK+;Gv(o@6{+aN~VhZvX;nt@M^4ucQUF#pxaDZc-)+6E#Ip-AzL zF+q?dX;65f_qHJ@rlLKbBDFteT5fr4mI!;Iwptx!u~&F_@nx+EnFfrOEjuU(2fT}AjRaNWr(_&FlncF_@HmJ>A^Aduk7Bl@fa(N)(ok#YB6FzncKIs3cd z>q1Fc z+05PP33nYnVL57cTX;r??u{&eL@s{noU(TW&4!5^=Yfr)ND_?9W z3}XKoTzg$@PjO-IPlozQKT~86hACnd#-`4EscY%Jcq&{g zX}mO}_%l06Ab5U~l>2y>evw#*zKu-$JH=+8N=~l8MotSe?Pxv3d}f;SpK@|^S?tb3 zXkuI)HUf49XK0O7auIn%x9Ni-Wb>+fhbQI9-hPGJW|#Sh4|`@@qLErC;uE`*Jjxrp zZN9I_;T?e{Rt^I`9 z?WWe`PbUT***a!!NZ4{C+Rol{2V7Eu-3(i+qSffpgoDZdZVSrjRj5FFV4e;?q4~A? zl}4TkPfhLiJhZ0h76oMl+xl7Vv$eSuy)>a?%jFkzG4qd{jYzp%S}O*|)20TszRpR` z8(d!)Wll}$XnX5?{9{rVJ ztHFm9DEqvQ^bc{@S()TW=;TvIagw>|2kfx!;0z}B z^y4j64OU88dOWX+4`n+OYiJRG=P>twRN3&nhOoiobOk%H@y@2&N!hj}OxBqM)vkYw zLZih^Jqao&r0voL*R0=*^puqYY>Z02?0jIHf2vQ@a)Gl2-X;Cbbuy4{tLvvnDmh3P1WU}SxC;wfm_iYaN#*qlhN*m%CYvpW1 z?}zFuC9A1Y2@6&=YlMWVfbb;^>(eH-i~2>zq=PSn z_|Dwre6gU5;1ZHF2FF?6*URlYGvt2sMHqfK5WENMB^DLe70%_mNRfE6%O1y{S=lYl zy7F%jXyoGQVq>4Ip0MYFYmxRJ4~5DXm~)B;ZnkklJbn#B;&lp~jSgwsIH1Na%kQw_ z^H&A@4J(c$eS_gG7S~Vr+hE%E52p8=Yg9^Y`l55^lFiTe7v#FxyPI_mI+VC>Ek(4n zu3X6XoAc&3yjZ8unEz~+M7A5F%e5-tk zC94tM=90X=_Vbi;OTKvUQ~zG9=B)5r`9I$w@!)=?svhMeLV^2aLV2Fic zjw+gDvo^sZonYz|jO3FYO|S8@w`6{i@Z=Y+CYB^F zd2b-*TC1~CT?%8bbtxRGViIu%be){ySAmwgg#xyrPQI>K zqDi4OND>Ap#XD%7419$w0E=A9GO9aH`et zYS132$0`gbG8jPB`jG%_(d2(+#_KSeIa~~9 zQF2h3q{0dcSd_5)0ImzC=wh~b!ftpE{<+~&qm*}5V_Pv}>mV5(@!Q5c60-P8nUb{yn%9+q`gpOG5 z%d$3}Rx4Z`ghiwIIxK0@bHT|%Ax{S-hL)*8CxU_Tv{NuP4Hge%Hq80Uk(%n5R2?4H z9I`r?Dh-5^mI;fZ`;f-pQN=_@<;yc5&5BEC!bx+sk-U-v`85;-klAp`R$g_BrAW~G z3s`K>S_4!>=yD_wnzQldwgdHCg)z7)*IbR0p~Lg9V6-Qayv*0@@w8A~M}f5P6voJz zRj4pRHK?zv(>jrCb{OGTPqfs>orzYS`t-a|7h)6W!xUuvA5d~^9)@JZGNdWs6@y!; zLJzPU^OEH$Dv-KB+&Y<o05Okx4Z4Uuu=5hr;tnBq|S!w4jW;Sk-4 z37?w0;*D)g=2|+P0$BzSQ{al+E;* z*pfmp&utmMk)QTpqt9NA+3rNZ`W7Fbbg$*~x#lVAS{ z-PLAL!M#|i#@?~ccueC(NsgGEcuy^#*p+;+y8SenNS(P^WnjSWeqbjyXWG#oaZJS9 zO&jO)lg5rS?-z?oQaJ7JlGxtD@1BDEphdmepqN~_8~*Hfra{-Z_sjcn8@7!40u+$c03B-ir~qJUfm6Oy1C^U(MN0PEcY=l zNtv5c`Bi^0e?AP&IatEC6L^=02)Ua3$JBC=qrhFDZ$G?ExV5nzBat*ccqF*6rq_0E zR9;oidX4|t2pmP|*t&tknYrST--t~uv)|t6toNI;+_VL~Y{}!q*~<2xoZ&HkPj~C3EV@d zuzSZ2f2|1{t2$_57jG|<8Rq1rIc*I5_mj6p)E`r5rC&Y68-F?3YLeR`m3S)?D8l@p@Zpj{c?2key`XKN?Tj ztPuno@39#(A%Ds>fhOY7c?fxH$4&*f&xr%d}O!k%~ zPq%4-RmcD1=*;7x-oHQonZ=A5V;^N18cYmrmPy7^GlU^D zwyvbEErwfNOG%_=teM1E>S_{WUv7$0X>l*IcEf}uNkSxPL*3l!`#XMrb^qwmwam=t z{XXaQdOj<|+s~yHJjBHwN-{y-7^hs^OKabyMN+d_=SQsnCwDKph(-O`C^}=9gX)=r zF-C#>#=X%AUb>>N6%?eNjQMspy21*u38*X4fq9*Sc^o@o|;zA94y{}IhW`4c8_cCW` zzrolcu2bM%hLL%BW2P~}+-iaCr3?H67T?Mv`vj)~Vpwa2;*ZzL<)K-~A{coi*)~K` z16353oWr_ekyuq_xpfci&&cobL41>&f40M`e&(tPF8Yhe;zn()imNH*&cf4*__%nd zHF_0Uy>_K34s8NHp0!~>*zme%%-U<;SxK43%q6ArPj>Whn*dLm`5^e0cAP_u=Gnjm zIMWoOiKG7agla?KGBm!0H<%WFoy^r#JUJr}+VW_}kI+#dQ*}9XC{Sl91#)|+1aQ1E zr@aE`alz6yx8(3k7Q*ue}@Sx5+Ulb3yv9l;W~ z)9G=b70^@8u3&IGHOdXtZM=5k;>x+n<4LJFfoaP}Iy@Uqrkb(mx)}0u0x=GzV*`qy za3IW$3rboNq@>7NHNF5U?$A|HE#lE#Tt&=sYjAf+g08u^0z@K(PBzhk%6i$NL|w<4 zYijzhmtBCn^?)ilK32k0+#Qc&L_^MyLM-uRN;WbEg2~6qG3ih-2Sb@k`*sL4>m=4l z);8;*r5LjbAoPR_*ZBGMaxBzVIHL=56n5-xtA?ETc`6-PsT|OG)1ezEaXp4c6)!@N z6sls!81l#)qY{%HE&<6#^g4y-~%C zzm|chvh8$E!0D?BOu{Xs#ZiF@eW?UZ9t>#LS>k)Nwp8-HK5z~lMv^JPixM`>o(qFO zVz7Pa|6hyBVuV1J=Tm%S{X}R>2>5V0DVg9QQyoZhQiL=64*$X6kdQ@=eKrg-=?JX9 zlLyr+0<>K*SLrk`AF^RB#0UTabn3eE7$9T;SAZd(H2Ya{!J3jV*hFRc*LSIxb4C#^ zDgv9%^;B+}6v#7>B!TYkSs|{o7`$XK3zTx|1^`ubm4~wh#hqPtUmnW5XEKHJ%C*E9 z%or4iKLa2b*p8|<8OR#ZNI5A_h(dMR($|9wg`o@C2KXTz{ZbJ?hRwyc!r}-ex$kp) z9V;o#LXegKvq<<5*zE%O24bW@Z(pJRgz7OH%`Rfr0osjM6e-C(Hr$r)u~e)&h`XUd63wN3ldzbx7w|@LOV_iy(Wt z8!{PEgrft1k~b(vh?_8w;&YIqmDs~bjliO6+k(^u0B7ww`58e;F)k03o0uA52i}MK%jUT>Kraq>Sc-pvcm;KIvjMdeux zAF2DAr1*K>J1zR|>#Hvw#aUX`(iZ<#F{VAfb)wJwdEGGx5M7*%43kNFkMx;ra12&; z9JyiH(qg;8NOR}YM%{wIyE?n;0($edZQ3tOR3LnRtKnE{mF_cU=4kAAR`+gHS9Rq> z;il1^2980+A3-DM{cOJj{Uu{-`P&I4GwW$?+SvmE)|@xSdmYLHTB1f%SWk0yCR0HQ zt~YdgBfnCXk~dsndhqv4mB%T?u2L7ZsK(c9L%{;)y5VR!)_>b+KaKG0bALBK2*Zr0 zSXh~rMIDLhK=Zu15YiAo%ik=gFOE^5828mc?Nh%#qg!3*O+O|G;3MJ{;r*Hq$pbDm`*k)OIuQ zvLD|X)s3Z3tZ;L-HBeIY*2HujA~Ic?X0V1Aa}ob3vaf$T+Cevjx?uZhxcqU%o-F_S zDd+fMZzGQEKNFh&&B5cA(@?I__$0H=C)u?_3xaKPejSAK)btaZ=7w*&UhWA!B%qvV znHRgAS3e_~=I_=A7v>d@ZMhwtG2m4!=k2>?7xj69cp=OzHv7nSE|3?}LhX&w3Qjut z-Mp*QXq=*Zb8X7SUr){L4lGQVyxhAn+|PKLJ}ut7YwLo(E=#WX)G|k-TJ##}I^t## z@*-m@rS|Ce|DHI~7SHAQ2J5d&-G=HI%M=t9dNU$?3R65e6Q_>m?4j>B>;9WQ@0`^c z@>m~T9tq%cuYa`_DgJSUtzUt2Q_+{nmiZhbO5`==YU}jA+l|dSQ7(|gwQ@NKKzo(G+L*6PzH~*?~0D!{*3yS$Af{*x;9a6|(rkpL#cU-Y6P+ZCZ7y@p>K~AJMog zbbWiOb0@*3@Jk)x(CqS`Y06FNw5;Fad9&4hc6;eI8SZuT_01cVyoqJ|CYBP+AO)S$ZGgN?~M{S?V`(9{6y8)uO^OGdi$+y%y|4P zg1gC$cWUVP13+b;W9up0m!gaBLDUf7St+^U^+=+Tyb5VjaOTu9mcLpKVsnhz&%X*w85B}&ld zPGj}O)hfl-&|G0x-SnjvnIembruL{`$o?{xr4!pe_Jt$B=7-tdtK_Ws0qyiHkTRa4 zNafFT0?Ysoi9{Ctt&t=sliQy9Hk^c-U1cmR$+|bn!`?ZaOvnI01l3kvSJo;!0*R~S zYo=j#y9!whF2k~ju0D#uNQpo`Iw__f80t|e$J{|DrQ$P##IWZ~Nr828`%hzRIwre9 zMox@yPe42WMR>i!{dnNC{ya(m-&deF%>S%}Sc4NabTem$3g#OZf#QAl4nLw2xN~`; z68^=h@f`abECL*XgTO_{pTYyZHRZT%L`nw+JCsCWN`jVaRWa9r(2Ty`Tf;uFBr6f~tQH^q`bg|=bZ}&$az&G(X9plSQjR9UX%(E-S+-W80$E2C^yy(fN|q;@ zSOFO=GCcDzhq%L!fNF)Evw0RBl3LO6=7$i~Uw5hN4#kNuq%$R$5Ur z9Z|DmML04@QfsiOnXIeB1>Ysg+3y}CUsa))I&`DmElc?5_~RvHOP$rUDW(}Ns}=Ay zO1Vj5l*1Y=Oz#>jp5}?e=YV=dF#=2d3im;X1~|fO(jZ)KC%#a4P>v2aKnA2XfC!#wJ(dBVLnmb)L-Thf* zr;!bpZ>3}9NmJauM8;Qv(+;l>4nIH~z}+DTpu_I@Bz93aRe?R*Yyu}~(s2nEE~cg| zxpA<=^zl(ohs8(;!G_n z%9l4A4Y;bfd)9ORKapM8e=zZdu?*4k&H5%NAMdCk5~#>r&WRGd8!jwVJmkl(46v9P zhBMP%ST|LXwL+V~%;{t`6G?W}GZsD5ppc3y^sbo4&mO0VUCYzW(vj(G52-Xg%9-n} zEd5k8Q=sZ7N%~o3*^4#3kKd3vTNqDF<32%h?L$BVN2LUv-0V!@K1nHe+-0m>cq`n$ zp&LalQj8Diba@r>?7OR_+Q#2J_o`Pk9YoceC^lPP+|=1w6sz$ZHk=Kfv9jMg)K4|_ zt6^xjjf0FI$%P4qhBGuCexzVgn>~x1$NmpF7vpYtC@jY6)laYUomRS%l&|EA zjU1P&oDSJ1B;{%vs_;qavjeZ0bG>FRYfVTx-+mbB?X}~yV2ctIBN~l1oHq!|-jLJy zF-Ds3BVzDQ>XrQi6&{u{w^!ErwUruaJ5;{hc%(~T;Hz61z7LWlY2Tt+yYw1a&yFzd zLmI5_s*ZeOMQ7i_R&}=|MLTOVE20miT=5a?VRmVhx9Sb)k`5ejkLpYq7KN(b4bgK= z7Dy++c&GP{ImEG;jvCTgk{);v?3OGijS^lWufH{r=^I_1Su|POev4Df-h7{OlmT`; zuORmc<;;NPzKHgVRIetB6Bx0Qt=*n){kD#T<&t_~{l90PHAXv~lp64Bj)IslZ}){) z39`MP1An=NufXi`Jm2VfrSJX!5OW>;A&(fRh7eTK`@SeKucy>H%O^VKwq(J5LU^M= zhP!O@$sTR=9HTLBw?2Qf{WfA`qQeIH>$HuiMJ>ui$kf(wrI8*ACfCT!Wx(o!`i@^C zl*n7wJFIU=o*zyFl32cVQWsi`3mkuVujhc1`^|DrsCyON*F})z9?y$#v!%TKT|-eK08edoFB*vKVpGYdfH8vIyQ{tzFiu1x@&+w zAo0))o@u!Dao`{Br)|Q8cdnnwn>E?FIGKnVedZqC%BiWg6|(4xV~28%T~abO>ihh! zpAd*`7OIvO{n?o10d*79qr|>tii}7gjbI~1bGboDEWqXm2~5p)vnOjTh_jw&Qz1ARsBpXYmM}XjhF~=t^v(+*Fn{!$}@+R$Tn*z`y`T7qiEwMSa;QGkDOl`dc5(bJeaiu86IHYunH_GDuLq*{KfQNPw6ug1@+Z9Fl9xl^v z2qrk-&7xXsRY^s~KO%DQ_H0(P147k#5k4X+ZP7MQ=13|tG*7#zqsqCZe6oUVc!}w0 zO?xf4IPhb<4Yc2~iFf)U(y)uH0$4y{>bU;$7^Rt{ouJL~&Zq0od!s*Pat%y^8EEqC zO$3J1rqK>q!S;OedaPhhn9Dy_i>!8S;79@0ehyO-koX4GsA60MiVFz|5U8#M&Jb6Jd1*Yt$W2fGRVp@Jl7htEDq$xdw{>j>CTnqG>Eq*>F;d zzK|zVDH{%}iB@;OUQvQ8-B6Ke0nstu2mG-H=%WyCft-dLvN^5;(-faD$d1|#W)wqU zJu%2ou{RVWICd|C3qS=MQ95O%03Hl+!;1u-Cxyry&DxWS9>4PVYPQ!yF`ZU{(e`o4yI5J@SM!VzZQJDwH ztPTmnHNf#%1PNPAAc1Qk3QmT5v|1!VQW}}$!6FVJVZ(eJ)M=1MK=u;Kqm$HMbxV|# z=o;%F${IPxYAN;*OBCD6kpwB`-ciXfN>WpENcF}a1N^|tVL`)-f9F_fw+;C6_k{=- zEw^uO=z<4Rl^_}A<|La z$0f)j{C5^Wu)*-q4d-@PT$GWC4&Ec#(U+&&{l6)-_#mhBGw zEf6gN&F`25@nT`~IJhhY2gD}QyciCM(eMpBc?dZUwmrwUY5qB7)Akd5d@3#jnRnb1V=FeYYvl}G@$F$M18Vi0j8vj}_#gz5AeX2=7;Oxqog zfE(o-mqQ6nO6l%zMhC5P!C}Ue93&-G*TCITX92uy_|zCc;kiz~cb-qnTu1hU&yb9B zP5&5uYkBJs6J)fgf17aTwUlx8wRnAGwBq*VS9>Za`y&)qF5MaoD+_Hf`XlFt@KVMa zwKLjLt{T+N7cb6K?o#~=lEK)|agroGS^W4}h1Yxe`UCLC32%}2X=9$-SpQuIjoCuV zo;khU>;Jt*;IpGIYjV{Arm3n~rA?y#^);-ANi9VAIa8{ogO%;ckJL9tmLJu-9@_o# z*4W52NjdA=m5@W{&PG18-}XP`>J80gwjBRM^2v3Aektaj87dcA*x&V-2-3De=08tr52$?SF%JE+Oo^C~DLkM}xAZ*#%M)E1@~Am&_8) zZd_$YL#^}rhaVM;@>Q`pPqMZJluY8V0LCtV@Ba2JNf0dw5#Q5T{4MB)Gb1C#Lt~-n$tA`vwwlGh z`$y!Q3uo2b-e}(PJpSP7tCxbkwr=t2qrI(}rf+*i_k(KbmkPc}a-B6|o{rxPjDDw_ zpOIGbbdeiILChCcGd9O=m}q$IQVXlpfjNy5)0Ry z01=sQX>03droLpRS2LaUZ9-Tr>T1XRXnB1XRdmxXBwI8d8tH^p7<%uP!i~LS-=op` z!H%GCPP#@z>ryqQ!l!-GVvP)K5&uYmJ=dX)Z4Z%Ai|0FcRqXcc>io4YZ8$*kQe=Q#j5ev^y^n|oor8? z|7V{hhai#CkXe#fn4jAOBy*Y67M8CE9FD~3*b@ud6R zBH58A%FfrjDUZF)(L?)V`l5exaBHy0IhQbr^iH>EI@zK#^Y*nRhpJo^`Gsp{mFe}? zm?r6zn)c}3n|t*xYN&l|Zh@KxKKQ#>_8aEbq0*c#qp^Zuoh22UVD(zo)9ww}W;;n7;5eMmAu&xU=A#s~s*ci?`9lZjvEd!BY$H`PpDF)+$PT zL&KR15k)v5q``3nPF^^E*t%hX0+~#O6m#>Oimt6KU9APa3mv@96Z^G)t5FTiyKCtO zmT9IA7+ik@QH!mgr>-vH#e`9~G)7_A{}+QOQZ7Ue34jrmwT0jZj2aibQDPDK7)%g( znws&0!HDda^3_(oD;{4YgVtur0%%Tm|1dWw>O%Qj+S$Y*bWdH$a??= zSVg0TPMAq@6r)Pwv*%a_);3%WOyKR^_?L|kB?YGBkOwPunpm2ubCZgJF+FD9O+{|t zEJEDK4bTkGg`zx=6vhyv5~8_190RnnfA6eDmt$Ldx$o&ejP0iGaZPzNSRa?rY5r3s z5}tMZ6H<5$vLhB!*&!K4u+@j`YI2uBHFgSb8^H=Y2^((z&}!G+2bKy_4}_C(;GEz{ z@Gw7q2_X{@xJK+u7UQ-=NR(#D$ng#|`z3?KWmdq1m)D@@Mfd-@D$Ej#kSK3X`F~O_ ztdUu^Z&27o)1sOg5v`YM-1ChBspATklsSFjh;LW)R zihw0~*~B?hc?O?r*$cl?l!Cb!1s5?*c{Ig|@tB>J--Dch{PBsN1rY2>(GUpjp1LVR zcsX#1X2&c?fNr%>dquiN8#D?q7Y^G7y1z&QhgRdDajh)?@x}N-Pp!BDYx?3e z5rts6rY%t{;FF;Fnrt#sTqmP2OCgflA(oTvuLylHEg{aSZ+8T?D?o@t!?METsX&Z) zT7o5{swf|U;^QU+?v7(qqXPL4kiL*$mLv$^7LMu(&O%nyHhg4{QW3o#1kIwZV~`c; zXLE29|3mUv_#=%-I&ir_4r8Z@5}HEfL5e6SGRSm_l#>a4GPIol5Wa$b27wRb;mBwQ z87dMFFKzd}Zl`vorr2%10*PhS3&iMg22mf_b|F$u%Hj|gp{pt+ z#!F3FS5N%FB7s<%j0J|T4luN$n^bj;T20O89NkXuOy#%6hmUTptXfywvSLvhlD*?# z!E2|lZYM^B+iXwj=wEU?s_E8d6Pz>1?DzXrp{2cWNy)_mGxu%yFnVL>GqPxnY6+%- zm!a^iMr-YGbuLr3m+N1rPkNn>9~7cz4lj(_H%&(sdNd6%dw2WaJl8pA7Lz3NJ5l~( z-yX{yXTD1JzxfY&q1R;8DXXFOl(>nqc)4$@!5&@TFkANo&s<*j^W!&Ykl21V5#O#tmgFjhsqzs4!W1_KdPC^R2?|q75G>{3NY$EG`-xRw@v4& z?6+)pkA2wblH1T1ab4pGtB*CeU)fQgI(jar_&|gh z-E!Icy&(`psKzf2q}trpsYZdn2h}M@@;+qYIaE<-&As?$I>3^~X^ms!zeefR~l$7H#6L2&Q5Eh-aS_ zwRaGAj@?iuvS-m^-3#Yhw00jz*wZu8+o3l)ZXwn9t8h<|w9Q*pB|N#^`!;^O(g&}( z=b+XFVi_g&3azi27yMSC%qDD(d+6f%ScL&6>}T8X^D!2$pY!B0iyD<4Y8a1nofJ2w zJ@b5f&@9!f^)0XdacrLt_nvRae?!igja}7PL&KT=Q_HgDDck1nGcsl0CcZgXhgzm* zylT-o&&j>=^;16Ww)XY#>jN9K&P=Pz=Y6jgz31%riOqxF%^ep{Em~3jN@oA>V|@pI z^)L2|_ER|;@AI&J&kK>$YyZWah`h~IN=W=FksYZWv z8A>L^syn+Q4_BY!CYld%4SbzKGk^altisP+>(1VuQF{fm@axGNFMjTGrp%PbYOnj} zLSNkMXhG4GhmV1$;-jv-5s#?bC4m;*>mGTeXjp#m>k1~2HVKkU;)QA9((~#Uz=&P! z!n>ds7^gvv<^^dmDzu`nvH}0uin%YaH-2?PByZZFuORujD=Z3jta|5@(duD%F@DW2 z8xd>#qj0@vp07igKAr?hp1oRETam8@MHuB6EqXc|sgG-HxZJHBeQHn72cgEM{P!V5 z*4vn@q9whQyGOItsUb)E^@WG}I^Eju6)sFK&E(2yJT*j?x=tReZP--s$Bje%Q|>J{ zO}3sm{`|Z?4Y(KsG;{eNPiOg5ZX6}HF4sJC{XfhtGYWU~ZgDzYAKc&n*t%%VU22SL zH*&;MU0*P_AIB5E-@W<8^;1EtbuN3fA6{7VA?ldgecs-R#Im<;;YxYiTmC&!Ccn0A z%}R`7G3wG&8gXEjaq$M`Pz*+=_~^=@%20txKi)vVFnTB3{obe!rM}XicJwm$k0Qm* zyFWO!ZZ&hhC5?RifkG~4!U4l_f|!Cn6L6|%*rVG}zCvWQ89^4oh_=oT z@qk#JyCs=$?x(kG<~fohK#5RAANEy?;JR$1XCCS4KsWFMr7QGk=zl~AHs z0Ms{E*r7=zbGbho0eavH4|HWV3-9%mtb&Ef>!Sp&>4V}3LSR?KAsLLA1q6XB07jBY zufr(%Nt6}`Apl8Bif{@Xk`3S9h`e+`;+S0#xYXd642&jI!k1udtLgr;SxfRL8dn7! zxxMinwH2fYh~aPn(Q1efGJkkzMG51-@k((8$@a!>q?JSBIe*Jh6lO%f+u9HF~RrZ#XP&|$uw@t zqL8I)32q8wmbv$898=+~u?s1hN3({+gyI1>PS~t~R=22;WM^AVvku^Lk5+aB%Fc*< zBPXkY{wC`+P#zpFmZ*VI%QHx(5?y3jg95l$1Rw7zMIf85l*Lm~h0ta*4;BT`7h;Ll zMd0W#ibcvQR&$^`JOBfBCXz?@=)Z|z>afBQxF|scIun!QoUG)fuG))O>X>?>b?E4c z>6vOg3RG-K%M1)TOq++@(u~%0x`}A-MhhgZy%>rWOgQbIYQI^3HoNl@T}F?cG3WkT zS;uWHss}8gYU!$dr&pFz1L>%T;ZRxhqTBa6>-Jj60#YFW|C+_e2uoAR1lW-WQMjhb z6iDdJbucV2@1^Z2c)ZX-0d6VC_|k|1SV$ z)oo%zaqQE87^@${!4YKwo#8bc>^$E=RfvOBP#5?sKFeER6v-Lz;y(&!YQR*p)`Nx) zbe`o1{LZ1%*5?Lm5jHC=7ofcIm2J~WDL^Y2&{Bd3?36z2|3Rs+A#oIORczyf+szkf z*N6eQg(JVeQ7;Dq0}Os`!eDVz1Q=fWy!(`0uBk(7y1kgC@nM{g0$Ujd7<=OknIwLF z8hBG2-H2S^`tJoX`mYw14cwCwgC1k2g*rR;ZSDp$E zLcIz}xv1GHmvYq0VbK-LwVS9w({Vwg##f1o67*2z(ZPSzVNme;A)JYUB#iR{t1A`) z?wWg0D6%iIGKfN1;`lmD93NBY#bV4dOi*3TRJf0x_Crt-WaYSocZ4ai1ATE<1px5C zIO7^V@gEVZYYXXdLjysHqv;1$i`2jn%pw?;ZnP=D-Hu44=qY#)%?Sh6O~a*lh93Y$ zKBGQ59Uvh@&|UZ{Y|nqME5CLVikw27XGtpskT_##%b=AO!7NP*fZx449rgDC*f%4_ zFxMw9OGK;V0EElcfgUhK&OdO`L40^kHGP3&yQ9$y+7(SK93v@Y(-|(@*I0E zyi3{`f?t1QTykrFl2Z4!!umPS&a)l?!G`#ip+?!k+mVin%=bKoLyB>B;W70ZUeom; zIeKer->F7e8n=5mHHQQ)PGqil1#Rh^J%Z|r5b0>)XiW#!E^GHe zJGQYJ$LuM6tx{V0r;4TF=hEp0+OxLV*S3!Fo=pbEbYm8iIuTzSe;luS#+T!od!!%H zWTpo$7@V3UO<`9&XAIicYCTj|exUqxpyY-(4JqaK<`m{yi}l(Z_SIcC-)usdUh&Y& zqwiOrxcP^n;kwPZ9h%j8A$>LnPMo{b)YE&^H|^|($mHLdST5~M*d5Bj7n5VQ z-bm!>?WJkw%2b6sRq+B?+N7}`K6%BYAFKjnJR*2=y)p|x*EYP7q8!Q=2UpAXoY zAxc(axW0jh_@Mkf8{s{F&c5F|RL(U=`0u(iIQK`bU2@OLkY8Kq_qD;8%xnl0HXJk9 zXqqQ3Px(i=-UllVJ)EntD3aBufSpopH1eA0#N5)Ai=~{9KTvg_Py;55 z2lb8L?|-1twInGsUWw8~Gi_!W?U}pIj_*?KQ`9-X$Ea-ct`qSQvKG|=herR-i2W9^I zf$L`ZzQx)ogPSXt?6ZtF-m5z4aPuz_#zNL|R@mnon{{UBto7k7e!`uktFo3ecSak^ z90&GasZ~heW{%cZfAi{-;Xb@ApFEsw_A}XXvE9{C(e+brFhl-w=w*6f7iDVr&ZuT+ zj-lv&%|za?VC**O>cXT5z6E z<*4Kkke5dV=gQ|Al zE?t^Y#|#CCD>uk*{ucCS>+b^HxZ~cktB&;dMW?XF^e2_gfw-ht&7j zu2a9cILX#%Y@5E2u>PD$6>_q(w&iu;b(V4~X8msJCn2UFEfo3V$Q|2%OXLbtrys2s zg^A3EQ|v>IZ{$vWFhvSKd1sgh9Z%@Yyx_e-lz?%?{d05sC)!HU63TAH&V3>}(Ri=H z(cHt>pA2f~`rfH;pB=mHvV87oN|OzKI=0f5-x!UM_I(K|Fx2?*8&CA?QnYJiR!aSf zPltwcfz_3J1TJ&+3TbAtWj0tjMdcT2&hxF0$$@%z&e_}ynE0ccdQ9z#>&3It3!Az# zPWS+$iSywUk!QH)Q|kRX4c?{^bDd}X=o(dv#9imAFiDnMOPSB)+f?kcG!ldo`@_k< z=e*3!5zMjv(S~!>F^Pntx;ic6gw@I5<4GMLgs8NVa?4kiCBGnUr~pGTddgX{d9xdu zV#P(G3S%WWfM>xx)OUI6T0Aa2AQ)t2hr7x03J9D5K)SXKj=fyy&8yfbKW#>gDmwzm zNe`TRF$jbz@W*BZ5^cpgbl^+Cd0zeo|Ip+m8oRZej|ULM+D{UmJbDdZ8)5|MAGihv zi9B@$K140s_)UMOlZg{xXAH_>N^;y_flIfFtxQSnbJ8c91Xy{lCj#{#YX~Wy@D&`Se}IouW3}5x zun8;$Z6k?7BY%~%FnLMo_@qdVB@JsvT9zq6)dKbpIvr>1f_a)O=H)<4f`@_~_y|T! zuuF#Af0`u>%T!_(JkhHC6)^3(%0rp)XdcgnMD2xfu_mS~B1lPO%tB3G(oSVi>lLqt z%UVNV7;wXuz)NcHS&`~OO628M`+7>)R^33^eqfztOdB+52L^(H7a8!DTSh0>Y($4YMGO{@&r+IAu9dgq2xLElU^Zw%8W>% z&jHiaDAWGo1FN$E4!8OrB{^+LNqp5zV01t&3;h-3S7frr6okSbQ@1aWN_ac@a~z3{ zl#?tZVpw?hC8TOxU}_|38e1&>-Oy(kCOYDT(0?{*e?nU2QgzJN4=>egU}gHf;@wK*OWc#WnT&d|GBc0 zoI&~on|m%A<;`g%W4-y8VNs7D!2%Y}#HiFMD1{r0OXEleH8meJBkfByO7AAt`IVG3 zM@O*F#Qe);y%NgRqakJ>`>drFhc35+@HbJ@4WUE%bA=1OFIwaqI!X%;r8f~H1HlOX zS3mTFRBj3!x`ZN9%$zqmZ^6?7`}3$Q9Qu^t^o-N3q#-2l3kpWpIsXkHvkc@T9mTOV zs@IGe&(Y1CA}dTn8{lj&X6-jGmhMa%ngk8XGX9_ zXFj#*9E3FF(GV*^fuV$RUs+64z2<^&@uy@EBiJBh#S92^VVsQLo{uQ})d+cVlFoN< ztyN&`ie!*>nAX!m`Q%7QcEA)FtS<1Dg1qj_EIR7cWx96DPjBKRM0*)XG6SJ3vgD+T zZ2gASghv+aiTWVU#Fp3+HG$g_+<+K#@Xoaq z!bc4c3n3#@0(G^oM@JxJZNFNki$L+`mn59y%`&<$6b}GPUN3MTtJNN0g*f$GFajvZ84 zRyF$8qF25xIp@J~HPv*}3Z_-qx|lU(ul~zjFK>JG)Lt?a(3&>9+Wm{-*}rD4UcORZ zOXLvrpQ_FDopp*9hxT4x0pw`nZ<`&{H)s-0Xk>l|mUV5X8|lJAEXAb1p(@a~cWBEk z-JlVji}M}Z9XoT{;;#LANpEbqCnA03^-W`C-_(9s$ZXPI$OXp@OX zwM^b$>8kuo<;nGw4M}WDcEs#KgWvWNG&fDUZ_AvX&YAPQ5z-s^9QTXm!aTQEx#o~P z_N4Mic3b(O3ljx}ma~${vxK#JOln?sMVS81y^AL(Q|m5oxNsqLe{s2h-5<)CSdmG$W(>0VR=3$)%N_ zESI7DH`v554dQC#37%f_^5p*1F~BYan8D{+Qx0~_x#v)Dg_|(=%wBz>8N%#dV52r3 zVtxKAK*9NE{yQS8Y<3JMtBsoHlv3ZdU*O`|Z)J8FQE5(vF-4KqV%J!udPKEHzp6qn z)ktKKWy;=Iw}UixvT1$~?$ot23pTfm<>a4r(SjO<%CiQES3jX;9rbmd)x9&wNSSX0 zB9(e>=&7nWvhqFVoa?Bm<=@J0`$?WwxAsvK%C=td=^bd89v!*=cT;#(5UUS{Zogf> zTpGM*bJvbz5py}W*QLffh8OMkHM^j(?l?6oCDP&0f`004)tI(%-JzrVrkm2j{ixAz zeMP?&)nR+XCpB$nTZ^_1ES_sNwN9`XZw{|ds^`3VVMee6v zWbOBOdkhtl;-8SU&bR0@Yk1Dr2?w+FH$fq>;^Cf(4R?k<6$*)t4)0oz2P_H$0uGGb z8h(*v^+fM#%r9Tf^mSsMYB$xXsOJ1(`w{!zX7F`W;k&56tUpE8*YhR<)*s@>*gXzD#$@u&A?0Ns;deDG3g<@<- zM@u_h54H0KFeVHO#EbdHDz!z z11|idlX8^&m{xHqVu}*206!4l4GYX5Hl$mW%=Y}Fu!1~*o*zP zmbFa-Gt^cy>l-Tjikir{)P%xU-dEYscK6R>=##$l#9t$6r~e} zg)6`8^hgojFzYz1OP$r28m`f}ILz^L8|ggJ-|SKDv2?BFFwt6(#E$!v!x&gg`^f3w zWg43gI=%S1wbaZ`#{pxPa4Me^Il)C^vOAMl>pGKCH6U^T$S8m4|GcBWX9&3%yjykE3{@@B`&MI|5@Q<-lK)A{3CN z6d@A{RexK+sYzfTY*cEmUXDb<%6=V0O6W!k61%L#w|s&cRo7-291V>K4CN8H2s9g& zNcs&#uoDJsrG@p`9tO4P@+S^!`!cc_m=dv?PIagNo5JG~mMstEtS1<=i}7Ad#BTY$ zP6koeS%!^t6S&UISu$M2kU_?ajCXc$O*_!6sO)$NiftdiL{`~yWYu1VASjR=@Mz)F zLwre0KjWF*tac5!_C!DPk@V5a{BSJgaR74SOC?tlQ*@q|A)Oekmvi9T&XL#oNhl`9 zEX^dxDGXHeU3fBNv(yrmEeDdxLe1Is$Nc zNI!#0${a+2O-$A)KGy;AIJcWU?6NL1C0LDBRNpYTXpvLU0<`Qv2a%*y@a3|=qOFs! zqAQV`OyYlHAwP`jDa?6}jIEK0CL6COlBLrkDUhcy$_eCre2L*rB_iek$~&J`vkTWW$!f^PgOW?5gt3g4|9q#BMjg%6y=a!T_(6gSVVw~d4HBr zfHIQtN^Z6JxD2rb90)Npxnt6h93I8FMr(trp}!1Rv_fU7~3A#P*@1aSo~I8l*d z$cMHUyoiHnC832+Dth{Uu+k}T(gSY>6;4vC4wHCjZ2UiC$hIX%eW30D7$@^8gEBQQgv!Z` z7p6jy-8dRESWA;sZN9++e>u@khNM8{N(Dsl(rn0NBZkfzAqgBsa56v(RFBn5plAlp zZj|{ldCGi#_eJ173n<{S=;+`xpnwcndlwow;3@~14Zy2B1xw0I{Xt5~xvdN^o3$Vb zIMARS!I*K7g+vO7?>IOLXw6(OftSAiUR?3Q98!~sB$emZ0CEzdA zxL8(GPUf`l8&UnITpGnPJik6sG=FlRU1*$w9-g2yAeWwYY(6F)kBr#j?Bh}y46k`8)};!m=F+)J2h z86}oK@Cz0X+76Ws@5_~Fn82cE28<9mra*H88Ae!cKV{es46S8>?1 zD+d*;j1#Hpgq~drg_2kELk*^#0r;JNcm{uiLerd@w&?}jsL+~zi!a^bUAiFiRV-AS zO$A?ZUQy6#RqiJArm(ASjdImS37V0pkS?35BD!<*+kawxjIP8~HJ%C?K#mkM_?44? z-tDh7x0&9Nbvs-$!r$Gv{6pTE4BovH=SrS1uh8Y*jNh+?T8pla4tpHS4T%d^e@n`{ zWtgoV2W?_vJFVp0=062J3-Bd%Z4zf3lnf?3;?mb{E1wwDw#o64(@Ll|t4LzA#&e#r z!hYL>Enp8D7?0%@pF1CBRCHp?gYQ2bj{JG!b#q)k&f`VhFVy0=KFo!I%I%P$&-?A{ zL!-FcIpTHcA0{8K>ut#abrqZQ!DHL});@2$%6rpq);#)+nH76nF{_i{uA7n=q!GnB zFjimsZ-D3JKGo9>mz5G5m11K8X%yrKOX?eWzpy2moLJWL`{@Ip*qEl-j%|e-Sx*b+ zVyOF<;3%{mH(F$|E&C!OxOQIqO znp+%)Jf-3X9)*RrzpUR{z>zlek2S{o)hD;qzdu`lk2U!FMU-OKY@Nrm!uH1slW+Dt zzMY26IlRNOL1*H9dk!XNwh&s%-40nE+S}G^;rZE&;C+2}Mdwvz$Fgi~J>gle1(kus zmi>#p33m%GwG@jON@8JujYp){n!C|=%Bht%#-eAP31K?P;S;}W2gU#L;vn_FO!}?q zFeEr7Axfyz5Ymt6wOVV3%kJ)6xB2(8Sna4Zmx0&XUz zx_yX}FfWDam8*pOSrvx>z*ng3`&{SQ;L?}-3IV$p=E5t}w9aiEBqb11Z|tYb2AV_{ z$ifG@i`inXw1F09TfSoDyj9J;1(j3SOUL?pB=*z8m7}XYE^iKaO;_jgFLJsDzeWne z)fYng=o5PQ7P?)u8+z@{EOXec=rg0Nlb}{0YDfZ(rq3}tot8e7GsX`m0 z9Z|}m-tkMzjWZ#JW^;e`e8^k*iy5Kh{GaPE={x3y={?4&?up26el1tF71AZDCyxH; z;O{=L`R{u%+r67b_sG~>GLcA}X*4|P^7K>m-ENyF#0l)vMY5P$e# zK;Fd~rGQ$-pmh9bfwEU@cL&-z7wOwu&ZFzpQ&#yAy-zPh>;XAj?xmw)uN+Ap zV8vkMjm}2m5`9^$N-*pxL9*zp_70VI<%hQg>n?d>a-fjbDhon*doeXE?h97|pPm34 z>jPjRz(eB`u;?`@k{HwMkg|e)k{n{Mg1iPHF>Hl0lb_iPKY%Oe@$GrsSAbmIyYd}w ztq5dh0NjNm$Y*?d;e`P9be%}qNZ^##i&0KS?7+YY)4|usioTwY)ibDG{i^s!WDF@& zsNY@7^is+-T$a-Iz-6j4K}{Z}-j%FJd~YOuI5Tx+ZzIR3Ri6DMSGS zZJ__NjC&T$9E;`e+zW7xH1a+T&Z^y`m4=-Ke%YXpXIB<;1Zfk6lw)aJBmoxt+q^I;V~Ti~ zt<9UN^E==9VUoood146 zc$QKtQm)Ytz-u^$keKeNNF4J?I#KzlGv&#$AP%$EquRw-RFDbnZ(3_TB$`bP+N2^3 z1|<9aP-ur~V!q*4!N_MPd{~iR# zL}U6LqN+11Zvy=Jr5|^#hn5q@7jt5sk8)%o6%0Cnb`dhN9~zaRa-~HLyBB~Wau|4p zag|>hbki|~B6Rm(;PuTOPN~OkL_0wqjP(KBOM4ENp>L_DahS7Z@??Uq01z} z4zR`{AC@6;hgis%>?>h40MPFNkwWm+5>`3#14Hc({bVd3Gn?Fr2M+R(kXwwR~C zg-}pJI8uH|0O<+Ggm!rNZ4&;0gyV=!hY1&OEIGJ0ATi0bouzYjbHKu%ls9hEV(T>B`#{A6DF^ zhO?Lchx{qpL5kEDU#A|J72ywt?=`+e|IzY_=oG)?(UavRr=Uzm70>?hMSaEIWL=dZ z5}s!}`rNAh!;i`(vPXzrlEeCup4jC4&t5u4AKY-p6YW|N3ur6CS$f`+R>St>UOGOL zcI{WkT`j+`{UI~Y=O_?dTU+U=56%iNE^xNylcU0v3qk!%fjlEo|8MbFlY-C zrE7E;4^bO-+Y6_BO_ZGHU9HnH?9T)eFiooYC|db!A#d^?`PnbUr=IC5Xei|>b>Z>^ z@m_1Znp4v%6-IQ=-8;VCdnawqT-PnR`d;Zlz2~LZQDdX$4E9!h{+rfxBVD(9eyztt zBk}mHv5RSlbh?7Wcy^Anc>%;v!LtH5Y+aV8hPnyNo3BCx$uRGj%dHKP2LN*#?J(;($e2Q zo}7C(aWywGyCAzW=|tDgt09$-EhMwz;ooX2>9gluEK9Cxes!5Hyi>eu_xyB@=-*P$ z`H$WkKK_A9I{7b8#2}ve+c3izyHl4N@K~=@di%0j()4Uv*?jOnS5&)j#s(6z0QGa_ zCue12O@nJz0;rqTHqt1cnsb(7W(4bhu1Ai%JI4{tf3{mN9&7Z^9Q5qW$&0gjQ|5Y* z5p?B7}2>8H1ke@^V$x%SaEM^nL*J>TVCSgfzC3Hz&9Lw#c3hj%oeiXxO-LwyDZiGl^M(1n|inMVogj3Gf3e5>=)91KFEa)(_4aHK6t= zX0&B_QbKOpdKLJ#7k%k5@>y<($U)tBORZ>IAkTPa?KLc?3U|0y#2wtkQoH-Dcw6Pd z!$z&CuKVFzpS4+4JDJBuuA^WC@#3B2pDm?r{DGjbzYh~e`#h`cC*=VA)>fsSXfcPr zemodeUUpw=uym7BM>drt_`m7a_StT_dVlgiT4b{y&lSrHY+kMRQ&>?JKGFWI|4cyT zhOD>w;rnf<_b0Qj{99;@&56S;2GWBkpH5s*Q6J(ez%9>CRGm)S`%vn+x?vV6NK{Ip zx)qmKq-F~83O?BT$J-l!LmFoFDIuI+XCEI zurWthH5r!SLsf^ky;?9N58DEjIEu_X1|(yfk*AI&PalAj5lVEi!jBRR#KVdZC>fT$ z9>=IG7>}j~+=H0?L2vM3xX;2Yl|BvOr2ihS*06b6a?+t_fX*Y@!E`$Nu2v}gI;J8> z6p5>D2}u;N2-Zi_y6V`fI3w7#b-38~0cJ zvUN2^XkV0@q1HKMm}ECDc!B(;=N1E-?8@p@QdPxsr?#`NWw)j++*tO$sDNsPi$F zFau2#Nz|Vd-zM)(bLq64$X5aY2%vQHQ6s>nb@VD={0}io=e10ImfWyrk+d&j_0~_CMr4N8c_|8s_#4jwpl}RFfP{3shM^ zdaHDt%k0rjiFQDNme61{a-BJ*Xjbby#A+BA^@sfK?ojfsuVP zLU|ZY_d#k62e4k0xfjN%entr4T~yseA+sAg689UIYs(|=h7bm%NkQmFab6qpG}Uz( zDitH(wi3xhuQOVmQ^I5EJ!WVegXh`QR@-O3B1Kx%On~aVw;ZCIU*ADWjc&RkHGkts zOPVP|Nsq8ZU|$BvB61c6W!wS>MGco>Akn7qy~G4p|euC#4E_ zT?TYogF-CF{$7td)`*xwE^`silS__<-kcE@v|N7$bdF>Q056UlNKv3|UOF1+K?4iJ zutQTDlauU=^plY~aT#6hy)WSRak9UlT`bnvZ%rQiaZf-8soSHBVP^`2UxqkD_aPiGAu z>QnMe-7xNM-W_!z_g?aZ(?apW7g^^$7dMK-vE>VsYYecoU)r=9wCRjSVcWOqnbdn0 z5$332+w%Fk(0gG+6l^|TI%mdl+>!r;6LFlIill4~~_3m@3$&P0$c38FiHu>z@zw?+%Wy;Y0hD1ZW z;h4Sh48treApK?sHF&23S2au)+%eUWaCpL$Ztaqol-O^)w%A&9+~nuOrszjE2^+Sr zclai}^FF%W5&6q(Q!E8n<-mWYSh#MW)255{>gNdYfi-3~REONx=DFAyPvEPIBU25wE%r<^X&`%6{clw zzlBJ;)#@kNx|wppbN~EVe?25*?e}$rP~UGGuU1alEc(qw-3jX$eHBKi@l)$AFBiUX zGB5e|Na32b^*h<}IZI!gTn|r0h^~ylkPQBJ@ zXKttL&Feqj1p56C@!QN(1{bV}yLQ0JABuQ;K~Bk=6M@gf#8=CAHzeV(J3LEuKE|T= z8XHzgBLme?1wOcPSSHEtRrKyGblmF6wdwabol6T3omNBo5kfzITeCBDx?EY<_2-f9TxS{K1^J z=WaTRJQZ@b7If=0KcMn7O^2LCTj82?b$~>?a2ClzZGg=I+CBM_TBfrGYD-PUe_RQ4ddKMz|ZI zEXxI3Y=7nzSnkJb6o>hDY7N@YUlo~)Psgu46-z~pAjvyq7N;#@=Z;#i-ha5>pnJZ` zP$%nZ!k(!|kDTy_!U@ckMqhI2in5?3tL0Z^m+-SieeN&3Z5q{>G0!u$(UP>F-!w?Z z#05cNQ`8jJK4+AUV!wobq+z~MS0(TX++Yo=1%h4LiDW!kPs&@53zXMqf8}9PykU|5 zT0ycC7-wx~>&Qf(1urNebPoFq;13A0&;en624IecLA5gCe3hXgYd+hEFpR+vrz%thySy`7ma4a zmIjsE-->nyMRdIfc0| zvp-5yFvBkEbHvGe8#NIJ_Dm)>{e*{e)7b}&7?|1Z%K$6}P^Y8@IzyYByzo{MQVHT- zAOeAV)FK4=-j$)d`@LI;zFsV}mHrg6;83ra4RofQvT7G7@nu8as^bXQl%YD}ho921 zXe>g75l0>Vh|S}Zxb0 z+h|S@wD|IJIdTYt3VM#M4C967cp=@-87c^0TT{1Q1uQH>awI4?!Gf#15_}JQh8@o< z6P(gT_ki0Qrd1l{yM`%<^Q@#A$UK|7za76^&JaezGA?uDdgqTr8p+mn1Rm}G+N zJpom`Q}FIb3e>BH=q$6SG_v|iZ93)>{NgeW3#8IzdEg$vh>Ox?pr$`caN6>jVn1RC zuEw3=KcAWpzU!ua(p$IY7V?U^vQkzVeQN{+T!^x68x)$cW`qhLpo-*w0?3~hOy=Ks zT**7w-Zu{XC?aR|q6yf3c&`Yo1_$5d+%61a|)cvvYx{Ld34R1%;Udm&Y7<}L{a zYZF5v&omIIJJcg=2bg4i{x68A4q~}k(&{K17$Y`8o^lipEkMgR_@$h}z(5ZX)*6KM zqXj8K$=6GsKX{bsm?8Y0Yuq&3{voCC_u?6z>jXXRQQ7pR_C?>xvDQ4RQ*nLsFAhH- z=ZeF&hbT3*Z9C~}w>M{$t97K0KYw*c*tIyytcC@3TQr@4Ozoy(c4;O$4f|uJczvbk zsmHIeyBxeC?`(bkEnj2g@54JHly@OH&Fuevn`^^VU!>ftHv zkGPr9_S$sU)+c{pqA$LhEmO%_pdi8Mv-Q#;18iY)v8$W$luTIdH2f$5cQ>&=+EYy{ z&VxA@9H;PR*X8Q0f*m#yF(0)wHnE;*|2eG8OGze#VaCJ53kRX;>H7Dse#-QLAuhVF zi)&BZTe+;(qbO^(ai}+m@$kX0p`g-toO3-hS+z2%I^6&IL$My7K9R-k>$qZ3;0+yr zf7IxZhkx67Pwg3%6*e}}l9OH&R&?`i%RP^XR`D!*80T?sQ2X2|v#915{54i~Cwxj~ zH8f4FlXCt{5fT&J#i4Zp&atJwNYa#MFbLX%T{T6Z#n+D`;7@ApJRWZmte5hc;=Ey zYwKxd%uP;vSAXLl6t#bz1y(#8u9c2x(XAbg#Y6jD>Py%kH1|1})JB*|-divO?w?Pr zEncs8yy|&3!M-_9VYVi&z2fZ-yTiI0cc8Mq^!o%3T`sy1vv|Nn@9}NirPjzH^`EAS z(>1bU*ww1u*%u0X8pC0HyD}Y*(vAi z)`~qTJH^qtl=yO6JShk{)U~`)JqsOrH+&1U!$S8T)HzM__0-nuw51Z)hWQy>{J6{d znxU?bk+gc;H?7q=XRp;x{X#)!EK%9YU8VQn)IhI0^4^C$NoT}2`&+o%oagjJL|``F zq0T;H;hS$e%ioE!F&wSW?8%>#^HqRYxmtLPPtdeT#RBnIGg}^acx-FFp0qO28LdT4 z^S))`WAP<}IiNLcvZ}Zi8MF0P+|}+LKVLNIzZ?5D`jxXqnlyTP?TrMthV!ZG%9Zo} zK>wz?i}OFkgjSxo_zRvemw)q=%EN@D>3vm(*0(cxpOl7uwx>NQPfyRU&rMq!&D%Ou zl2}yW10>e9AjV8YoI|dkQ1&gEsTNl8DbN)*+sae0(V#P-FZ3{v1*E1=Lr9Ntj?DZ8crI7%xM1T< zo)=ExAn@~?Qjv?zE*uqbY~S0!&GxWty^;f8kpy9F@Ffn;3!8w?&m_5^N#htfP`;`i z%VD*-B*LqJA)s;@5rprDrii0~`5fF;K4s-ONUw?eYCD7HMp2!?!HFC~J3wNQL`TQ6 zYUlA}Kf#$|jMD-|5}LotVuc$b`~=*%yjzfIP@1N~%J}kMeUU-1x-OL=IA7Cj()ZDJ z4vF9HloMHMFe}PO1Jui=zjckuf!;MJ1!%I4T7;VCMmnbbP49MSO5pso&5t+6A+TpV z(7{P$w7R`tmVyLbukwo2Y8V=3RFRI!vn6amd_YBp3)3XLNoy!3%YtV~wIFH(8g9?Exp)}eEXI7(-OJXFpq*yDF1j) z2ptTRUuj)hSux|jIk^+2|M`!fU`VtSu9R2#7(hqd4fq8*C z8Mz^Zp&p)UWy@rb6q5m}Rj-`fwl$g{*_E&KVlcpyNCLg;Y^|w4Ina#z(=*>d@>lp% z(<)(p-`<2;EZe}Mz2vH>SB_&q$P|j0i(a7oOL>xb_zyD%C;g4Hj`Cd*|KNcbnC0w=(XVW^2viJ}`-rT=+Wq!sE*_vE4PBdJn; zAhy#VjoxC5%C({?et)h`&Rf2~gl6mjTv%RFU*Bq9hEfJv*U{MrC=#(YL)K`ZtUt^L zJzf*O$U+X%%TpYX3Y?u8QEc{-lR9Ekm9=g3xaiisxTehfZYb!M(RIIu3PSTrA*x3s z1g~vGtp0*GHq%|Aa#rjvm+{gs^_HFq5x#9DYmY2XcCJe7@x2I+3>4|HM(hb)rX$}o zT&55BFnKRbu)>xMJNOOxs9{*6!T=Ci>KS+Hha>H1x}K>(*l_pKAN`wWQp~@G<7}v((r;-V6!stVjF^ zUHt$y3)l{yk_x^eGQ=_;GD4Fq9Sth~ZiA6E22+qUpRZU>a>0Zh2Gi6=Sg{*{9~%7* z7A9mw9j+FmDbJBXdpP#BC<$Idf%%BMP@n~G>>&!7^t6uws_c9!FL%sF62>fq!i^hn zntH`U#__qp3REB?dIA}S`-W3;0J_E{=wdncYXpEuYK77wj+6sZV_dI@2@9JquPZ_S2jRhsCF*v<%aY_|Pw z6H=_&OoM7#$MG*$haLZ`+TR|h?P{8Qa52bg#P`&#Jy*BixDsa<)^Kr6^l|G;CY4+F zZ(lQoxO%5Vk&l0L3w|%%e(P-4m{y2z;2c!;Uqsgq5eyQhEJ zdgy(a{SJ!=bv$?bwX(aT-33kqJ82MZ;k@#Rb&_lw(LG#7aJhbn_f}rvRn(eYN-e2& z;{~2mf;i<4IdvC{0+s#$ndnbmE|BwVGS*Eoz15vwy5%SD)=k=a1s2U;5)@`xLFd)* z0jW~)e^EhrHK%^?U~n&n>YuKJCE1rCi`1kI7C%eWfoS!wqNfPx}^ymAMeB`f~L8UxsyQJ_ubm!-yRodU0B#>DhoIV4GBAS+s}nH zD|QWHiQ1|g4Ju%y+G56@KVvQ~JK3C*-_}nKYOy!?Z^Ga30rmb=i;baHpShC7MeC$| zwL#$|>AsV%mfFd62gBp@G;2+vd z%Y;|5-^rg6^hfpYsW_ixq0PQtBE9_Ahw61)8~VORZjtvfuZcgO7gOs)#tR1qf$}wBMTcHrE$y z$`PG1<-9oq=IV>YLZ3sSce{j!d9LxkcTU!f|5Xy+M&x!H3QP>wQ_3#?`pcU2c6~T4 zTw$Q&$-F;!Zy(>6;n&UG#XtX5yhG|K-S&r^Yn`x7dB&J7dqJ_e{G{S(&2g<<#}S^x z3+ljv?Jss*g%?5)*JnE-=lqAS_*`M$0%g>5Yf% z=`ABA4MW7V{C|*~EqSeu#5q&L>Z+Rx@^Uuz$GXtNCoxMB|AK^UtnGS2~0@- z=Et?yJ#>AdjNRMna;vwfVgS4UMT+Uzx~k##T;c6uv2Rc-Kd)$;m%^&@ zm5F`wQ3{%K+hvwv<^F1{oWEx#`yJnSPiH+!sJQzNPNEw%dD7{bU}L`J*u-%>v-DLD zk>nHNNq009igQi`whUPQRLhBL?;k54O%@g(`f0#D*5O6<&o=+;;g%)LS=ii8PW$h- z@W|mKKYqNx$(i#C@bO6RV<7xHa+dPkq^Hl-t|~{s#z;Ok#zcyCPID8IKQ>CXicoPE>?(gt zx?=fw%iil&$8Qz>Qm#&yVy5EO^Gk**3-i`HTW2gfGI&s-+4IJc1NN`&1B;G^01GpN z9xw&~ACqba$<#A}96L69RbB!W^apstpeNJ@B*Mkl43w*7NP0Ppn|#RC z@VM2&DYnE+f0j&yI@ONn>oWPEI>tW{R`u|V*kD-1h_syXGh%~OOOE0rNO-IN9fh>7 zG66yleUg|Nz%uY{e2zcy0BmrcmM4#Abkp*b(5sfUuDl!gmskS`gk;6QFJOyMG0Z+jn?vJlz;0Z0s6joWjDUjk`P5dz8!RhU9Mbftvqg7U502%>#wl9-Kqtvd?TjE?aGSQ#1S*~3}wVjt% zB{-N0oIoS>{xPn`Smk>abBt1w8gvlX6d2ajlnsOgC{ZB&54kOc>McMrEcf*oi^TfM zU|iEHLhFIkmAGAm6{LX;15=hy;3Labg36YR;9i!OfW!~Zpso#c*3<)3(JbgaQ&0uO z(<>4vKVYfHIeb~oiTw$S%A9vFLTw~sIusN$sEabBtnl}YPYPC> zBF@D-I#qUn+X7z~AK)ABa_bg4c}%4v1CCJQNwA&r0-Srf0o%qJS+vc|opQ)VL?6k4 z$wI-@5jD*tMtzzQl6qO7;Qg2yb5Yt{o&K|0CQECUoUUIhB1ej8d;~jvAAy$L!S4*z zPN-Xk>JxL&o2eiC(0cHlAw+YwgJxCN!MmtG$J5kE9*xNRBt;kYVzZQuSx9w7r!wa2 zc9iskFQ#i2Fnm_duvKS~_}WxCq(45-hlNkgTbAXk_Yy<(mPM#8I2pJgG#i$Z@*57* z;aqz92=b1@Y^4#Bpn_R0fIWl?9yBClC{t^H1$`Y(UR0ib4-6$xCd011O^&mCl23rS z?iKa}Cm;}uff2Pf8{R1 z)w4~gGmeYfOjw^ zZjtMhS6S2>Uw0`;gvC5~Ul*FO^b&G~y)-xl<{YdG4$Wg%-*Qq(9;GD04&O8be$q-m z{tl-r7vprKML_{R2H*;s1x^}R1XB4(?V$24u_K%T;Khawi?$Zcc64Ljo+8?lH;z;bw7DBOiYpTI zY8_u`t-vYD90iSHYGx2!Q^^5Zwa5hp**Nc1A*D?EtRvKbje)0Q&bPXZXV4+W#;VJ zEgq*Oo?`XH#1--{q`BnOEk%3Gox?=Vp1(IoINtb>ccg`!e`?!*O{N$6>{SbFMpzfE zk9Rg?p%YtzsRyg4v!8xR=`(j=1iPtSh)A1@7ccF)EOWFwpZ>xJ84s#cF~vU&s2@(8 zDDKif!gG&xWj<*1>JKIR{u9bsph)dRZv^sj4(E=eJ`i(Y8Rx0_$(fHTd2i{rUR)K^ zWJ)?T_=2H$!oeCgBp1z3JXtRk)Y-fo3X~s+u*(jbt@N^H!6d!^${#~HY5!8H)akt7 z16N&l>pFPRO#g~Y=!m``mq?;EO|KnpG<31pgjK_7L>nYh!*c}bO8r$!J8wHzWQ}gM z$RM5{-rO?IU9d8s(Y8%A8X6nijTR=BubI9dFzjox=TYX4TWdb{S-LS2OAkJD8c~Tj zv2lR5-0Mq96uwi=%zL08mnc9+G`5u)PUjx{ zqLZt)=gE)ve!tXMwFB|Co=d=4?NAuFH~LE3rtGnILR{i5cWvvP?f*m?W$w~RF6iP6 z8d`1C?kc_Kt~)=dZ?l8#aANFbfV*ydvG|B0ZQI`=#dB$0RvXE+T$+XO8irheGr(8< znNCpH-0H5xy%?;=_f1HCw|%_SVjJNUKIh%T%)6zLI(#w7@0bJ0cHBno*Orz^O+({} zLT6UUFK4x0j#+Jh@?1p!ue|>uftkdT{ZA8Y$DEvhd9TnP7aj15dnq6HhX=YdD9phU z7M<71Fwyne-@**^tOD~cTq$y~}aVX=BdJDd_z+xi_` z6tp&YDs;wtTd7Nk@h-)@2`_6I+@*+F&6=h)ABwW((Q>*&}`hR|u+?z{9ZKTX)ra=?bXP-{OE8K2ievuOSKjG4uz zaMIt!)$2+Eb8lbZ#8TLAo?Oj7ZS(R=dadKsel5UnSrnR!>A#iS-)ZWt-EdiH{YoBw zVmyDh7DBoSAGNLV4Q8rwB)gB&uHwDOP;)s#QVe5%I-jj(xuPMm0oO?UWZp_c>4_Ak zCr#_|1KsodSCO|bBLf_WWzh_uZxM7VAB(^G8HxhE7NYY5SU;^<18@4N(p{CF<1JYMR+^coqyMl-7 z?gHWvKy?8aiFp8vG2t7pB3vCSTMZzUiA%8Zv-elnGug|PjV*EXU70YTeC4qyT@p{H zLlTuRxDy=S2PuzUtO!a??VbqKD<9XRc7ip|Mgr&`%&A76zWaieVc4NT3CDK69$CzNOksP2# zNt&LFcV$Iy#aKB9n>vz4AT{0z?a1j?F7m*5EkC?{D>&S4%i%6Y5oW|*>afWT&cKi} zDWJW|Es&8>=8!ed1UR8&_29)Pa2mk8 zih=J7o?4YW6LXdFQ9928I9y{a2+pK1wBgNQs9=T=T_rg@2lZ|IBKNFK^|Z5ZddrUF1)4bRj-@F@e* z^YyqK9-2umbyiqtq@e^3(EJ5W7tmJ2y)koKFm*;!g%D+fWDK|JmH-X@gkH*bJ{DK! zc^^JcKyGE06$CsTLedS-Bv)k}TI_Xqf>aS3oE(ZAqK%yRzkG9`rB1`8~HUE zSj=Ecj%sciY1LN(u(IW9L&XLFC?jgg+rx7mpgo#7gsj5~Bvmem5pzr=As=W!J%(LD z+9HSP^Mp(Qi=^WN7I8bYDKxAe7oLumX{3K#smjQ#^wLx$*pP!ZU@pn$3uL?-GPIf{ z1nB3WhGC3jl}pp%D1ye`eGOh2P~0kQp}ycNkJkXO5m*Etvj-1oiy%3Vfw~LU8CU?w z(SAUM0p!j)<2}X704&-k(NT%42g9pWh&$54G++2G3JHn#U4!EEEIAr{#8s^pg@L^H z>*#69K`CMjfh<1C4h#yxAn=DTOXR?i%azFWZ*D;qaaax=n$}N7lWt~U z)Zsv?{AWBz5sa+>8T&VO8Nm!QP@P}*uRer&-Rcq@Cd|D8K7xQ#IqZW34wq*4g@N9 zVL~V%lT83GAXyngeggA};k9H5oINO?Bs+-O@@$eVTn9yXLx(7d4qPsK5!Qd;^k5;T zaIkr=glRi!$~|ecg+S5oW@Tc(!sHu>FwmBjQO&GPH$9v^@eW_kAsRG`>Ef0)+TKr| z@t=M3H;z>JkA@`ZrpJUkBo~%Fy_oFx(YUqLAnAc2eOfv2>0Za{*pL~mJ^y-Y-*(yB z8bQfXsWUGBWF==_in8M@4eBnUog{y(Gt3cmzIT6NLbEbpZ>tpeMi|_UsYyOi&#&f| zn6T)WGrvXL+&s?ZXH))w<))ps!8lQ)&1R(`%uN6Bt#WPEt@pk+4)!-M-Q6!hqOB_ZpW&8u{)b{sTx);cv z*=0|~_Xny3&^L6-Es5?CZUwp4+%a9EhVLh%!_3GfX_x}k+6;8eNb$#t9&sg{;x6M) z&`cK$3*Q8)EE{CpFVDTXZ+ao;{#I|7-S6+AhYa+?GK}+o`&s?28`dD`cU1Yo5s!OX z-Z7~Y6BrZI-W;Ek*ySw~4f=^?yVIjS_Jz9BQRBqzp%F_qfiwE7rKX0dv(0+N?kbPW zJl5kF_YnidK z9BI8tIP2+Y9y3Bmb+Wz;-OtgwVM!04vDm$06*L>~8FNJE;FcG|$@}_D62$|@CyuBe z2+2?B=P(vD#G{Lw)ws8tPKa~f7#C+_RAw1@u!o{pWENg|Al#mUDyx%p9}aC z*|)D;G*9f(t#5kmcfCk5oZvq4(s?67?6D9Rjx;*sEqdr{BK+m9Pbc#JDUGK8-sLez z`caJhlEci8&-u9I$J(XiVNq=3pv*D-*?D@G`Ro=(mqEU?UxKmQjl0Cca_^{hD~`WU zj+9hAcXb?zO?kd9t4Ew_vmzCnh|$ld(=u=(ZIElRd?lX{EOeoV$F?OrriQ13zY%m_v4jP@YE2(e_GQS@P2pYVUaXP8m@I@?9V~L zIorxxSGmKk`(?i25nV`m%KC6ezlAW%IF9l1dBI5a-vs2Q(kmh5Zf@RG_=Bz9(RC5x z(H0uVjfF=be__Kyrd{Mvw7nuE#GqbIub5udT_dMtTrNYW6^ihhP$YyCA^4>UVHNJk zGCtEH(YrgiKaby(nP(&AJp(+|bGmacVw5D2!-)uF>N}|Ys;4W%ouPdQF#&UzD+Ank z2z$SzsxOr?8b6vk1{G63Yxvm96p{>}%u}(F>9<}fOz6wpUfDwC!t}ds^fUsTAqEh! z3PFlZsi%8_dz1x(C^ zIkIG^Q zNQ>EFF5K0#Z1=a&UhtABL)mY69Lu zMxQQi%>MA(Yrd{FVO4Fj1py@Zb6MYe@;3!lE;iN|BJuxy6AEvuc&=AJa*>gIkKm=0 zFQ**Ldp8BEP2uzj;QW3gldj%tqh)+dC zA#8m=-2ICneVQBA66iZy5^*#~Fho+cocYR4?w;`WSmbX{ke85E&kB1f2Ro(`tGEm4W3jrfAK!Amp4Lutmup{Q%in>uQ zEegjT%Wnm7`g9PmvJ|*+PkcUZuRn{|^Bvl_K;bi16==^FPGMw8nA2h%9SKt$I*2mg{Wx`bQM+*R$qWzV2fC zpJzlZ7gYHM&H1LDCMxk+$>asUZ_?if=~$wUyW9B|TA1Z9Yo>jXu8Bx)@|RCgx^JAF z6|bE#ucnomV~xJwKxHHq@AZo)9q<%%#E3LmQ>4T}Aa`3dfTKwemH)o#F9(1YsM2%o zg!f@gqwpQyTB%vh zz;dbICLO&bC-_G$g`FPTw~PR>0p?M%VqM_UKkDjUs#G>O*-d)9X06}&>a*;k)7~c~ zmq$GO7y9_Nt*Sk-xFGx0UUjH*alWxQEZJsiBFJQe;YwD-DR%>sEu&4x)&XarDmZZ} zp-8nJfr7LLHTKJG1g#ybu10B^uv_C|I4LD1(>W{&Ak>F_F+NLG1H9*P9W5)GOgyXIWFrLUdgkY5UtQ?p+?UnM{}d*r zB&GED88lw23*VoUIQ^w+o|N5Z0FKqoFqyxBYiFQ0v+d}@t*!V$s($|Z`iw{OZXDtD zO0C0vV$4(?Jo{Ui_{7B5W2EN6AeN}#O$xYqni6B3)HBO{X6{t^Ab6!Yv#p`woS1Op z_HkC$SYPp$fUNi7f3=xh+LlsckiCTwX%-+!4{`Xu&W5+sd9NV>IH}; z2*LudjtmE0!5`-S+hE6pOJ z`S!%E0^cT+rcRx+*7V{Y-FeTe1%+oI2#^n6)&)U`Ht3{29=Vrfkbp*2ybz$fP!$zJF{adPwVAewhc*=mGh z3v5?AVm|CqPkbDL=XfIVa~4?e9!!jjJ(ZfQAeyhb&5iNcX#ZY+1ZZT!jFP!B+M|cG z|Mm0@%~-~$S7spH5crUwdqz(+a&y4`N*&ELZ9(@(W2y*j56yh{Bu=3KI9?PICzz zQyAXpx+S>gXcRz3F--`FXRw2phe5^i00x!JDnyHB2yK~R1}KiGAOOJMUSXp%BST$) zGJ!c=fm5D-B6wdfdb3$p2mVb{BEweqXC+e?A+d4y<~*OLRBZ(RrWyA|&AGebdLi1G z=2#&5`Q1`P$pL%26u(<8*e_!9T0po=G^~Z~IrIV0yZO$sbMIrt-4hUTfqcu9ObHK- z&E>dBKg1PK2r#V8$OQh~FO#y#`Dn1jhCD6XO`ihVKfDpXc&mV+-X&?-Jm<;<6D1_f zEPht9w;y0@>N|ucX`ZY{%+2HmnVGA0hxJry!TY%tA0k}*6GE|}8*Y5Od%C+&~Y zSmslvL_y9Xp_b@Bh|UN2#Dz#AKx>PqmDBKZrGU6LnSj%yu&N*T9&*-Q%5nGsxRA}s zDc8Zv35SsiKtb7q>nFn#gx%DXcff!GoCj#B;07mq5bGt@6R5HMP6)4?n)YKFNrB$b zO&5(joV-UC0)HPa(o6m%Berpo;a1sh&8v8Zkh>7CLQ36Mq%gic2J0Ij&JvTyxU~CI zIX$p@;v$A{13QLddM|#r%SN+#Q5qSf_<95vYcpPDFUUCt0-k zCX-ZCNUm)mq`btKdlk^hT%wDc@E)llJNm|;0rrmnw1!7G<#0SUBoBOh@OjzguNlHa z%A6L?I&u}k@u``yD3NQJR#<2G+BG=*`_q%A@~7Q+yu9cV)8tBFyUyc#*=PA-MmvYD za5G0@mz%Dno?#?AfBSSL^U(cbx9F|u9%b4Wxk>Y@BbM7Y2WlRXl=Z^nevvr&C++*k_{ex3vApDM(eor=`YHOvp?dI zdxocfi8#}=DEpW!KAAG2@&|o1lw$s|>c)Eg?9X{Er=z1(Q^y|Or^Q)&Wh-SpWJMe& zM$WYJL^b*uvBdD)tX%0KMn;8>;nl_G@+uofx)x@iNDeb9>RFyXe=3=?mGf!o-xcO}9F$ux-w$8>)tn#$ zOK#z@#qK0t@*cZ4Y(bp48*!zP{zs?iE))LR+Zkb+*RMOO>@pj^5PA;_XN4Hr>xM?G ztvlo*dY+T9s@CX6c6{`wjtdKoIjyFw(?N1=J%h%-M9u>|hI$W|JUa_#8wOu8cIf&bM#ObX<{;-YvKjdxozT+YPSvhS9hL+xJ$U(x6^!RB#n84MV*~znCZ%Q$TEKXtYTKRUi&IRA2ZVTcsrN2iz1Yw>!`&_l@a?ZG{V@&%7C@BiuEx4`3^hTl}o509yD zD($7+>I?aH88O88l%H?VzUgpe+T4jZDh=T;J}XOUcM#t%sT;w` z`cLj3oN$90Edu${TZ@_jzl4UtP^s}zxhXR&cQU~2k0R_=eM8W(jQMLLcU&Hfqs)|W z>fZb<{pZ+7Qr@1X=o6hikG8z3+y0Gbt20!^sau?52&$-WB{!I(-hC5p*ih{W#^Nq!ap>cq#DY`!M5m3F{f8bpV1$_ zN+l~WZwpl%@)4klh6Sm{qe+3DFc3imw6hv%lnLVUi%-Zx;ak=}ry0{L_GatqJ4L7K z3(b&`fJ_OlT}c_{!XRawJMyWU@qpx%!FX&M52%stc5(sygkkv!?c$_1L+Fu1m`fAly>Nmk> zXx;KP0DCnB_R|swJgN0c4O(b4w?ul=uP9Eivdk;fN<_T>5tev}0~e`SHP?}u69pBz zh@t&VMU1BDQ;6O(#JKVPO3Cn5LfB`q7Ro_ATMFCuHv> zG{LZTPK4P_$EL(f30DM!8z5P;Ve}sl5N2HP5-1<(s3gPg%cL&j8vt4B>t&$#2veg; zDNb*BhdP5w$o{BuH=KEVvlLw7)Pz_7&1dC^kG@|Bp(_=y-Wh}%YoQF4S7>n5a2cKv z$zZTMK&Ay4Q!0RBbvAE0Z zX3MFr0OtCw|K;}%RpfWTd5)SLgx7J*FLJ?qNDY~;0DX2uB9Z=Rk2h~*`Ln-YI- zcuK|>yiedN6tn`Ewv<3$H0Y`<;pALpL5@q9-G7qhYymY2awv{FId7gglrBb`!E<5` z;wfO=ZJSs)K0+|>k|;Ug=~?2%RBZ-~>Trb026bCWAC$b$7Bw{$FC|7Trd`;k=^>04 zV5|nU146>Gazw~*h`VW_d&j;wof@<08b&Pux;n! z{Sff8;2~EIbfqsck^)itI~v&uzadjaL?<+vpgUwGln+v6O#sk#OH~Z*$}tCjq}f4; zgFEBQH8#?cNKADUa!9-}snVtiV6sNZls=&3ZBaGG%KZ0&nULU_zm(lFz4db;G54p zNJhx&!CpeF5_-sGz-wbH_)CPmWot5kGY}?L0ku<7A%WabMhX$g zUCIq`9OojD&&v>SpW7>dWE||<`3f}xF}=|oT%s|+DN*j+c6Ci~6oej^8m};=PX!3h zq!$qk*?p{Flp5k^@9=h||U z)eKbCLf7Vn8J&wkTcVHog*>y;dUlJDFKo}Za9y<(mo-}!<{g@F5*ZxsE#(i~(0fe^ zjQ!RXQTpP1(WY#Egm%~gxebk7!}fZoW?sSfXs((c68FdMZ9VS=SB}LnK229`mCvtV zgYb?-A1*ljnEoJm*z{w&nIDU#o@W(hRhM?jDsZY_(zt61C6s3UiVCDGjKUk7Au}sB z1+QBu%mXjN;tKOA?|*E-)@ zJF|8!N)1aHM($qwRzs6C&dd>@BKmDpra)^F@KqAtQo$`)@LV7_?k%G7+QozidXpUrNyx` zm!H4v!d<&kJ@fPy#2a^RQ|yInd24U3TVzsHwQTND$S@wbF?*frVYOu)@tA(ma7EWq zEN6CT-aoc~KeW8BnT#T1@G4Y%)1~L)7X8Op1UYdR+#K9XYAz2v*Ih3u_83&-PdFPj z=c&&xZC?59#BM8t=?m}( z@eDI6t9_Rnr>$#FAY60kxklL|JWJ6(Mp&J_-P5q8M|Y*6VK=FZa?LZPXJ6?}-+Rx( z2rD*is{gT$8mtg(duQ(#T1Tr*w=joXiaUIz?-dg6&h3t8WLt%__+B}`C5XJqjSFp4 zsN(LaN)nk%i5kW9pl7nJD_Js(rWe7WlHjNiK;z{SH9|!g6pD)0U}O5B5(VCVteQ*Z z=QK;wrQ}WaLgV_PDU|H=Mprv;xeGp|LW;x!gw;3z1as6sXsz_Hg4I3!l%Qg+3D z2q2tAH#v^oA&M)iSt2_hZX2WcTRFx9He?hc(_rJggnbZ+v36HgVTa9^NM50w*zo{k z7;t4|@Bs{i-+={7bcxzkp#=CYq2k;_up(8WDt&Oq_1Tu=SGb#^V-UE7cZn@1?qQH~ zc_#V?b5T+><`<26_aM~ix6$cIH-%JqVm7j;OOQbe45~136))xFB?L4<#*a^iY;c{d zo3G6+ys+$U6hX6c2ovynla9=J2*;(!YQSlVh(;+81QOy``UFAOR*!H#jZHsq*Q$k@ z*#ds?&e=71%-~%##{XjJ+H6>%ugL=rxQK-5I|%XJYcdadpzz=?S#20q68!g=ds@p< zPLl(5_p}@jbx}q#a`z>r`8fMekTAC(Pq-vy8AMTbDT9H5ORKk^DNn9HFv$^fq=@Yb zRt+=-+<|~lBMajCiYYIK;dIlc*meRQr$2?Nj_kKsE~I%;w)(j-Qq4fLgwH)5m`{t@ zKWeGI4J%OdG66}@qJ=Kq(_!r=*ek>z@f6w+HLL@SE3OiFGhlqA@t{=|lzXIY6w~gO zl2Qz(75AwJ3hEtT7%ff3d6G`^`Y~L+Y(2e57hmt=#HQD=ghHV}Ux5JB!F(U=qQ_Ct zqjTA zxMmjPVrG*t3OVw#YQQr>d!dS(M}!rF5(CrT2Z*i*&&t~vxne#KZ3f5jjEz7x1ir<+ zaNhWY&I89FY9+$O1~?pkE+raGeDFhfW)Rc@nGhl?NIcj(vId_J=+x7}0a>ecmGNY! z@k@HAJy3GB5UIlT4VNLt4U;?+tdwivJ<@Nql-aNrnn*ycmF-5NN^m6rUZ4`q?^+-h zbMBkq&(CGBP+$VZ!%-MgR|F_f;E!<63B#Ur$uo)B))@1WYh$Z>&-3 z0cecUfd&CWiWjCCxF zJ1E8b3R{DeZ{4VcqaW_bB#IxEYUn2lo4NT=Yr%Gm=b?MRFF=Duya*}=@Vd%y=Eb$j z1iUVga@jc8&X0RxFQ?Pf-q^`_AhYTs&hW~Iosa?2E2EOaShI4$TNRCDmrn9kP-NTj z{NztO0lx{4kgE~WFKl8w+i4`n%8Ks=xb% z0C|CitW!<0{T`6X>vnoGFED2HQi~EBV{=Bj4aV4~gkzY|)gt1RfRkA<93@{WtT{HK))@2?E~ z1s?SIOXNqQn;SK5Yj~+@JYF)qiS+ux7})@bh#scYdroPWajkQ+!Ex{6zwOsJHrL~d zU88kZct&*Dw^En}s_yPtN{^F>VRxf-Ef-(P2@Ky^wfXu|wEYSKFwnCqOPhd;hUtg5 z)!S8B%%2R_LTJ{V(e%R_munWEAr5n`7*+&DfP2AV^{nPII$&3UC(}Rm`9+wO>e_j^ zt&g+~0;MOFTFXwig&&Dpcsb4<7a-}YHqu!fqsIJF?PtA}G%8fH8z1*F*=A$L++IK^ zIym!I5l^^sbU+?%xIfl^QJ3vRS<7=4+`jMhYxOsu$}wK4^%&^geWN z9J^*;zvdOZpLzdUL-^u)7x~DkWV1x@l(2Q*)|nOSHGBTtM%`L@<^;(;Rvs6 z)YZ^>sH|_c$7r2OSJvg648x(k|8rs6KlA7JJ;W9)l8~>Lv9vAq{O1*<52g_}p@X=dbt=Q#LV6b7 z6_36s2+~+i8LoJ18SZECkR^HBKAWT5>h^}xzWJfMZtp$2{Kc&v61S@Ysf)uLA8HSu5RpRvg|kbtE1abL5{2vsAAM?RGlcxtUnV&VRq@DC-P z-YO2rv+hap{KGhJoPOTTmXMs7KQ4SAa6J*^_kh=GH(R0=r}L%tjmE}0J5vL7cU;0GjQO%CLd+mB8orZ?C z2~W??+qVJ^hvr$4ZF9-`OsaLhnn^8Ero(}J1zFKF4#fy zqF$|8A5&(NJ2UBRl6xw~W{mh_@A_lbH;%_u>1-b1Otc4kKDRC;OI&@-F?(sxsfVEp z7VgT;qVDYtlk`d24~F5BJ+D-@Tr~Z;rCe%#tfePnjXT35#x&divsO>edMNewh2AO^ z99S+pq6P$>zXO8hAe+fK6mzLE!{3G0VONr;qtj#*3K(jxQ+!ULEcBC9nGSdt$I)EW zhXH|C@QZ{~@cMIP3Mx@kz$d z#>6CK>PQgs7fdoD9Pb?)_k@2b9lMnBQtm89Kxdkno`h#x$+TS14c13kA>U8oIRoG{ zSDxSUjSF!1*Q}lb+a06Hfjgjw%KT}yLyETJ=;2IZoJBTn!jGy9De=D`9??~)WTXph z&+=3C-Vnj5u$5D_%aF8|L>2lkHY*AYa#9t3605t;sB{o=69A{o1%F^Fgo5!Hp<%il z3;xnhMPl2H5Ic~ys0zpdJ8%`M`rXK+JJ#C_Zn&LIT;bc01zpK}rzx~A^~<#E*s|zc zvAsVZJy4t4+8IPlBb~GyOzfJML;eghIz;sK$}JdHFo}|b5MLlaBn?T~yJ7*e>BsVc zpR|C$_v`;C1Zk^!sGigzxx^s0SITlN(M13NYv^T#+6QD~uy%zttx5^UebUdU;X?p| z0E|87cLAb5r%M;ZMjaf0vE$zNLPMarTxHLY1R?0ObA_RWg=ZFI3nZGY5T09Nq*;{9 zGg1cYtx94Tz$1vCCeUD?pj~vD(tI{8&TBcUp2KE)CI;j!wFmH2Zh%nNlgPyYrJ$U# z52nmtBBBmJu-+!&X2;QB+^Br11y^yekYbeG+G~E1!8U)?LGvo+uOo;m30X=ux}cVMH#;jOi>hVtxa|bqZ@VNkycm zLbQ#AjRa9c#I|#ay1b^zSjMG#euB42X|fT#!jy~{Frn`UOhk);wRio>{=>+Pa)Dt= zSF!?&_p<^9{=80R6W;l>2l2k_tnPd)%;#^9+`~Ce);try%XgKv9a;gwwyg%8EGBM#RYs#NGi=mxYgn?a3%!mS>>t{Q`Y%bFR*4Ar7V1cPy;8_qr- zSckI&RKK!5$a$LwCwh zP-5$32vta^X#&TQ2&cyHm*OgFb&)LWvYX-u4rCJwO5`S4B2N=*60bFYYJQXrh5ga5z(WWPf5neZ7Xp3g#Ur2kjo3*kX zw`hN?JvMxC-yf??!!9SKgjbFHd#t|Tt;6W;s#A}b^y_%4yiQ`}p$2Z7gzbw(QRmmc zcQ{qH)`Do5Tq16k*PJL_dWH;cuM6uOcuGEmWVPV#Fs(kiA!iCV)6OEsC=q>(EIS5L z`bJM~GIiZKg?iPy9XXkE@OzILZ%Ha;cD#W?LY!jxA%#Kx5B016MYes59S^)FD!l&c zNc*=R-8Hch!us+d+ew$ho{(8E-21)P^YQYL?X_cN?xl z;I~2@!^L)324+n9x&3uxC{K5B>Bz9b-hf()kj z$3{rq_tpx;S+1AY(W>pHB3K!$!M*GH8aRF(QSZd()HOZ_>d&98swr#wVYya+^WgHr z4(F7o(vzyopGhu^Wq(_{w_*Wo^E1-`%Gcl z8mNXUUYnd6*mKPy?w0GT41;eIGbL6**-01Mhipt6J)Cb0o}LnyUdWht_)rC_QruoY=AH;|<@QB+%h?gx$J~lq?|=QFd+ecS_a%wPzGFiDsicnR zZPXguJ!X0Vl=@~T3)dzGRgWT2`21~z5)p_}G)>4n+ zUljShVe?htE^CRl^-gwjlX-i>rEOW^I>WYhZ}z{rbiqE(=D1O$e$MUhT{XMedgVVB zG4xoj4XmAKg~qM_l)XB(6Ho3>*zAbx-`}L4d?S3|if2gd^-cArH_ne_hdxx)1n6a& z_m`Y;c4ejHL@VD|_he(vt6NSyxfpfMyjMBiw}YWLp)Xgzu46mVf8J%~!KLeBVtCEg z{UtfC|A#odR{hT)Iyc|)(O|OuSnstpg}X0Y!kY-?#jy(MEsaO#PVg2d=5c~t=+Dy5 z4RGhb^Vh@PFJB}wHS4hP<&HGpuIW&_v%Ti<<`=164D~e==|bzAnI)2kQJQG=v9=TU zF|s$u>vC==*+Rc`n=A%5;k@wu=0EKUTFb6nDw=f?MNAv_xPLA*cDR|;dzR&XBEM#^ zXu6vE=tuKFOf2R=b3b=TRqGwyJ$6(*`A+L#cdoC?$+XRj-At=i^`QQXzv36(`I;o} zuNx>0Y3WX0eedRAmRV<+x!sAob-xzvh|5%4fjR=NC?7nC6<|FP)I_uk>T;S74n; zf4@`|MlBLkLX+~KbhX(n5kE9Cn$+iA+n2({yc&1PL_!gXSbV3Fu6AdR0vo5m7ek>c z%#RgUfh7a=}oNf9g*P)Riyh&U_adb%+on8Z<~=Mben7dgepSE5&i_bQflL2NE)Nj!-^i z1bTTR=$YeU1nQ5#3XOe0-!U6>K<7=EEy?um!Gz$hC4dn@2`08!FQh+&*cHN+x~N!- zMdUE?nv4}|GJWPED=G-CiX8)K@`WjWBr7oy$|0j_FgYP3h}5#YwA(?Grrb zU(tuO!Pjl&G;XBrsHhJP_tQ$B#bcMw6xUMxQ#w}bilC+G!F;&@dL+yeK#lC~O~unz z)mrJ>ZL~@+oiW$?u?*~wN);cJEmC-|!tXfRuVQE}^ zNPYtW&W`>QQerCi1h3sl8zjOo0HGBnh9*%GA=OlT6=imsC8z4c-T=lx154DFgwcmr zpltoF5R!zlS7El&_Uyt;Z;>wUo6rWLWv9og@wB5xPTnqDVaDfjL6_Z79?<%uu#hqM zoM7@igN)_@KedhCgJB_~m3i+)Ty0wjZwc`@l-3{MkpO>iKNsq26cNPvfBd@?t$nd9DMu| z$|>6y9I9fgjq{9KWw7r_HHXy$c)J7e@es=XYhaz~p;oAZV<;#-9w94g`sEVyoLW_t z37_JHZvjlirjXf(s>&UN>nYE*Tp-vmrp=Q)8j zXSE6reA}vG2Zb>@4gQ-KZx9)w;tu3D%dx0cJ(wR)M!1SV=pLZ1aD*UCqPX$~s`z62_G+&f94tXpi6=edbtj~L~Q2j4M`9#}9p%}Uq8tZq;oR4@QN{IbQ z4c!*gpJKi#91SdInvm7igiwr4&yXqsh3bt#niI6Z0jB~7yC9rfuwMkpC%)^1N&Z~0 zij)_R78c-MME7^0*-Cu{T>MQ0#+*+Z()S1te&?jlF3doT z{PhBc`WRJ&P+Y4#FJ~0n)Ky83N3EI!@bWnWYykqNUARFB&_Bif2&0vTEo}x(>tqn< zBQzL-QvpntQ6?lOO7L)KAi&?@6^d(ez!Xq1HLL>;VKfDx%t%pBb`CKN;3dZ2g?{v6 z7h$1n$`3z^ADSS1Z*wcN*}aatmr}7eRbZoq%8CH2yBC9?;{GTZRRYcu`4p6rZN_+tSd=3l zR3T#VT}hd4)l~J7gLE@&5dv73L7^hwPqNN$eKeZs0~-ZhYT1AuWNMhlLy2 zC^wAn!j_e~+3NV#7Ufuf?b@^{Xr-H-Bh4wB)wtoZJ5xXRx&hhO+jE`^y3O0IdNbu* z;vNc_EZHj+iAq=z*4J6;xs&`Ao;wKUw)J1&F>dmZA_z(B-NjvqyI~YUOBfRuh!+r2 z?DO--iwkVHQRgBW{F7~`D?<)P*IyFajW zfJ_4={?oh%3MkDUjU(cXkKAbq%nr*g>w@H+b<3;#N}XPkGHQxe5Xt%pWOMMpO1c3^+Y0;M| z(N*JWtMnBcSNl>fR2oLpEp8Ty9Ub4+NZCL%r zz3W6mvWxp4?6vw^KAYSuJdWhtUr|+bxCZ?cq%-#G`*0e87~7TlsC99k9p`G+b|&>x zN_{)^+&okHbuUJk=0zm8LCZMqRjs&h{u;zesivoBr@Udg%jSZ`4;YQw#A3Ve{+Z7g zM8q5yx-ZDRTA;6yI8-ZMo^L&)b5Yu1bLB+XUwKOhay!Spk~ho!- zVSs%iers%gEc?z8U$Lj>#S2I5@9jE-u~*_=rUnE)TvXWK5YCREk_5z}r0xl4{qzkR z_z8DIavLK)2h2=#oqeTvem!8zDTO7a^x&`~q7fU#_U#`|}a^vIfr}qs*CqW9jLCwzkKo z|9Veyjn0g-+}Pj3SlB$a^}QohF8gN|h;8nzcJzGbaWm|pBmG5XMERC_oqxg~g|}T- zv7nq0^{ub1dl|k-f^?{T4Y;gWyKU8@B_+FXG;bdxKY-+J@eyimGs)j^_~-!HC;C|W zUsEs(hF7zj8il>`1*t{fX=? zTJNQ;qph*oQNzi8=6t_i4~4wT*7jW@EQL9hYKz8Q(x2(rcG|)wg&jQD_7sCv%yNPG zGN#UW6PLf}?e5i)X=M|&k%m`mL;1ERRb5Bl_71%dLI3-4DRFqkWwdWz(WQZ1$=1>{ zW*xg5cfYQohfp&Y91YoQCE}r6F*(Lxj34>|4UM|W zbi)GWc`uVChIKOM6tRk-8az=o;(L>fX1NF`CssZ@XPhX+!YLaUd*{tOF-1nkvk@{R zn390lNVv2ayCnOBVqnr@<7gb7b2tLV%xgYZS&PK9sI+@|blKR1rxHwtWBtiY!-DyQ zyRaoCf^4dI&16t_q0n*)+5N{RyGn8zdL^ldKc9cuS`a#85X&V4z-#tn`fA%fRPfP6-YGsno6ub*Fs_i6a418E5n1Tb z)Fyplx=-d*_znSz(Gb!pz@K&< zX4vkO3)G8y5FBc(Rz?Ul6ftqISPyHR6p)^1kj z6q@q83XShTbAt9ALFxotQ>!fzWe_u?#$aL&#R&CqdI_Hakr-AsbnqF$;SaV0D6%?@ zm_rteNX3FqhFE*fQCv5ajH)1z`NAi4#G@qZ=hCeu6)#iQU{nI1nHmosAzYErL5;u) ztHy;uVgOorF%kymcf4LsEIgY0AYqj1r}v-1cnV`3B{;1ADE4>Rd|WJFLl;Vr__}V< zysiasm%^)5G7g z$SQDS`-bw1_ggTG!9$Y&A6I1vyj6p6`@M(*^fAE<(}qS%1dcC7LIlndcPf!)z{etn z(~Ok{Z&>7BcndmXQ>FEUxeAt13DOKCnc^4Yux;|=s5u&f<1S%TPK3J_VU`?9>WKP3 zU>Xec0(%A3*Ndv=5yCC{1RW+ZbABB_t(*=L5ltlUeU;5+02vAKR>C`v>|{_WL+LAO zM*oNCzmqhSN1s>~>i$|{um0O{y?>Cd@2<#sIMOn!NH9lUUor9|sJQ6QvIspL_e~8t zU)n<+SGP0Gf4t>wEYvYgX=DrF)J7%*3&b=Ur=uy|CEN(i?{)n10nVr?Dc@Ogt;jk?s&t4_BRGwKKeZ}a- z8=o>i;^yQ&%NFz1JiZ0ze$oeD)4#92OMf%{d@km zL5o4RoWim#Dd8W@cp7x?_|qOCO}CdHx^G>1cssHas>$&Ydeb-Zh&y8NMT5nH>8jWj zhZl`MerSEX&hK`Neb~#?^A>{tN7C8HGrj-+|Gn$cFib|HVHioqD%Wj|6& zx^ht})oF8Wp$&DAG#a6FD2mhRM7gZ6kfTxwDM@__b-Fyir|<7}JO7+pZe~~S_w)65 zJ|6dn;#970x@9EtUT;2tS+XZVWhx^$)aei5sIBSadezY7mbx#RS>&DVd@W%Q?88Eh zOnRqoWURJfh>hI)J-jE*!>&M_)*ZO+=P1%3$M%`=-goZy#jQ_AYbHOn1j z`X(eIL;v5}@Z2X~^pze4b8}O-t@U3){m{GW@$>eNhPBr89>y{A%iO)UgNj+aP`Z1F z*3`++Em|4bV_Zfm^REuacdxt4&v~hP-*3Hst@SS(b+hiy3)(=?Q&8>M8Sy5{hBu&2n9{JxoPKu3Cj>|%w3@_@knyfbU%7J zbrDrc(6|_-_10$O>|NhG`K8!>q?lcM`ojv`)HS2mb`^d)({$4!;>b~i*LGC(oYxJ4 zRpHHH(jOMFP3UdW)@qAdDinbmh4p0Z6SBATyYPVHkU{aYqeI@G*ERB<`1TsTMiy($ zUyF?o{25#N^x6$n(|-tYQFgSmcKXo$@~u4)T1ihzsbL8=+qT_v=n`HA%Ur2jSi?!( z(}@|RMsmo)j9YJOz}>Y?k)L)j+PlK?kFSh7?HuV=k?Q6i-!TcHwg9ok$){>X<57u+ zD{>^861UyY)Y0yvI(WWuio3+#`DVRU-?!R(LQXrMNBGJo9@>A`r1PF7Wr5*OZ?(Ac zMfZqCVs1OHi#J{5e7hQE?8GBP7 z+hNx6l>Pe32DR?ak^V5gy|Ithkk_H!u3vP?p&+E+l=o7)Tw!3_ZB$V!xVW5jj^*FU8C=yrij|7Wn_aEnn<)Dwnh!Fvyi2MJ z4yc@519>OEq8##@_uncnJsRV5SMAYI?~e;OaWIE;=w!vH!$|tNs5k3fsE;|m99u1U z@clD(!~2@Ta*U_)%OAED+Upsz54BHD(>|na?TOWmCBfvbjJL$&Dq zs^Id?C3`;Y4AU&1XxbPeCVtx35zhRcK?-Co`oC($O3s(tzTdX7!&-kV(^R166uYSI ztK~+bAW2_7+n!i4zLp)& zOWrtDHxQpxuq!A@II|i32gHz6nLO;NQV%Z+wrx}Z6~ro-zaCSO zS>9&U%-10o%CR>bGq^_=X)xa~nZG40vQ;P2IAOj_>WiTz2oyGdQiqMS8a1;KI~^cO zVEWC_q|eovZ3~n2Bn#78`EpbrMAF#cxvPTmT&KgbEocE1D5YN?A{t2?CFmP3vem_Q z62Myxpo0}<3Ix{ge4x`xIuW}g2W40Wq&HDcL|H`}Jg4lLKHgh)um{sJuue2jZ1u0M4RTiVQ|!q{>c$LU-lyW9F%oJW$}`r$vo-9?M-5 zJtm)(B5z`aL1W%d-Ch-9Cdv;js*v+dOsrTlZf)C}E}OtYJJUA07&R4BWr9geiI6DY zI)yVh#?%BV2?FybX4Z#dFa=Nhuc?(UdESKW%`TWH|BMJhzN8Hcv#Qu=_4hm(zy~By ziVi0e#9Wl~FNlxh37#rB|MJ^WQ?vkT$p-LwL!~M3OpPcSKmt&j<8q%@v3Upkh=^t% zsp3xgu;IoZOvq_bRXgbzK%)s?{qch9Vnt;a7vK4!%*jH%|H8NW8N9KPU{Zj3Q~|vc zvRNMulh`6=-x8bZvN0+i+}RR7iAWdY(|;Oqy2?Onw433m(ejIsl`px5q(Qf3{m0BD zL{Q!wCgjp_K)!*`h@{3wTdoOJ*2_Jaf+Wnq@s2a_1+;e$n7Q{h6|?SKXokbUT_Gu@ zRN7!zLso}MhDkOWQ)-Du{Y>y0r&AsM6LSb&mb{hyQrCpE*U)VXbx}h2P`FG8BUawz zbbJLS0%xKSz6KK20qTtJorsub1H_2^fLlInMG0hVH)F{t=>*W%(?!rRHM`^pKyF?Q zLaWaPVB%o{b5Y@|E*lytWV%=#k^@Zw(L?> z0F@t$8u6YN5)6(Us2uO8=AADsP>kEkU_=Jl`hn3&ij^jv7NFPJPoUsBdiv1X|C33& z8Nk@(quT43u||V(2?505W1s^MY!@(5CaE5gaI~4y1vDATbFzxBcrX({ciay&hW-U8 zTi#zS68~1F=%7zaR6&^r-<5!trRs*Q@WH5cEp>R{2w=;Ag9aQYu_)=e>_cHz^{M=ojh=_7h0#Y2HNAD5Qhjd@~ufO_L`9*&0fW ztJ~tI3mAZa@}+htH)33&ugz_t#)tDDLg0XxJXJ zl_?;c7`rHwVBvbyodB>4b%Oyfs^WZ=fe38Wc|U!KSa^3aH~ix@DZ=f;DoW5_jNg*> zFCXCmNuvm$Epspl;f#eE^Hh4p+ov3&x zTR5y^(>pOBicii$xlbVkwACtPd=$Kt}Ys!X_2rKo5OYa!wW!u5jDGG!3pFS7F48TTgUJPo1FRm@8n`6K0M(4h$f2o?Z2xsx(ozU%0S5ZkzWkBkp{%2ZM&JI#qf;xEHbFdtkpRXR^09qa-@oh%{|$V__?2 zs~z=cuyJLBexh}2xJ@dm-LMqDwRG*r;ao&^P|mPpnC%TY_Mp$xyES&r88q(#N@(Qd zhP|>??@Ok&r%|CILS)z{k6Rt8DyEF5Bm||pZzy6|(-JQb@|~MHvd{0BKD6l!{O>%k{7G4wCGT*PdYNPk)#FbN#I*(Icf%{^>kWsLY z-lLUijo%eOF5tD7$^ZIu4|YCn_J^6=4D0>9)8NN5E8h5YrtOs}epl!^f}vHs8*$I? z^(L{N{#__r=kn%_tTpyXDe=pL_(q_+2^n+?B~eEqB8=2auV zsVOooW%zMtXVKg*r@L&`QIqIj{#yC-CPr%QkwlT!S$oM|_Bxg}xwVD17Dk3fqYsh~ zBM-ye&RcL#v|q6`SZV(We>I$N^hQkT{@(ElM_o;HUvry5I!pHGqr?_b_i}9v3`mXL z`D5%bf4xzRk?oAQCOc$jQUZl_d4_`%>L7tI91r;zzs?NkU%{}YDmyWaD>Xl5GlAFPVVY|PyelKl|xspna}Tz97^MtENG&5x^yE@6E3p(H4UPFhC_eY`^RJ2nqp zy0(v{{L8smOquev494dCcRB~wHAV?~!o?loD^vCe7$>e8Ukb3?l=(EnNV3aNnrNGR zTEYr{#rQ-Rtaf`m@r&E18m;OrYC3m?hiv8S)tBb8I|ek(YsYa@50!Zhp>{7+G%{A_ zb$s;LP_@i;UG7a^GpT9zMemZ^qG7er2iDS3gXDX;*~t`oev&w|?fj8sjge;~cH8>$ z+W78DI`3U}GPak7tbTUTm`hxS$}JREgq$~?x*Z%cVQ8J6gFtmzNJw(YihFSkbJyjJ zESi{`IAoE~_P?j6PbCRC11ZZm!2yp7-*2>QhYFGsy|isrk13MkDsLg-E^%OGs4nAb zcvMFoqo%jzl--n?SHY82o`-F2WY2|MPPkRk+6A zBdGhf`gg=_n^qlzn~_hivGLyYB*069d7#CANQ)%Xe}?j z^>w4fQ@tH~KI85rMSGWKsMp{VmGrqC!Xr_EhA!Q%XI0tcFNr4fYKUn$^Hs6SxMSqgJ&V-#EULF_u$>PUA&GxXS1?OkX>VWo*Bz^ zJn7Y+J95alwRKc3Y-NbL2ysmtOI+UAzPhosZQ7cnGf^+e-uGJw zb&U>fqSQSp+PrpOaoLYu0YuBE>Cr5(ijOJ_V$}^((F>H~kY)?9%iM}&p_5H_=-IpO ztG~;<`sbw2wf^zc@hmU-W*6!{5_+v6QLiL|mWa3csr8R$!S2QFqxIgxL;wUN%MPMA zVH-kGnb12SNlN34f@zhgVvr3juC01CcqXuH%LRBQl!n%$5{^s=8(Qn|)Cm#ZIw^n; z>KdO{4K)aEOLcFq!=NPEPNZhAm2yh4nPq9+UPvquEs5vs7F?M!Ca{^}gPHW&ey`12QFTMEPgtV*deto}O*r3G0r`4E$bEv$wp zEPmiOvoZ4cF_@J|-t#=(p=z;4Nii*9E`Wb=uts9qjFa`k7FsV(s5C8?5<79oTZh1n z72{&+D28`hr+t<~H!XWeLiO>K!K<)XQ9zgT$F0G}k%a;4$;%*&50A~%&rGv2f-bQo zRS#3oSgyJNw30YW*1fU^@p|t-mzoxmqf@HG>GO=IH%gF1T1S`l<3YHsR8C7d?n*{d9hMT@%97n2!$V4&pNnu>!raxGS zu!Y)?d$K)txK0;Urt7^~H{~loYlj<2;Lih7HcC~t+xKjW!k}ek9)@F9aUy@A7bTWx z)1!qH+D{5H)Xi29nUUNDIZ4eg6l(zIqHjyFzb0fqOnOF_o%ypith&GfEZkfrYc&L07L z#Rg?{7ip&nPY8k4n{Pzf0@#zYWF;`kqufnZT5M}(H@eK`7D#+ItZi% z6qLv0>&;}_s{+`UV+DO`%1>+XbQxKm@?b}{yZwQxa7|j;phT6nNR>&9C`d7&elbHM zqA^@>IvtumD8p%#TmTlwuFOF68a;)UvB=NApJ)7%-r*Px+Y^P*O0ZK^2i`SLb}@{9 z21Ee@zXYndNNKrz2UUz%){stv+~rsjRD67?L*0SgntwRjwr@Ec4X0@WsTGg<3?0Kr6zL9|9D79cfB)9Hmh}3QFNT z3faK_8~jZ0OkLDJPBY-C?;~OLn}ojti19O+KTys^$l})tpwJQ3VETjlVm_+;SPfqP zUm5wu0Q4+qs(Y+;)yj8z1L$p@t3qJ~k8)cG@lk-@pQ8^d$3 z0z=Dxh~ppvzKAST>25+q0mB_bp;&zsFi>pd4dM$&kTpx-ZiMTDtoI6E|92ec00LEL zuxMz~u>12NWi{{J+CLMx7>|^SvF*dfcZ}F{%t$5_L)RN*It+23+pdiR0G^-26cf8w zUxpfpf(AtZ`TQ3Jk`mdBSWT6|A`RZ2^FS7Plf=OxI&(l|>trMLP$Q_nfPnO0{G$6` zJ~2#TwYLZv;z+VaM2*Dmn+R;7tl_K4ltH|Zcgssz*8{#Ns(%kFowSpYhi1fh6SX)* zH3eRx;a31OIRtzl@P`n)1W3OC8Goo@FdM)>CSdrcmnvg&;dNTFS3z6F_9A55%KjDX zyAH^ZACD1V!7^gX(l`!r$H+hVC=LlKf-k}rJ@^M{J>taJpvqF0r!F`~Rcj z@v{D@7BKdB%F^M|v?!BR=V*e@r@)?%eg$W-s>Zy@BRh_~&~snzn4O#UKb@batcf>l z+V@{PX-{m^*&XR*+jn?T`X(@X`kaZ<-L!WOTPS&bv%y>IdC~2T;hVh$w|2|gC~ALN zIbAei{c=zhua;7vXxAorJj1Nz=@?&KxrRXUfGThkhR^av)0Y^>NF6PU#?>ZPPbD+O zZEgDhAuoa>boQg9k4^@UYcw)kCs_)Z|R$BX2+v%vhCIgwY|;(sFYjG7BE%Pw+|Sm^y8Q%b@wKTQKpIpnu7y zB+m@i3nDsmPLJnxh?=CYZ7*)Lv8QT<{qdO9@?&zg^ntS5N6F*<)uk>&R%7wDUCgNJ zt*qTSp(futPE#&zU3ct5>xo>uwL34zfMLn)85hk2u{{o2ZGF5IWgx`*Cl)9+-DokoHqU)V zJ}RS?eGM?V-M{CZOn>(gX}62bspj1Ua!TWgrm;Nw^f)o~IeGTtehv0hh zM{^sW<{Z08yBVLG*b|ES&O2FBY(h;hwFiGSviZct=r2$8`ngk(o^0M}C}l*yW!cmf zZxLd`OUYf`37=xOzceh^Ge#YtE6Ys+ax8H}G{-pK&xG2#)2V`j#i+Bx7vCaN!gv+0 zsLE3vSL*M&7#jG|%hMI@N=eb_>;9MO`aNXoh$8)EByn`rJ=5Ql`|NWawBVBRsU9!) zeAT&UALefEl{GzhYv*Q*=GwLLdn`$tUuic(Q>YSMvO46qCuam{Uiadoj>&4qNtCiqZk?uRF*N)VW?Wo%woarzT5c;u#>oW8MR~eRBYV$pHU6mhAEM{8e3`U2iTNx? zQ_DNc>Exh9!B~DhK1X~iSjWiLPM-OQ-;t^ES=~q@QAzKn8E*@-sN}Nt-JRaFeCu^z z16&0@DF>g`ov!5lifZh)1=Y*#jq|e&*6J(FWtbHnPBp3#f(Y@*^Ip-Fi*5Qvy}Jim zTUv6jyzObf6Djh&!^_*pkhYm87v?U`Yz=AJd^5su_lNRWxwhSnnRbbm9iiNO zkosdeXWploXI^aUbm*e{0p)+LzTM}Vid;;!jOSv?x03FBmaugpVxjX^5947z3*9(TM)nMT7livz~O&aSDm$KlioA9 zx4m~dJQ;Ix<`k$0KFtY^>%|i6D?{O*d548ms>G_H-&eD zo+d!=sDZlSjbeie7Xm@oBuoybWsSpY zrXEKel}WQ81&GseZL4 zViV-BOe|fNZ>@sEAx3aOIN&^toUdm?M>5RT`esTwWd$}INy|W^EZhcc)Zl@xu>T>5 z%0>p9Y8u|!?w@r_y*(-N<{SdJSK;vf+GQtT@x8a%l>$RH65xVyMJ<4KkEDD6Hi{F} zZ@lP3u+Te(#4OPTD%?SNRQs})gH3|XbrMWyU~Ps*utexUaG4h?k&>4@qpZIk;<}k_ zwaWl|Jk)TR-v0GLc+0^~x;B-9Kp-3Jzs1Bj_soNJnkY|UwFK`6%`JyMLtl~8datY6?kp~6y-@jS#|2f znou2H0xbY<@U4jm>a?m8ykq0vmU>)WPli1Nv|MR{aFT*3j+ zvEdqspvF4yqzuR`M%0QT2(xjJC~$tS=F=fiA?Gx^DJMLy2PqSCAxyC<)5_fCMeb)= z_~B1=nrOS9%?!d#e-~7t*Z68}M5m94`QMbHE!OGSj0(E^p{qW8luBNqm$G2W1zC{J z!?La2LR};Dt82(8ILSef@_UU21xRMD5McbyBoBh3yrmu?R3Xro&FZuQtBA5k3gX&_ z7$q+SUiEyCEGWvTI6opa;9R09Lf)dyb98?zLL%`(3b?W~pO47#Q?CYvXg^>D7J`#@ zMur@gud_^eEW*1dfp$KU>PC6D4u2w#Xl4I_hb+jv1+xP)oNg2tll=U=DmV6RVlMd( z1Ssbw3Pra=ct!M>s3Qtg&=Qd5 z1lMJ{2J2+b;n=~!pRJO|Cc2KC(ZJ1?x&oGZDhW=?<4N4*lrmMpG8L6MPA5FWb0^uz zi}JHI$ZkG1y2jf-0O}~Y9D4;gur*Cf$swqzz{mz@7KGs*5}lR;R3Zz$nc$l6j!sQC z5yECnfdc!{GLEu4&IIF&s^%qnLS)goh=PGyBBL8IH!(|j>8z7+cmtV44~KD)c6-5j zju&`x{#i|U+{P|g0)6FMv5{v2h8?6Mxo`zjg2W&PDk2%off0$7{sIYz8%#uo*>DOI zF?C>;BYXu%!)c+bAMBTa`9p-rBr1Oa8JQh`QfEkf=F1KK9;PsXi&I{t2*GJnN&fM= zM;;`E#8li+@G@oXooS) zNIDxso&dy1xx+&xaceEsY}O~YzINN0KJ!lxeRV^&a=)hiTx+3LHdlGf`Q5I~{610@ ztNhDl`&riql?&^}jboU1_8y*jKKR!oJ>rw0s3&G8=nXpbubX`+B^A}qU&6?ow@38N z87JIcuehHpO-tqW@wARs{$UW1*lk)SR@Tw9f2X1|+fHaEc{deU=?qY7!zDS_Ud0AB zP3eQuzx!xacl0~~d~nq{7Is_G%fR~{HsB(r%DViV7fLqk_UO7v-Kl7`TWc-k_QPG5 zJJ2itY5Y{Xle}FWl8MgeYigq#wSC8F^M)xfuJs>ew}ez?pB*hsC`&!`{@iT!B5Yhcq&@>e4>T2Y1S|9%nL6_S6uPBOe-aGI~*`b`V8|nZOjqwY1anp z`2|X9$DRB0!}2(7YCo$K-BG_RyCgf9Alq&eR9tF)|DOKCQ=c3bx=rdP8n=HMe70G0 zlbH#ti>p)Ty_xApkBT~xiVrE^b~@zW{=#Ay68%rfJ2Kk)W9P{eoA&Lp_K_UD{jY-q zbFpueWY~wCv*I0XJqE)FN>b@)rYKmeu99S=j2^a#{#S<5uNLgA4f_*HF+~~m_f3x$ z9CmZx>U5}1bCpnb_@04bVCs?KYgl{X-E{Yz^p~9Rb3dDjg_c{XUCu)p=PJ=h9x_xk z+*W0u+Dp!)Yd~1x4Dss52M(8Tykix`;iZH~r@5)qTz3BXs1jv7SIb&@$=~?ilh6j~ z!%gdWkL_x+OKCHDolR~#St{R(VhR$zj?_xJT#dMg0uGODyp#IdjC0YWjenkc;#eD3 zV}xW{YfWNG$(Q&yG@d_IBJbhJNjI;ff=VpJ+gg7O%I7^bYJUDPt#{wPKbpP8Ih5&l zMvOe`D?Xp&?E*_rTmMySk+MCi1)FbuES7He?AD__lSMtrivyEA74+8g`wSi9-aNua z-Q*1ar_mly=n?Vu(uLX*!SmQEmU%TbhH9!et3=7k z|82IMP;u#At4GlBr&nOxG^ibTx+Q+)G(B=i{6KeI$Pgn>KmO4Ds2@H7*3#dPIPQ3I zBy#kl$IVzDb)!=c_qv8rhlN(2&do!b=kiluIY>OzT8 zkwO^u?IE39>cUYA#aqV8P;;&*r9Q(99oWM2(tzCtHw*$bhOxpILd|`A{ zzhs8z0+}*mMs`+)~^ijS}g!8uBxsE*r0G;diK zbEk^!09%CEIuB!3g6m@`@ZKut%M`r-!L0?;%~pK@C03>AiIpi>_E$b?uylo1q8o`k zZe>PFfao9WIl-Z9v8I|yeGBuJOwEg2{K6;OwHFQvVuViwF&4R1&qqyyC&2Wvd`CVL zG{?<*oSd>g+JS2_veFns3sQrKLNe(GE=W(T%oN6n^rTZJdnkJy|nw847XQJ z?==%l$C`RIjAT3TDJPVhdum^U@|9K)1;ggw2#`gvK#Xc~(rK^Isab1GQr&FPLNW@9 zQiK9#z=lw7Kzs0HFl($({MPiq$Z4j?fUbYau;oHISehq(>VPx;u@K*NsJhKzP%C4W z)2({T3lBZiL|@3tiGDx@UbT=wVHtQ%OGf#tvTWbruwxr^@q{Wi1{lE9ceWak@^fl| z1AtS~QeUs8CIn2MfGcQY0_lvC46W!e-ZG1iJAnsH(7s3_x}d9KxX1usBcYW8A)Bc;59NqZ*P-Txo)qezGDzTjf6a6sPc#>D zXQ1;D1bhryz8l9EzPe69_-HX9!QlfZ?B-X6l^z_nIuRyVJp6~MFp(ig<~_5)W!lEK z0R#FEsO<JXE)Nk_~mNn812UI7B(84j}H#UOG6$1)Q9BvM=H|Iqu_7;A2FS zuwv*?bY)JTAQALlH(WwX(yp23P!_%pwz~MoYmb0ZJuJ-oXXLDqgm5d4cf)W`y29{WtWXu`(AfxU^6?4L3O@hh5Y!QY5rtMx1X#u~ zCU}CuN)BHOvRbPQ_Z=J;AcN}v1x@A3RKTk*8A@7YILHm+C)pHyss{#qTci*0B6lK2 zk?`_k4#@=ex>z$O78p=IfCmF2zU~6XuQD0-)zZ=kzLu&FEu_9I7dClvFg4_&51ORO zBOC$m^Ory{0r5LBLOEGvCUwZSjS_-<7?B{0uLY=W`DF^?4jJ`4D8u#&6l_BfUz>Ia zo>t)yY^jVQ5=(Sh5HSo$;*6HXJQkt821W^Ip*CA&K(v+Zcq}C6g2@Hd2Aobd@)g;| zM+Ylq`#A<>6WA2YEUXfA5w45Y9n9bvz0U2bW(Y+6lsE`DMS%3u4U+Y?lOWoof)q>F zk?lbBAb$k1ULeDs&(}XT4~;%cf$dm8k%Q+W_8T15|ENN{l;V*{`sa6X>B0~1nAD&& z^3NtTYD9=>YnNe+sB>H+UmLE=$(t}Kb5OukAtuf8sOcX#X-f|UyN7QF09BgQWhEe! zehBb{{6$V?Idr;<5qk*}p?-gjA})m`(-eU&0O8NXG~<-PcH$l@LvPUK7?=p5Ek(5* z{eLZxH2932e|84t0BtP_J`Dx#{q=wu{5+kG{x+Qn0zSicVL23Yqsa@MNLPV?oB&Ix z@dX&NXMA#vbQ1Edi9gJ@nhtEY5bZg-tG4q-M)3x{9J}t>u!kdA72Mw=j;{-u3e#wd z(aSrWs75nbq9>zF0 z%o5v&MdgRT2B3aVEap2SSm80igr11M@IL%^+pzik%tEc+nEd@WGu;`T1w1_!;>HVy z1L|D5{1}VX*$sx~_k`9}@ktBvyRAXr|6=xHl}`t(uv=!!%0*lM)@-cx{ugDECH1$a z61gY)pBPeGLBep5O{AYUZMjp@xzPK&pI?8>888A5rKG2N<;`G6+>{#EM_5>3()KDJ zZy#)6UG%~Is)dkNKp@oCgB$f=!^BQ$V#lJ+c(8g)&YA*cgR%SW9-IxjO}&DQpw(|P z0tqX4AIyAIX=1Wxl8)=g1wK3TA_lklGmtqHA+m4xv=|_yelld zhh}xs$jOgd6~872L%xhS5n3u=CXQxKkC<_DBw9|5gJ*Adc<%grXK)Lvjue@Us+rjAt8#a7?RiZh`6Xw zBkj2BhH9(Zom6c*qqmqP8@IR+N~;~CQ2)SKe}H=a?`U*CurR4hUe2RPoJ(2ENXa_W_%?M3ajL-nK>~xp4c^2)(^yW8Dm_T4w5o{0yWP$& z=A-02FIPd-Zl^oJ<#2liF1OE@xL(O5?20s%Kp)8|cn~mc_t^NyYh^Y10Y}B?p!(a# z;f=U?LvUcn+sZ6>BaKkov%|$yr{8_mI)DwS{~q3mr>S&A7rA#gH`&}Od09JZjf^Yb zD87<@Vs$%lPfqae0zWXqtz%n%7@3%26nM6%l2wV-C9V@E?`Eg-kshQhQe1N-DkhuW zly7^v$R?8!S$n|%z$YC$qfV;&BCm0qbj_ZQ8BsF$r`~id5C+rDR5iEtqZnFW$6Qv@yOS>Mj^o_DZn=f;xth~u_2%h7J%erB`XA!s$;jdE==Y6>_RBNsE3!)h zHj=75u?gbd%AlO>!PuSck>xhM(^mx}#(R8jJ@_+Ra;%T7=Npj7NBrpFg|ndyJ1g-{ zzWZUL!r|c2%=;&1hHp#($8E5rY$~ZxYSAH@j~f5nx!;J;+A7<|Iw4IfAn0ARvo2N4 zOypr3JK|rs``YPT8tub>495xQdKYTlR6Lzs>9mxG3|G5vp9-9|uM(xHV|n%y%^P*D z7xd1D$NRx%U2djRsLERGNXu7`tEt` z(fc!ZxsGYoE>BGp*B6`ok4-!^Q8|;-;(v0xTXH+?p<0b4Z=Saup;EtYeqdLk!a^A3 zW>z$(*KW&7<-9xp)EgK)nh@m!aDwR&ory`b;UNI<;mU9j%K6Gir$N~8$bku=c7jZr zG8B${;6a>5WxN14jBacglJe?*mE(>Fsxc>_6fXWDe)xZ4APDaETGG+{le<3n>9$X(Zm^Ny9fanuQVm7lDO%|zX-U^#QZHI0h_Ex2QXe&(nxc;E)`FrJ%3atJmPmMH)=q}^tey)WgKXb8!viLp-HSlYww1QBD(REjI zdd*0j_dzC@;mf`P7f*nyglP)6-J!^eDvYZSdI{tp+YN2f;0prW%>h0uZ*EY|aW0YJ z9KZ3`8OT7`Ma`Dq7Sd1yHFb!Q5k*A_Y_jl+JiH2A3G*^pomNMG0w;{`DYGz&(#M;- z(@j!CWb+&tXqAyr8R-ZgHTO&|;Cpr=ot^wJ0xc+`10%-bOLfV)34@XhD35kukl}w8 z!EyC8*xPxoWBN^KvLXNjX}iorGA=ORe%mS|s0yHKMW&gXz@xtSDn=>W!+ffdqKt51 zQ)8XNXE9O3$dSNsQ#(0&5$sh46y@8xc!PmBgs|PLvEr#228J*^tW*#Jm}8(o9TLm5 zPcmokXQHyi2sd}42KPPyJ$VzMV?TEyW()6qkhKP3`v!$At=~bw zb6@gm5K0B!UQ`2?cLbPzEH@}iNC{#kP5ra6V-*e$;x+9cu%@)kEt9?ggn13n)ydX} zd$l&^O_r)4s^*^Lulr@vBa?92{8n8<93794W9K+T_d^%rY4#7|DL*?bCpCq;mLu+IkIl^{l5r z%eddPwds`C>BmX`tR;C5HXUb$t;eQ;Zg-{7AWxni?T-7sR_~2h%R-CV0S)FfCj>a- zy2dTpyz|MncJ15~Y#xG~=^lA$u9n?F5MYrA&ZNC8?qD_%cvHLz@wE!f z2D_t;K4>vOGA<`F$mK?97}-9}>NhjpgPW5dSqYK(TUk1%w1l_Ij+YA>ZRmVhTN& z8#CAEi5M%37TDI0bsYQhF2&mn4W?SSp1rZPc+Y~K4?V%~=yLkyqyZvHBV4(I3mT0HtrhWh+YmDYOanpd=cxiNG?$spef^*q(u_fTIzR7h2Vjzsz< zQS~q-jC5k~^vCR-1@3JO4F~Wc#_ljOyu0{E)v-Es1vB2x)CrzmNOC54W^W(??N?Q=*Q_9PoCFaNYG%$a!!4C8IFcZ4UMmh zmm}3n)Fbl}gjRkx*<#~s&0CtbQknE9TH+xH)>ht|GwOGH%o~raat*&HpmydkR%9bn z0TCO2jmfqC8$(uAP1)@INNXR@AdQA>sIpBPn_M(oQKsR3xoB9*D0Nub=rKSH{$-bR=c$ok}PnB zN?=9aKcG3m-t(E-mcCE=fXBug2;0j!~}?>TACqZC9fvJ^QES9T^X7?%e0 zP`0R4IRa+7EYTA{-OUbtl;QN8i&XL{M1PJVvQ#NT{|Mg-?f?{u7SP?HltN&f=?5EI zF9e#Ah1#azW(626{5v9h^{fU75{?T{hrh$~aO9&4`{DqFL zS7PZHKZ)~>P%Dc#2y|peeKQQXaLAEwa9kI0{T!E>S>7t6W{M1;U;=nudW#eC7378L z>{M5hK)q!p8T;EVA9 zd03WeW?*IdxEMUb7Y9W-WhBg5ku)k?52ej66j@3KrG9uN9>N(TCFU% z8&{-vt#hC$+KKkxhNv;uy_6`R2@SwcsUDu?atF2#>*UXsDhu|piwD=}mlw4IkcHmw zg8^r)A9PW;|F(!==R0|7P+B6RC5;U+{pt~&S`A8sC@rw17`p0O3>+3KNW@ujL`3AE zocja_A$ENjZdoa|69Wx=;))6ur){{vBr#41N@~hOr1*2Kt~M>OAyfM0K{!oTN>=R- zr4sE2fjiFf$x&`Pfwr3s;{C;E8_bsR4RYS5QY;lPCl3hS`3)iD{D9@(L&9~azQ*)F;Qv#<=ff`KR*bV4H zg#imZw#vz5T?>A3C!GS$kCqJ?eC5A_gd?+}!2*BtcU8!A#kR)$v^ru)NiFzl{^3&zk=jv3WQ!cqGSDxTdISz*%3hmrIH?>QugnR0G*Q%w23^NrfUZagEC!7 zOB2+b3~@RrR@{YZD@;C!@dI%MuJs7^h=LEc6HVGsizG>G$s&G_)mV>BSbDhez*brM zH~%E7UQoVo{&>yc+iAHe`%zFU4rtL0?EZhM^A-46KF7);l_nSD9r?>9%i?}&T`#ko zF)UUWJvjUyg5p1XAlECIE)9AXaZ&BYaEk87S@-)3lZ~yhz))$>t{F&q8J+#7>i;&| zd-*Q{n`m`NR z=FU`&^)Wd)J&yWCCd8|e^XMyRC5-K2MWgi;`6S!A$4ltGL3QzLm#su8Akhzhs!Qs= ze?^Z|?G;IOr(sbILp?WTxG17yeBB5p-|TA8uh$cK$oS^n5A^Wmt!_@ob{UrZp=M_C zOqNhyQkQeatR;N2J8l%MYS-H*P!#{m@MOFUK_DzeVQgCYX+NsPG@-ZmVoUbk)0~$s zbK{YNsh75#6&V;~!fE4+Yb&h<=4@iew)7Gme_`yY z)?~v9%+>MyN7JV|@ACdpx5D+mOVK^rS(E$CD_1z$Gc!6ocG>^pA!>RAVQ-84?n`>> z@Q(DegW;kfwp1QFHc+_5)S`Z&Q)xwAl*X?07H7g}`w8r~yL5M^KQ!95lk|gNJ1*8R zE%H3DN32YHRajUMcPT&=F%+1H6<@}?^WHekjFz+w{mu^$u8KK8wOh?qE?}>I7g4Z0 z(h%>2_xa_1nMKGoyL@+R!z&A~(!9C?6avQCk6Jpm%6Ldjd0TG!+c+Yzvzuev$97Pe z-{BDvDN%oJhj~`l-t)-oSm?9$4qMYqh)?qm*IKgo`rjCdEUUG?axF1F9=EErZrv)C zIObG1wc+Q7Nqj|m?dgf(iPGh-4%+Fwi7javJ(_jjEy^LAmir;VEweMel{mKEJ56%< zLi|f(YuZk=d(Y1H3UYhID?SUuV;IBNOf{OWFEi9oyKCD+)u}E{JZ;f+F9`R&ONVhi zuy38Kt7Q>S`KtA+a{EQu2}%q{uQ+NyRsKNk-l>fnVC>iHv#m4x}{|W2?5<2o#`$|YpL(tJiSN$T(!K+XyX_P ztNLBFXvo^;>GGJI(@5G5OMJ@L;B}#^J>qpAuiBYg)BD=mqZ#9#%aI!)B$9sDRl(_) z=KFhHcJC-~=goQ+Wj&D#e$6yEq6rkpl1iKA<@a}|prnPt zOgZ2zA4%_dW&G^p)hiOE$+c0u{^8?^$o5TTh=cM7vp_WpwITb%d!NF@+tuv@Zq(Wx ziFW7i<#1P=K*v?8Q2&vamrYImtUY zO0xSZmyNVS@fOCfUX~cq_|OWp$0QdW&{&O98n_hJ$?kxBzbeSLHj- zWqd1{l(4;6Mo8+!if;;-iQ|wsqvwLHF@}O@Ky{Yt5xxm?77|9NXTr#=$dOb;!52;o zaRf-_{}0p}3=|-ri^J_utHwW-`_Myp+h$v&{%#aRo}Ck5ExRQwH&{IwbS?tvVo4 zOO?7|(9&0{g(^6RC5}edND05bGTNMr(Pd0IYwnR_=15Yx%1Gtt zK;LTajAW=-(rC_76s5!WJLN7cN|*Y|E$O2A*0=ip-u?dU@%YwPYuo4je!X9>=Sykh zV6YsS{*M$|f&=6LLfz@hFHHR|WsNT8`85)hMV0rQZt)$VFc}(0q$VAt0|#tpx{ndi$S91E_@0B>VTfl4@!7zgMqRHu1{eT;i!6q?r>phl}(Eni+) z8=9=gW~p+}3cv!?Y+y9Srn+0 zJ@3Cv8;~I^I&Py*i=)#C8Tk>h%*>EbotSTurgC(@g8i%-0jvMxgb{nlx&oOZF?vCQ zg8R19%C=m= zw-TKt*t;%rhk zAo?1yR%@bUCw=2|E)aP;u0X==d=;7?QXk=k0&hd})hUULCRkx3^I{0gIhb28?tq0Q z8eGB3L^DMBKV*A>5`(zD4F0vpY?q*7T?x{B@6cZ=$7pk@PN+N6B}%%dp!`C_@-BsW zxtixYRPr=?xP_H2c+S)I_JQdWM&z2|HWXY(^ty@2s7ege7e=*6fS&mDF!fLGi>B0?Zri9oXQSFxO2@0>$e{-cKmhoHgRVZKwZ6>xX0Y&3|9`jdbs z`psdB!Diw&e0I@4b_%Ud5+QLh&e;ee3O!~j(!Ajz7>%BHpgGz~IjASEget%2p13lO z^YLVcM2kxjEev=z(1 z*eiGiZ#9#v85=#AXdWgF2o>vJL8A&J5|3%4jwk6nLaRemFB`auD%M1~-1kg9t$vvh zKM2Bs-3M&M+TJuZV%fh^GaN4rAUF6KFGUQyOK+ZqOcJmXSa~LDMetQw@E-6WkbCQ% zfwmePSRT5#>dR6^6fTN1#$Kt&kaaXqgl71)H4PY|5(w3-X`UJnZ3evONr)LR5MET- zuwz7~K_@jL)t}X64S%oljo+7~iUtKwFIa&TkHRqCtux-SC|o1!u?9&ZhG208m+T^- z4W}zbirETAXQbbjS5u{l%C3ddaA1L}3oEk(;GXB$0zE_?F>bIut#3^X5i~rZ)WO0D zMNHX?A{5V#PautQB1<={ZnQa*btQI0pL#;~U6*;{FNV^Z2OsvB?xXfb_BlCrtV_w? zovo_=@Pc8u)&(X7Y=U>boH&u>f03H%j@SBp>FK-eD%V&myl=<%4#+rE>h789pAZO+=2aA=S30O}3xDUgu#{7p$RF))vQ!TmHrTd@r?pRH&y8oqtsK1Aw^N~^yLQ2i_K0=jpYSbb z&fWhSe52TDZ?voy_Fzqfm1OWpeD3vRY!r3T%P_!maL=~Vt%dHouWG_a z75;ru>F*&`ZT;}agXvsN(o*oyIQ@lQXQBxLLFrR-f#WwDH}*n1gJ z%rAYf)Ny$3Io6>r%*d@~3s~fy?8UDpdN^HZ7V(6!;L|Q5{y+TEEDeRc_&g z?>aKshtj$qRpaYlYP5Q3VbLV^`+vxZbt_4S*4OhR);JdRP~MD)pXNXR7J+qkJVTtXuJH8zD=(p;C-q@8v`1dMX7VZln6Pj|sMnUEs<~swmZl3;O_Nva^X(#e z?uG@XB?{MX6v{W56=--C$o3eW>$;nK{M6Ps)JemU+#EHm*JOP8oqU&FeQjMYO%2YS zy-EIeBvu^0+uVegF^fwcuQ#-^{i<^~a`N+c!W+It5&eMNIJO>DVBI^@5K|dpkTVLanf^E!co5hx4P*n z;{Bm;m3mhzJmq_U0qG@kWrv%UA@<+L`XN)6Y&DLxDWYXR9~os7HhN#%iade0vaC1o z>{(G=9%yH^WKw9EC8jp>QSNa`WZ z#Y`o7C&uYEkRXn`fiw34hVP`Z=%vz01|B6V&JbNuB~V#!BPW2SqzhlTZ>JRni-`^h4JSca$_!?l+IkE}B4*6s?U3(h+o286c@LUk%U{CHwj|j9C zB!w~&EmHdr@GYiG>Zu@oEBnL{i2LVLIY>-SWA-C9I~|POJ)%J3%$&P|&q%4k$-dNz zV_8L{wp)Jc>e!Ebl%_T>Tlq)@h{`=gCY82~!Hdv1=4V-vi=b4?|R`tt4;AD>eI<-R9%h!oV6d073LXTpx zz%jAYOxuUl&w^LqWR97o3eXuVbo^5`X0Fm{siGM9_*slzAB^CBx9z;jLgyFroSp+< zyZ-mjB$oKXgzSRQ<{Xh~iRU4Jvm=jqt>BS{opl&q_xxfc04e`j&x|8ar@7c$kwm!R zopQfYIH=8SwsNRR-|!9$hGL?&7LYjbKK6_T*_Qq)HC194&&2O-mg7Tm@?L{)+ zy8x>Lcx`B;JL5d{KWXaZHXA=?=Ei|6IzD6wr98zfi2zPvJJhfA0LE<)f_+hKh$$=( zMR51}3pRy$W=S(};b32ogI00aG3C??fDSV6eUB^)IQvHAE6~#s05|D@iF`>6L=X&& z#o9?i_dB!ro$SGKdea{DZq4gguXDyqRVK802R8ZzJwEa9nX8i&6FcmhP>*x4 zww!jScx<+8ej(|&sN#quBxwv923-_>87|UE%qt7rb-et!J}LALj(Xl3pf%o(X{E~( z%l6khKgBrrSbg(xa&jREOt-D2E+grBN~O8$684l`D?sd`%J^BquIZI@L~eGiR&~Et5;tsbXv!n zD-u%l7niB~tzZVuw7wTwV@gW4t7_@ze6HyuPgLFxx46AA_>T)Sx*Gphw2!3_LTat= zv;RJqC)aClUB^`?@5?!!R!{G8Yw!=}9#{7hY~8KmcA4%*3pw^;^uZ1uLQzIIak`ed z_m9X2PY#yKb=i>pKjpAaUHKv2vBpy{ywSrN)#LudDM|hQs|+0_s~&M(8f*8Pk0m_{ z;&OL<)y7?lPcK;pou<6LYQ6C2VGp_U*g`-Ye1=k%>L-oM@15~qtm@JTaG3mTO#J5Z zV8hCh0=qOeGL{zSwZ=Cj>iH+FR0;lq_8F8>xBSaD=*EemngVg}#GMmidU;L1Rz2)f ziuC!zpaA#nhC-x{%o+z1b(e(nHB9XOnJQz{XhBS(dZTBb@*mS@OcX;(57gxAYuPD% zqY6VZJ{1gJPBW`9wVe@`J0uitiTQ9rD?qaPiJkf;K@shA)QCeKYe!5OFR_!8dPd)I zTZ$z%XMG|MH8~uwVF<^mH9%->bzNTq*7^`_gd5MP1k2 z>*iY-uEh&DebMD&5feJ-todOP>UoQ zxs?1tkK_P_z2>iK$^usfTE1@imYVDoxgVeEt{(Q$Me$~ApY~>B3|=pyiXBvJ@Qs8? z?HFKfiP6Ot}6ciKIN#RC>vG$c<2+CQ${Tgn#9h?SWyocX%Zq z%zPq*;$1y0%bvxO^3WE-AzG=$@sWMU4u0B;Jve>KP;E`3`9Nf7;*;UF=)Nc;J%S;D zbgtXjzAmV^SETQIQa5?mAy{ zzBIDbv%Ca%J3K%6+T4tsmP$tj$4u2<0g>6Qj$SuiE2xAg3bco`$%KSRZFA1YV6As=Lx`*)|>=_QFbt*>|OlUh#16OR-lA~>e&?OI@*$mClbBqBk_2c zoKxXi2v{p54kKX7=K%(k!B?1ov$euUFuNwf1Div-ecMl?b1;U`nB9O1vv5=y`#p%L z_ERz6{b-JE5YAHbLOUwK^GX4VkCkD(rC2aQ0L&6}*+|zRP+yaBJ_aS;Fk+;uKP-!75GrKw=@ zA1Nv=fT%qT5G#F3G;*%4;we&r)_q<=S6-|mRSQujJcTGrJ)#;m+j~i0HiZvabe^`)m0-lo!a<)e&vb(gVo4OP z5D9BLLl|kloaw~B^j8Uk0e>8k~ zjPRJCDH6;0ENpu%$#PRauWLRbsEeyRG24CqJfW)vvsQ7-su0zoxOSK1n&un!8QbL^@@OKkKV#e}Q2zo%S}7Vr zqd-*~2CMk?wpkP&e}#dlp`gyfyP0Uxk7%K5Gib&_0sl974KzO=V}_an*hx`3%}9O$Ub!B{pb|A?HZ01}N~0GRR>y7Ag-TTvKL9p_yjM~U+BrXiCD zMA#o(q!Whw-vBtA1)vV#_JX$pmuxl9F{x8QMCL`SVSy;jMKEnLN*LfR{^*BrABDyQ zDc)?1hFi@KF(w$a;aP02(o@&&=;BY;;OdKVrjM#!~@yjSc*g z4c`)6sM(W1%MRfX%9ZXSaq>ityeXjYY+&L8P%?&+EQ*!=QLA!Jxq%Ja%c1TRfgYC4 z(e{=D$s2lGESdUXJw|m03vwYKXS?X7hA;b<-KUm?9I;?w4f%l5^HRf=NTG*N!HF-( zhWf+^P}JeN1ho+;`6UsFjRqIQ5FI`ZTp2ODy!dy4AkZFAFjhm0`39KAieXCS4ZIJCkSQJFk-X3j=TmSXDI+56dk4qQqAU#jplQTBsLsXsgPUHFr4Tj< zF6Irz$od&jkqyMSqER**eEaE7&fhHozmi}yA3TwbRM>Ps;{U&rgv3LOUzY8dUv>+N+)eRMMBp}K*|q#!cHXfwHht8VC~xVGd$ z+&$!=hI^rOUcCQ?(F&R4)Tk=NITCHTXhuQ_o-i((+kY&ij$Jl)i#g44jeK*(tlXSA z2^9a*N|&vIy|=5Zt;huy{@D>L{Z6e&{j+=db=NpnZ$stXF8dqlpI65RZ^{X8zJZ~d z-M`V;@F}7z4TZ1_ahzc?KY9 zG461Qk*sVGsbkeH9y2Q1d10J&)y&^)eh^pDG5l~SN$%z zGOeiTMfu}rXbB8!%j3&QMOyaC4QqTqHOWbT%7X9g@{|0-fepCPtSsL(? z!D<&a707L1$N5wl=yyb|Q5{9G=vb zY*g~D=ftz?Ij2e%_9m9`R~aV=W19Yuv_4lRKkQSBO@54Xe8=9H{VLygTcOXf#;j4X zK&n%0Ra``T^JQ-8UF>A!*kYNq(x@bR%ZVNOsftqVz0_y?1F`z1eXjA{%owuE!AzTr zGkf0_m@}=33F!hxaNYCmF82;%<6Ow%#bvJIvVDQ^&m6iLWikVdH~)}EiJ0LwH@$Bi zM<4@MT<+>>@(Eq)y=|L&U*nIt`p{{=qRoUF^Rz_CfNcGj$i&jG!2@GXtPZ8~^zJDy zKh0(r<0m^EwYJuHC)IzU+Eo6PyYFnmH+E0_iKp#4pFL6sO-3t{$Gse>g<9`Uzgpi; zyC5V`dJKUwqlZ-j0os~3$vaj_B@CEpqT_NhlAXk9EH-OR}; z+G%~rLI&UZJwUwa(7L78gU25!oSsY_xmN1ycBH!d%QpMXdJNIxsItdQS*}OtOXE#x za$=$RAHBGcnUhuF&kk8GV`gN9o%acD-t}}FYirDYj*?qduq#I}IG@75XnDJkkeB}S zY50*_hUy!_uVUJi;#5@d4eK1t4XKrG8`oIrJXUB9-gZTY z-aaE8uPV0g>(&aTcUe~#ybF6ZKsvp$XKb?*Ex&^}KxAze2NfNEm8iS#li?fQF zb3nQwE)FDBFw2U<%HhGI29L=6W;IBJC|DFRrGGvXkw6zFH_OIb6BQ9VslG&tp7|{~ z8$zL(Tn{{;AequG5y{};ci|g=rUqI_DloqsLdMd&baM_?7XA3J7EUA3^T3Qk)+T+n^B%b*+ zn;|DR3UTbB-cEg<2*j!Hg;_ARj=WtN7M~Z$r0U5HLgHe$s%$%0{b0+jh9lxmuO9v*6N{!2=3* zJy<;Qps%6JjfnhRqu~@zegu;t5;r#NqQo$FQ~K3bM?}tdou$g@EwZ@Q^$-tJQA(~u zrNA9oNL9vHDTwgTvsmxg zJqw-@wd%`9zruK3>uIKFL^lByZK?lvvI|K|7Qs3(>N`}+Oa{B*k4!e+p}d&5Hl=_F z0Z2+Y%nw3Dt{#D5_1Au+WrZvlFXgN&3UxEha6sYPUlpokF_Nn&FPZmrn0qe9;4PVk z2kK~e;zPr0UD3R#>!xmDO7Z^7NJr`&$Md=JC+$ts?nVgF?b4xeOuHDJ9}VR@yUxnX z9$i2aKUr`X#wlEqTB4Im`ej;ZCI%$(?9bI^b`T6yDTmx-iqwc=n#Cwjk+M*Kx2!}! zybaO0QGErzV&C_Bk?SPU-a*7`{j66ic$H;~A zahY{EY*Zc;(?kvPU1Xz0%ROZVYyOcUkhLZv8PI*r#HSQy&L&T%F%=T?*y!P%cp@)? z&B`4TB6h-1d;3`=6vA~Vjy{+jT)Bt_Gh1~)2I&+DWT(Xy%GERkiC{=k)rh@`8L{k$ zq8=%}$V(CF5iirUhf}wG?FxdMhLg(A*UZbt4Xh9**qb%&Yf(^d7Y6(m5GDZ%wlSDM zEcB*PHGdoUrT4x`jW9$sarHX%_jpHINQ5vHlU~MV>BKO>$>0cJYQ7u>nk(XGxri3U z1u;~DSrt5!L|dUkhrNYAgT_!e1ZcPGiJgen4;pMVw3y+@d>F2gMM#}BAPB6hLS*|R zHRBk>cYsR+vNTjt{@aZF`EnN327gCmAp#*jECVSK$xH%q5rNiB)LRuRE2K7sTY zgx3BUc2SIQ`rX3vdj)1f?v6#M%mfG?Mr$0ZH823JtUx}*gO$Q5@4!3@2LUjLCk=$S`;jZd@fgsb!~oJ-<_w4sPluKm{F)#39MuJZ`FP~MC*BT%)i1`5D? zrVOIr&sN+^L*1-HxdNqHipfOCsqKS~MDO%UTo(D5L&WlY*%nMIry=Y*` z;>l7rRL97eg&sM~UYWy`ECOU)5z+hQ|Mb#YpA?r6GmFpF9cw>TAYI_35l_^_Fd=|? zIpA@_uNN0yJ}X|dds-s%+3MH+61T+ZR++9-hc=u`A`I>`8d5gA5S)aq3$w*sW=YVDB6EvL;cwaX4TeBSVRwL;VKQvE59qV$t7 zsRg4(|KxTt!-g)MUQ^aj^~^@pC2vjWMZEfq2mwSw&wKoBq|MoExcrETJ7#BNtE-mr zK3$IoHBGJ&2CfQTH&Z9eYlI>fMX&VGiNB`&b6r=wo4p*te5N?CdlO;CrK*pv`@rT{ z@Llf6s`*Qvhw=7*8E(O(2vw)9VpQl*-_ujd5l4Z_A+s%G5AsDKE(yxoS$x-bt3opN zOHG1jZ-w%PIjyg>_L(WDAIcV)ria?nr3t26O$c!~1Uc{Po9N6p-*TVYs(>y?u)ze1 z12WS+Pi$j`l&SM<9xn#1+AR^Q-F7uYdL$Z^B@OYz%s#f((LfH1k|=!0D)-y)eTdqc z?;f$p3~8je4|)t)n9` z)%sn>2;xrPEtG&O8G9~A{2J&`ZJf%X_z0tuAKX;mP$)qk|BUYBTs0rqV_gq*r|GGmdvtc_k<&;9)#_x|!PV_tX{fA`W z1GBbC89(E!tu{`0o$zAy|MlTZ%kqKMp=Odl>zB35FNKQ9i;iFX(9$@bOQKQ2n zVvn7QP1&Nyz5Q!k)?Arc!I4WPKIRyg}VwoF#3IejoCA?DJ0=j#RATVL(}c0Zz) zy#LpMKzdv5&_MIzLX?bi$7$rwo86qQlv^|8&H-5RZ z=`=?Ye~Nlc;N7*R)MMLLzvHhjP?gGrt2R}e{*(1{>w}#oW)z13)8f5}pHA#h8R%Z~ z301b}#JjX^hYA`MOU0SZ_77C%vkqK2m>2eBm}hF{;SOX zp1Wb0!VT)sG{e_s59aRGL4)^s3xhSmcMrtwCY}2a$^M~JJ8yhSVuii(t>^NV00!HB zrIR#_uW|QM?90BwmFFJe)sOz|MabL|kVY=NLl`W{QC1NpIHH~^?AKVGQ{XM=jH8B2 zmgYMH9(3LgQ&Hcu*H&q~Hp^u%CLQapl+D`=O)N6Cj`zK8?DzW$wZG&&Q4{37u+yQ_jR5WhkbKJiQ@jCOHIF3kLE5 z;1D7i(7L_3sEH~B`7K)N!DD*+v-jZPgLpcKdcHzPt0O&BscgaoLot_`Uh#WSz<^yL z5yaKrPBh@0bQGa&7yKqZbuc@mmeVMiqE)78J}tIric9KoA7YpBA8eK=o`X&W&5Bw` zXK{TYIi)Vd;;rG{Iz+mlMFgUPZj2lO3DIem5}-&Mbq^q=Z*f_A{d&qiK!1k(w-0$Z zRNoE`$`;R4D$GmiZx(hngg(X?^HzF;GyG$nX zmog;3PC10x2+?;B)KSvXppy}YEb<8$f0mM)QCcR9^aTs)%-^D&HUZV|3kDA;GM-M$ z?1Xv_FExGqP!>BQZ@g3=Z0f@dM0A+Vz=FR7Nqhkqu1G(WqKv$|8s(ZNT6_pM=dVd} zvos(cevG{Pyn96WGck z%7FE}6RPcJ9pL)J5>Db$wGkb<{W^`<7e+Ex@@@R&b6;2*G`2xXO!cZ8S*oA?M5~?# zXzO#ot*?+N{3`B)l6dCY5Drq0d=>K@@*j0{mHSkom%mEO?7jj`b8PgdBePWR>{sFn z$;_WL6gUE`z`v~XNV1_tZw(Aa)#5{B8Fq*hhYseWdTR819-E=_vW}j^5=a2-z*V+4 z&5$gKC7v73LC(dY}{RiM;j$@|}b7KPfd8Ef|f>2Bt4A-oE(R>JismW|6F6pytqv6(oZpLe^loQ65YW8A|8o@8G_Qvz{(M z;O@{`12ubiJd}>7Kw**)NsuB5wtk^zpP~_-vPZ0ENYsDGW0p#U7DIs!XDl>NW)3Fj zeKo-d5S&@iYp;mW#(9A-k4_R{M4}4uzid_|PyITS2=ze0NJa{qqYj$7{?iE!CJtn1 zAz}t}W{h0`asa&e+OTh*`w6|NRTxdGbe*YG-=_uL7$rnYfFxp0|M4a}UXCR0&|l!Y z5M&1-EMS}tE7}u=?Dl4<;(M0h-cXv9{A<6gHT?SnB^(R3HhCeJC2KWZLYFgqs*Phj z;_aUnqTJ`4(CaqlM?>={1Jy~_t0O&#XtO2UEw^2&Y!4HE?WCVDhQgWcCKW+)3(vEb zDdc@0BHbhbi%>CwkDSPv2h8IEzeSY`kID!>Y&YGBD>>zwA5wOG|F%8Bys4|bOZw5seQ(BwQT7M3%gp4RBv(Ku4_9D zG?Ch!b_vQ=^wN~HYbHH<2kKo6*9ICns0-2ojxDjQ$GEYI^y89$?$$m&WE@p>H3NyD zCI+FdMCr5_cBb0*%V<)*(DYrENuR6R4Q{g<%w+p)3sU&ZhvZ9{O@*WbT4O^6LA#x= zXepS}`Ne%rn61SG;uwN-I_(rQIwnu_#h1&~?K<9Ekj1HT!gP62JM3JVHUwbE0U_c| zQ=tmTZWjYL719J3|CdI+!05>Qtv>a=vepAOfjL6w!P9GRpo>Bys7(_a9!CpOgJJu`J!>b5 zrFSy+m<@hK!r|Sm(|0!PkSmuPd%SLkQRcZ6-!D>?6M`<}>qLV~ze!i;dF2?~t7#L7 zaYU58Rn0P+=9_|-&tuGeew|)5c&2=tx4XvS@;x4ZT#~MzKTtK=ezRDkXVAfUzeOhX z*R>6i%b4m*Sk1WEh|A-ums_NWAjHTd_=c75#Fc z8F*l0#Qkygvz=Z9+l#i91}~}Hpr|_QO9MHZPL=%}II+CTS+H|(PxJE5SuS^nqQR4~ z(+=^J#^YnBL(+B!UF+{04_Q%BdhrM2U&>qyKdC1C>^+&W#lU{rIC-Rc#gnuR1D(49 zc7+L2htCgPi=92Osd(oHht-`;-P_s|6qUYM9tgar*)F)CIt4SWhT_%XTZ}z_7;B?$ zspsX#cXDF;5?M><@&6clr+aU)w7nbXx~TSi1$Kt=A9DA`RvpWfd=7jb@90KE)!mN| z{p;qzQQRwsL601Z>lq7bTkYjN&-&cTpO)E_x$R@`jiPRk{IKhz{J;$w86hv)B#M}_ zLi>0(v%sTsEfYIrgZ@qmIhA8*rqJP-SM)yED4uhkdMSA%=k>hxyNDY%6N!jgmMDyU9CLin9SfPR zlg+MnkHX#U;`vpE!uV_S?9Ad(v8&x_t1b)SA9qdPY*^+WZ5U)G5lCiZhRx%p{dYcG zTYc5j@HwlOG`SdTLLSi0*P-lqdxg<`e;r=u(YL&xCHMC!BwuZk&y*{`C%RcBsNKk( z47uib7_qNU?hW+TXm4Y%eYu$;EPqn^JXOHRv z&-;#NqBI}*dO6u&+h%^7IVmkOq|n|*dnRGcDk=Z*IF*I!Mh;y%yPPW9F2Be4PaFRW z)~dZm9iy)B&MEX#EEIUYH0)xzVC+2>h2marp(gu9E^flgP%j<|`b?XecD;C0{|pwru--uoFvV;(lMM&yH5HzF?gVeNaO;kBi$ zzc3(-7lISyryv-S5n-ZEua(qkPO=kI^j%ko5@Oiuvm zWhxltR&GCcLC|F$-Km+lW(!VkVXLDNXV=W#bL8EBuD>DUp7u0{YBi=R-R$q%?|a_S z^To`rg>u`#o=zBoB~DD74~RKEU{Tx*!uQF`TvWqQ77O!Tn(Nf_wE_g4gVhoz$#{X> z`CwdjdaA=J&Jmi4thG494kkYLiF_LBLX`}mji!-FkwJyMgzK)E)_Z0K14*xGL+pJb zn1r|#Q0Uc6sDJ8HY=wiN?X2fe9OA<95{#VMfM1WU59BI7;y3#@e@ak&Q>|om~p9i zyuj;B{Jr^+f)I;&NOrwmfVdM->M|CG8xR_V7+K9kt?{$eu+IyuX4*8b_3fd0Qq6NQ zpq81+7(hZ1;dFp7ga~-8YY~{&p|k{=6?jr3ny8xgT`C)rIFyR|GUwn>22zjHlNL?X zO^ONf_K-*hHi5TgASjB#Hm?eG4l_ixH7tfyuG~S420MrCoWEZ86o)}npr`s9VLsQX zsKE^!+zc@N$zVbgluR>_UmALA|AMQ!+z(S;+yu}oj+qKZou1fpp^kL0 zN94&lVwy#{N<*2)GfUJtvQGYHod~!S3IN}RyUTN&v9BeSEHJe(@BNrim?Ci+DIm1j z&za%GMn>=trju0NrxL2IYIyU#r_5Y0>@Jj_rp_ID6VR{mgh*r%Dw*jHjsPeji6z^g zRUoZDe%9sRRdGRuV(d4bqsl4+80`e~X2L3ozrj#5A%jMbs<~|YsMsoHLMW#|;3Cjv z=TVt44Sm`~L=C*h^@wqK%L=*jSIvkx-k$~ihN3U??s*}HBZp9}?XV)_8FH!PXMu~Z zrw(rrFj^$R-N^CSV1taJad}J*@D^!x2r!vJUk*YIQn-x@IzSou43rA3nHF?wDaAz8 zIw7g%EFVaMo6GyxP}CfZm}ZC8$s_m=BF72Cxo=Vi`1Dn?Q~uwULS`GS*=P!2b%4I5 zM6|8L0P?wPI?YYVi@`qkkC=+*%bqmY$osALi5 zgNS8zv>8K$A%HYNszXXW=VgKrukld_>1IS8}%)6#BIy&m|iHdpBp!Na|z zs6g>T6H`ZoC~@AuLkNYY(XG_15OVmj8kRuNerd{NM_1_C(>+PLw}AldQwtl&cp)u% zGSLZDoF&0{sdd^%qZJk*@Gc5<7z8vAI9(E8mqsUc1B9uQig*LA97?`rh$!-v#$|T2 z$@04eDs@L#pBNPfTfJlZ{|JpMbu$8n%G>2`;XYSZn1l53wyzI++p6Ylna z&x%bSO%#@1%wN;(UiHe&`1G50HgB^XFFwT5;GkdWlc4QKs#GK6f)o(z%j?yzu5}6= z`B>Wdmz8f1 zU|fLzC^J9G30;NqY`lLn|KX|j@uKDH6wcJ1Om_UPaGVrg_S;`)cZ z)zT2zlJwJ&nR_A?qwCyu}&+0F{e-m0~ zo?i{VcI%7u&5yMQX10bHD46RO=eswkPLD^_ow?l0NEx>4ox0tfCc7Z4GyKCeka5Sh z#_sgB9@3iEJmq+H9^In(ZDR1%Zz&=-l3oO+!n)$z(t*_Bq>z`*Mk5Bf>h!1;$r~!m zw5G?$iZA!R-~Vjyd%G9%si?d?z1x*rV#8~8R`kqAC*At%*?SG`fRJ|%d3m4fPG?_m zsgXZtd08Mk9L|0B;mz4{1JT0=m*PAU5}UeW=FfREiHf2K4CPJaVBi_ap>-R`*Uo!y z`nU6s`ZPlaUQ&JLNrON2>z--G1~IZ;_~bpW2$_0P6!_rz)!WuTkK!^s4xJ8K%1B)IgDj(bpELILiaX!sHS>2{Gn0Ni_U`7HW*#t%>6%`jze(%vH%+}v zg(R}?vPADQZHc_LYujvn%U4~L9p$+>T6lZD<4>PBaa(@Z^`?`7i3$b1p9*Z!9j&RC z29|fkb=@%U)umrkFAJR@QWztd+cu0Acw8sumF3eNPWi8UW8Csc|K`clZY0~3lPMP% z%_eW++&5ff%-`5e$CEMdyc&DL3lal_@u?o10PsPaCbK_7T&2yAu0% zn&fx8MTO>QJzKWbFha-7cEo#E?3>jMTLgz{Bl1xc__gEO&b_s%t=NR4Ek)W9d%x0p z0#+UIa$-2*UTCdIOwCWha7xw8_jxYRsOU>c-7&H5gvJX-lmy$!@OmukL^+ue@BFMw z&bTUO=k8+nC|B3ef5w#OoM0ch|Qa6P}odg^DMTn`C;-{ zQL$p0+fqYaW#pjQ#}$3eLyBS*cOo*=lCqMK!qd@ksU-UobD z;vg?w-zvw5hVYDx6Q?a^|4dz#AUE|ZX0x#`^Fs2O_~ zSvlKXB^aQyf$vp0!oi{3B2S9B%9>-Apxs4GFlsW8kKd%2<3DO?;3Cjxmb7t6%_Rh! z3IFa)4Vcp<(`lVrV0JKkevaqcTiKD1(OH7PQmPq+i^b=AVTjrU;>RZ+Lc+ zi}ABG($u_zL4Gsx9occ0rwzA$u%asR?7~x({2ZLVKSs)+br?vv-zWxA zan6f>&nMUs8t_);+aIBk%FcTr0bOxkh`lU>X!ZMvEX63US@(X7hBt~TWxcyFBt*5% zAs=DosfeHRU#Aa85ULDI`u5-OT2h&RQ9SAgS3Xq~kqFe?0L4^5CNDwldg~7^%1whw z14_5ONsyq8)(EqUQ)5jkGbnoeER~2m%yj{`Ob*sUEonHP|ozELPKpZd?YmI7U^ilcYqqglHB%BJuP8rj)S;Er?|s_eSMaR9q=Z+-8=;P$^f)^W8sfZhp8%hTrBez zE>PtrjU+b)FBq3O7=t&QE=bnwH8Y= z7o4=!F%9|%h5;sQoGe(2D7I3}jt0aaFHcH^QalA21(l3Mpv)7c_paE_hT>lp$dw5Z z4y1B{`16K_LMEypk`dpD(Y(=sP@vfyfmE*Bu@nRk0S}X2$BDhbmrku z@9+PA&u$$PBSS-$iJ{Ffb*%Na4_U@mk~)^ka9S)W%TZ%zVw$m(Bn`$|M5$<{tQE~c zDybBaq*a?b=kvRLe}A0oI@fi!a;Ds``+hzjk3XmV7S#4z>p}QU z2qBR`s=0W?fb-;H|53a}jmiq}el%E|L8tGQNKp zKs%jok67@IQftr)Fg*;Hyj;sVS|T~KL`}z{oN%Xv7Nl$%s@8?1bW1KZmP2J&q#OoAEVPgBkLMCI~32Je1GpGg~+HSS@wi< zDaEXP8`vY*pckL!-aNe4l_c* zoqm@7juY7YSNt`*y1B8Qo&Q2*Yb>;av#rWoG9jX8Gj!ehuHIV{8H~v6zk^E3vaiszKFYiE~TSg_ux9a7{yx0-ri2WA?hTswYJyT2*#PUTDaUQ!+P++Uu~>8jZ)wqM8$B4^d8uU}WVZ+pq4mx-DQQVIH$ zBI~89<8Dh$f7#ihv-YZ-H|%YHJ(gRaX|yV~b$!D322Z-f@cyHl<1fi6-#a^I6(C^4OmD#?Q-P^CND7 z+dpBgXtgVum^A3tz0SD)Lfa9~vi~fUJ1>l87)7geC*Pr2>XEX}7aiQ&Hm`VX}H66#sU?@ivBez0a|^l{z!Z#DXD+hh+O+2n|R?$Jd1bSJeq zqk?F&>uXoJY!5$dkU=&dJmFiZPMmoY_;4Tlr!*mW3(4k7&kf(*Y{{VI-oT%$NB^+D zZ91OuKwt7M&-!HGx!y0=D=kF%=40NmPC7mVIksb?+Xqh54*D(Y9_}Tk$Btw?>5o+S z+^cWleJ!GIrr-PEcMr~Z{tNf(3VOloJ3Ys}hL7aQz0MzgfIRDc9>M6&O6iHDm6$lm zi8P}QuEnRl7|iVU*sF9T;^;syB%$!(bRYKtZ&kThoReP)TF1$)eO1Pq7ye@IYAah8 zrJqg5dLg?nP7!&54yzmfhn$w%{8(0wkzr7KO7Mp`)cU;W;cpf8UJY5k}o>DrIq6n^UM>XVws z?kCtRJlg4*aM9|%%_Cic?)T}cZB#GxWB=8v3s>wD%f5Emdh}nj?kbB2;a{Y2o+C59 zA!ZNzUoNTF?d@eOaF4oY7<~yyxBRY6P}-B_zh9paFfel_UnQhukmzga@#p;rk2c*# z*KwtS?eeAX%1xIx|BS4!p)Yqk)EZRrhxJR>;H06ZQ|xmmdiA#w{XGv?OL?hDdEYne z;ZtD$NUIh-HM^wYU~LvoI^#A|om-lxlBK2iqoA9zm2-c!@ArZwW8{a|y$hwu`uGTH z)a`4bc?Wg1`3*|@w4D>ZgIllv5BXY`>pltRV&-@h_!aVb$a@cjFJ468c})ZCU`uKE zC4$~~l1u{&Lgt_dn*~`rW_cb1_bb{R|Dg+E&d#AK#MBIYXsY7?#8G*eKB?Q+eB$Ch)1&DPNhXchs%~c7u zd2x^lvIG#dOArvk9#vt3oq4KiG&VJZ{kYwS5j6`$;g5?l_6$kbVuS3fWRLgv+7&|I zZl1|R4n%073fpOL#SJ07w$o25K*_*jplD(EaJ}9E3_~K6XxYpSr+Gv?^j&pHgDFCF zM?pNSFu%Bh<_5kg_S8_*yFa0N&O93EqCJ_I8qFCyT`L$}2;VAR6D?;rl;u@i7)E_U z!_uNTl(q+dKU9j)tV3}8XcRbod^)RCK>^n@l8TaBRGE@PR4A#ED@!n$7PBZRQh{=y zot;x3Bd@y*T?^#gD3Y@DqqIo!)$&E)qUWrlkjWRyR&Y>Aq1UiUT;{QMb*D6WmDp?6Hp=pd# z1$R46IRSrk2y)^JK3Zz)(DsvkZeudUB+X1>S$_smxUsG+Ys`m||1;)xkZ5B{5^-rgy(FLm* znc&qBzLIGuEkOKXXW6`xIq)grnP3X(D!p0v^6GqK=J`o|h;4gbGO!2sdinsk&<$}y zXllUcjXMV9LW_C~$SqPQTz}69Ub-rIkDNqFFpE=3t;P}&H5y*P5zRsS|MpQ7Y$$x^L-h_0owyv4pKj65 z>D-qt141<*TEH4~27c}7r#jVRq{1RyMCo59<~CnDH#7yJJE19ZV`72AvKLj}2K;Wb zNYo*hyGT;3=PMwd^YQ}oek=~y>qsmI$W4&i0kWuigaii<04mv74mQ&Fjj8dJ6NqjR~s$nvf`nuE)QrP z_!%PqKjgC!1S;UQH{n}_J?ASa9Rf4XqY}(f;o>c4&s7A?p&3QW_^A!lIyZksl+0=TUlTk}rzD5y=}8 zQb{F{>4)53a3(#xtT1y8{DaWKme&Vm4Y)zu!RC(1otF^)^Fz`<0hk94LkZ9XF1ume zgn2Z}aS!6kS#wPdK1zrpyIzUd%!vTqeuN%ocuEVd74kxz8@H?w6*iK^H~@c3yhJpu zDUmWIv?6;4FLeXBUzP)kl?=@jGEWO@SDntBg<1pfZZ%|vJ)3;RUQbdoS%;25aG#|ana8e8V5^Chc5`NUwt^L`!OrMW>_<&RkSC^^~0>I zUS;=&vDp zE6dVk57`?s zVF$O`bz7J8RXPS;-pFKqj3KjR;SCPVrgwioD%t9OOizq*_mmR9NSUXYvyqQ(4z1r*nsR2UWlA-dgCaxX;33 z&XsUqdmm-z?rsNM*8yKc2b*=#;#FIbPPE5C5No&epw{YvK9ux%CMec<=Co76#$wk! zb@Z@H=*g%)ea`yEEkBMWF5&!r$ZY?{2;6?uPI}MrTc1|-k|=YLi)F1idUd<`={IIp zOJ=q{mR+GndYb17+<8&FuK>EPUoRxK&YkJw5IL9Z&N!p@MlX)mrm0EiQ25E7xect zlFro86VVl8a(xKjQgd!|&XoCn$#Ysu{GN|4Zf8$Zr*=NLxuPKE0FKw=066H=OLi`s z*i_V}&?pHm*QBRx3wokEGXKM);oRl(Ifj3m?d$c7Ur;zi*A`R{Z`0iSJ~WJ_nJ2zL zf)d$j`sBUriqy?PnVP!uZ{rs}`3CQIu>Wt<)=JmC6Zy~hNaX>ekvjdbSTC==KHblD z^L8$sdw48zZ}HusqKx7F8LwYoygS~Dp+_O}3$iB%>S8MH9!>gpA8o|GJ>?cjbEb zXlc-{I>Lx#oBM@Jcgydng8CNx!7BYX_f7`H{<-~y+}x&PtC}pjO$i=%xvnDH z*Y{8CjlAeKTZ(wb7>{|%FAaRZ?XM8U&VLHp@gE~9!qj6L3cHn^{a0SQe@sL+*|x6! zJofaM?Dc=noBO&|sDG5R1f1T}c_Y-Opt!!C3Ad?F|4{C=wnP)R%HeU3eGI>^&`=F5 zmS%1_mVaT-o^acnMVxN8*MD%*%{*3}s){hPjeZ;1=+H)q&~mzRnU?RHfsgxMz55?^ z=~?Bu&ea3MCexPpd_wcJNrg4|;!)^nR;~4jLP5s7%9Op0N@o{TjZo zY;Dj=c!ArLCDe+9~JeL{+2MclS)KdZzYqTnOOP4jY?)DH?#`} z*rhX7KIVH;4~U0WL~T6n=ek?_H)UDMrOS7%ls+fJVz^7X>hPA=S+hQdeTK()yGPr! zn@dIvJxWKKqwa6Z@b~5?&pPJVOb5j>KFd8RF3p$kRsRRSYkkz!qZ>;H&PBz~b{({% z_aARbI=ELFc7Ol0ulM5-Qo_zNyDw(zXlHGB*!_Loni+Y#hK2?ro;v@*ve$z8M1QpR zbNBWW5uvE>u+ku#Q!=tnBf3UW4I3mhjYUtH$6b?pe7Cz?kuNDbow!-->=SOW+h;1K z{Y!_zx(m*$DidO=4i?{8YIDYJ3)L`l+xqW64W7ynYwol39XI~H&r2T{7tC=5=KG{L zzKZRqK&iv-^^&e2VasmVdcWjRgm$TTS4F?WG>`xgMEX>^T#9-JoZYY$`PSQev zToMKQ%2FAc{slUdpJ4tr)>Tia#>!SIY-k~5rJ)(U-2{R>3JDtKf)Bdd6o)>>{N(CA zv8}}$#zU6Bgov#zcaC<=Ut^3&esK+LC{73%>>h`?8o>5iCD9?6_4WT;eP_wNSbkIN zu|y&cV(jp$f%FfdW4<5X)X~GnVyzSqGiwmxF_&rB^6=VTY%DbxTqWVy+RfUf3fS8^ zUJVSrJ2jV-kcER%29XcG791?}kZuoH@SzHD3K>mJpGxJ@CrTut!j@t^%mex$(LyO2 zq#abGc!EmBrL{{)=SjdTOzR1RaDn0NX>7{l{m2&>jD^EEgh@%_Vnb^Qnspcm0y_Xm zGwXcQoX>ii#J-UU3MoVn%+L}U_Y<50hN!A^E~W!^o6qYoNkjIbY7Qpj#)OOsoq0L) zE;cr;OFuQ$(V!FfPbQG2{(Y5=P7Ulz^U7Z zmRUt5&*&)+c$lT@PLJj@fVeY0*h*Ncr9jc$=vmm2fz=p-Jbg_glMyJvS}Sl?v8SnB z!QcNoAnIb@B|G6Wc~J0e#LQQW;}0Kb_kqz{ar_k@Cj=Ja7l7gDz>xN;sNMaaSXTSD z5AFahV1`F z^5e?Ww2uvnGQUem*r-_aF;>2wA{G9IivSa;ilY2i7zBYKtrXK4v?sg?%DZU)dL&+o zJ24M6al{Pv&goENJvIRLPn;Kg)UYKOFRw^Vdj&^U5;!E0_I|AW;X+yad9D z062tl5kRq_Rf>JE;qY!ScSrpAaW)STwK5YRD?%#*dJP#NbyQCyp7)0UY+zS)%NbMer4}*OBi6JqXrq0ND3TStr+%JBxcJpy(YA&tE zjEdyqZ8rk^$^f3c)|YfK|2ZKmuubW4qy|hdHYEiQS;AY16up>ek6gP)GwuWlq3=y3 zY9+(D!d<`{l{LWcL}bX`%ebt2Bfx5+%P=3Hid1?4oVOMeII5|=Dk;zbfqwDfvU%ji z?NleD;oYfeV5elkjD2t@musj?eXN%tWyx*KL-5g$hN=25!v!Vc%+h~Bw3*i>iAt4>UggXEG7Ui*( z$=Xaxo8`CatSB&AX;3N~G!XET%V*j~NE~=!25epG7Y^P=L0&CCxvsgK(;)>gEc}Ve zCEbv;`Fcuv7*Hq;O7flma8p>;E8+Y_S1KbQcdurQZ9X0obWh)f9=2+06M~my5&};A1+ZoQRRNGqnwkJQl+HdNA+9ysre}}PT+tbudy-~}NPjiFmdWY$MJC9sn zCjE2k%;n=3dJ+#^?7d}H8l3E;OpR{mI2QD}=icA?l)lukcv;}u?7c1h8cL<4{oyWj5;##mzKD#g>mSr|73KxTrm+Jtd{?mz;B@V z{+oAezSoINn!CLu-_Na3t1zs(G{(7SV5%#Ud!T=z*+Z+K_@g}6%uajONb-tJ%=9+P zT{^DT+ik2Bl+r00lfUGRMGiu`L@2SSJ$==s3#<_tHdwShk37#<};L;K13*2C$3o4(`R7Wzw@3`Q9)$x8V^E1)NaQ6UeZt_KoN2` zgrISXk)(N|db$)>O>ehfJ>vb669$h0hUSr}1%J z1f#I^Q~wx_)wk`T*v?c;aPM4gHeT~jX;{JRmVtx5^^Vc1ocxtd27GIs?vj%i^0jX` zlxLV>gUh7(RwMP!IobMN7hI=S?lYLg<${!A!l(5K%)uP7bh8uaa)gP#Cad(XUqeF@ zru=MZ_f%VJLWjNgEZdU*d|hbF;g}v;Mf=nB@2mIPmM2*!9STm@@GU5j4jkT8v}WD5 zXsM^7^$xGj^z+(~AG?+w5$V3u^v8j%HvcR)pIRchm+V@%=Y+TgbQ+v|3if@ixMB5qB={`h@2Z38m z$hWt#WB!gFNYTB=17&tC)ys}9rP7dM>m zB-dZDtY=$A6^bCoR_lT{9YAn zoOi7?VgKmI#-TjPTDz_dp_|j#vzGF@N?1izXD_!C2A21m36<=!5TCo9aBkXd7PhBcXi#*r1OP@;`+hHDgM(Y`T=)kS!1=#>S?CW z>toNfKMC5e<+FFwMw~3|&G}|XJ@t^`<>Y^e8`mT!DWo|YmpET6?vzkE>^=w+>YGoQ zt{eX4)RcXhVrns4P%%2-xqZw&8ohL=H9)+AlfM;*P*Ohh zTT^76MVn5XD9uF@Dv!U6$!v~CefXQp)Vef@&Wx14&UCm{ zbwIkyFzHFKD`Han25DE{Y^Fsv<^#Z?{MiLE6#7KUNSYB)u6HExoNg(!u60_2^|jwlc_ zU^%bdwS%X4v8OY%>eG65a<9hqv4X#N7?CvaRC=L3CqJgySfbx26K9ybLHM1**lJ1M{=oJ!3?fYYL3!^L#NhOZ6uI1KI)1#|^LakQ2|66D*b zj5*DsSy&KyPebOSM6vZSo6v(rCBdfD^qWHQPiyf5QOet||)Pam!& zH*jGW(Z?+mQI=)BaTZZ(k9p3=Cf7+QXCl$Xi6P2>{!p3EmSZj>|I5VV4{J(R8I!2R z0iF@rkgb4l&p3=(zM;6G5;P6EpnboY3=_UNii5UmG81Fo1;%yQ)62i%F`{PX{J3Fk ztd=vAi2MD?HFaq^_g03IrIQqK0YA7^oV49oVZ!SMw~=JI;M1h=jMpk>F!Kf}xnZ0g4jP_11wX6I6SZ$kBtf6p7Ym zn${|;j&VMgPkhV78#OYQDc~Ulu6FClU08MtkXs)FBFZ;dTRLW2+5p3Fi@voxx%U0*pvMhxu7$=Ab)=qsd|Ybg+isFoQlQ!+qy4|J?!r zl)4aI`cw&Q(0Rc<^dU++ITH2#{bm_OCmKy_;9_P`WWYAL9$xkbCD2*Xk;n}3S_*c; zhmO4tv#zPQ8IF`mvyg=4;g7~;DIMoQNW~W$!poo zc;0C`J91Ph_P`7W%BNlMHQNuZ_`zEIJ|+U)SOp6_r{?nn`WhsQpAwy6io^Y!Smqo}c5(Bjt*8*EvRM;5q?P6AgAc#c8$ z*tZFpapIGcSq>P}=n@o(?UN92&!OU5rK@peMAG4UoFTWL=n}fT=r_jkf)|CATF;$NLAK|4yYx1sG{Q2UuGQeMu9{o;On{YMH5N3 zC}3aBOM+cMDeoEUk*Z-kqvZKyQA0#Pm^PuQ>H4Y86v)W|9kc~m@)ppY@E0M#a^E-GndI2iGc-P?UR3P%<(rDMeXp=%rk0?~6Y1T2^6QRaJHC0JO zfud9#3;`csz^T*2n$l#CdvUcF#IAh7l)sl_}}vvc6j2o?rB~vdnvC z_V#s!V$|EG@w9U*DDIEc-tTm#>%>0Z9HAAIP{Js55_Jmg=sqDa)|r3piU{)$w)^R_ zkI7l%^K0GMw~x|`Esm<4DzE)R8v_D%Xl_mj^I_!y?5!sgI=rnjzW$2KHE8{S1tBa=F>+LEO%IHn{1Uv zQu9vUQA$<0#MpDzjM%cIS86)ZXfm8vY*Lu_(&zQE;?kGpe-_fk zWknU@mYv!6^C@@VO3Nm93R?Op4U_pcmx57ba@uG#^X`;=CNC$%Kq(jV*vH+Q{@dI<$KNQoNebp^JxknRQ)cG!ZdbQlv)*YV6K7xkoaGlMJg;_73Wiy?h zP|dsXkN4`)&Fe=#x8U^=bH*28F}p2yyM0i0hu?eFnZOeUnr`Dl zL0aj-*-bG)IpaA2bg*1TcUfv$YP>oYg+NE$TbI+e-v*cWf&PXOPV*Sdta*PQL;Ht5+MZEd?0f2qYU4>hav(xCeI*M;NVGk-r^u_2&?-rNwf z?Bv*;p}95dl0BbpO1~Jiouiggs`UA6pvKlkjZcH}>K z{p7Y+b;$DsDJFL@5WVP8j}>}?c07$O2gpfCmVbnWn~@Psf`b*$1Z@(69%UAqZ29cu zYce#(;)9)JaZmpK^cxJ&cHR$DnTz-wLPk_ev?qne>v=T!9{7JX4aij zS%nMzuI_;8s6)VO4KqD55HFG7OL+HV=KGao_D;GQH+e`uK09HeZ|l*%fXCJoZAbFpbdK!`CC$f?baq>4V35PJ^J^ds#!$ekp?qTVl? zD+dL=vKm9U@W%>JOL+R!t3e{i7)pTFj3}6E>uF0|`GtK@KP0Fd*pCCe(>F9!)yfCI zJj0s0CcdIG+q}d{k#8~Uhbh^@a1akLTjhp(f^mTPKOcy^72_qRD9q5Tg@EZ6OEALb7-nf?p@sw=s;Shw+XBs|3_vxjUY2&2YH+8@R+JL@)~^iLGL z-Dt(Q#Wx;=u+Br{16bpg+7Nu9AD-hX)9R3Y!$?XDd^Vy{J-I1<7=H$^_^$Q`C1Mm< z?GrYkr_?BEU2@0uXi`(0ks+TBOJ>M_P#z*#=iLxY9R{2?;M1&wU#8JrST*R=5;W^o zwf^N1mqj|0su10I@J<2RpV=qD!QG?SFhviQG`sv6DX*0%!+zudnjJWm;DwdrX=j$T z;OJ*gbM?GPDL%UN0&%Z|uu&wz!x~gIF(I&;Bp$k)icy87YnBi z-Fa$y#^hnPjAg8(f=!V~jx(!M6rYyR0#I8IJt1UKA|wjI-MMk<`VLL30`ztY3&LqH zXYJ7BnX#jCw~uC|BM?8Q6!ZN`WT-Rmyq!_#u@({d6RSB|lxw#B0{kUe1(q5tj*6*=7(`=in{-b*YOKE%#}0 zKVoG226GQRw-(M#oz;BvekFpX6dSw{tc92&64If1OiQD+d~T9=bU8n+;CClAzm zqg=ln1*=d%b-jci%mIlz>?A_dUcd%>>Xa&FO3ZQpVz=s`1$by{M)MvL&I^y zGC5DuC4%nqz(bTUA+r@OdO5V@#f}3p-9SL>#PZ26;E)hog779wxwu-46tY818aqJL zzm(}OUCcYuM*gq0%uj)uaGN9qe#WH6_&PlDwI8>vl)_WPM*CS4BC9@}U*!|O_cgC`Vke)>neXSGl*RXSTs@z0;D*Tu?qgq{pl)J}DdxWlezTHq zd_i|$rugNpmV}TDRk) zCOqTxKAq2=s}$$GuZ(i!c2^=h|2q@-7rK5Q`xfOl>(lWww*OuaJ(yQw>S?E~A_E9z z{s+I-Ps_7CD-RuLFc9G*A+vFA_g>D>B{K&DgPj#+sP@X^fv1TrKKh3jEHS(2*m$GC z%0g-XYV7-I4Yg-hYo=&8iF)Bb_2I6B_Rk%wOO+WRx8iD3lFL5Kb2$rx(W)l%xD{Jh7gda> z@nbut8s*%lE`@)7zhl)$DW#*;=4)f^yAXrGyLOj!*5fJiT_F}F9jABX99nxu4Qszv zr@JYCeRvp2Z1N$mkpB12ZjaEerB(y1DN$8n+N0)kPyaZ&mht06*nu4}7Oy0-8%swt zo$pRGY;p=ZX=+K@=(c%P@m+t#qGu`X^{6x5t^BsQEQ)8mRK2%@u4*M5?hDiMAx~Qx z&=-d6ownT1pBz^`oSM0ndfSn)ug|EqqO;oHXt!&hG}20u-x%HVxhB?9f9uJEsbmcO zSJK0inSK(Vjr7Tf{NYh@7tNr`fuYDbL<|zPhqF6-o9?$Np!Il%RZhfhx2ib9f&xeR zXG6<{JhqRCdoE_zjw7epd+GyfOjec$sqd3c!*E^{dgX*BX?5Du!L!8=x9AoY?vW^= zeFm2{ggN=0kBwV(At7HKKfyOes!yJaf@-)zPc@FaNfIW6B8KFd(4h*t1z6phMGaq@Z6UeD*fwh zzeTg5<$D8>n2wS==?~Xi=d8+8O1ZhKw*vu-xDPp$dfYU(=Kkt3`F6zjMxU0Sh{Gtm zVdXb=HqUF-_}xK@HFMT&vP~Ij>KIeA#5Gkj5V^sLiO%MW^Q za5HilD~?D%e;2X*s#&|+GiWkH_V_Esf3FI;Y%3Kz zo6%&OmhJhKn?(m5qG?-Uf+J42QLDDnTGMU2=jUzv?Mf~yD-FAUMyYOL_-Uh*KqpP} zlfzX)uXPi9qz=k2Rtw&y6rQ~MV!KIzri1ze_fLWmxx4N!*ST1qd^{c9+t|92=8=^Z z{D<1bZZqo6vf+9b`u5zQ6d|Vf4SU7UAoM+XC?5l(=C8P)_p?$-xWNi1LytIp zmx!sAX_nC)n!RUJ%}<%et!xS{xL^2Mh-#nRrM9g2m7m_tz4b|l)>UN}7+)XkRR~{# z<0nU+W7tl2>eEh?y;BLSqU_|Q-Le4$hG>FP3D*9Tq= z`zjn;Y_E(1(=~XA{rKyz-it}B`_?_o*4eqhN_lfxpAiEnVn!n+6u=MlvrIJyETx&u z33j_xj2BftJ38foZ8wl?dP=`ZP%D6@S*Ya#J4I81V?d;!fX&azL5Aq$dZs0(yZU&>T4ur zOnzb{1+f_lw()UNEVH0KhSYK#AiZsl6rfqSc8O$TBA-&i6KP7V0l=fEK=y<(qz;jQ zXx79+W44VK6x**Gc9pBAj4->Q%S%{~Bqt3ry&<29;sl7?12&e9z&y1)&zi3ixC%4u zvkWstOi=)pq2d|OLWOo^HrpcBVHs}lC^)vUDV#k_%Gr^WCK7zfQecMdq{?LPzBnw? z7C-i(q)(6XF>pRK8Pc-<1|x_=mb)+b!ZQumi{7sd#J&<1650<`r%oha9aPLGlVGEM zKs$DEr3(5OVp`cH-L(^*uR?VSgD6A8hoo#9`ViU^cA3QiXE|5$(Y&v^563ru!R9-U z3nUnnctk-&!JJ9tl|SxM5^q#MS0n7QNIn6{FnTVPKxY$#HM%rgV=5Dnc&BF`i)a;h z?2pw#V^s;V>ehn@2?9buLCktyyO=w&Py?<%iPq1+mKpQMrfXiKrXZe5pJppr0Ch69 z-_`yh^yrMu_-7IUsxPPrD4vq?+=G4XDctt>Hw2c%2>9JcPGcQTz@w$!RpsTr8sc`Yctlx2#u#$44-eVL9i@ zmuOMsBKU{knfP*uO~pfK#KTn|d-#$Q<}2K9`tbq__$h&=HrWK-(SngANAj5n$Zb`r zT+?76cpnSm8rsGRP3(l)Cg~aUPj2mcvps>UxXkwN)f|?l1V0ZmNlAJ0of))!x77X5 z+qEb%4~yV3+c#KKWyE+qn7dwYfK`IW(|vZykBAVG%@AsFs5~btq&vAbR1KIU(dc{T zhKF`h>iXmsB&@(AFVo_ci2ntZBe@aNE&GwK#VSMef}u$H)^#M_5|}B^K4@|1Y`;9fa!^F+~|Y%PZ6r831R;Es?e;1Jx2zPsLOQ6|e0>M=}h{^Zv>TG_DbS_rMLbt46LVKpQY;zuwo z0T|vA)K7=@K(*Z#X7F^K>J--OgDND0EeEe7&od3yNZFH$b|wH|j9|tiCcq1IIeaL% zxQlak4j%aI!z~Cr063d97kts~L0X)I$3lzW-)Q#0Qc4wQa@C@D7CJo2jTs5$-_hXP zQVvudI<;#7!pWn2yY7ruB!1HXfv}G#Y=;L+In7( z$18~Jby}&)*--MWVsq%Bnf~crdI1*ocJ=Nt=xvW-PJtQ~xYEPum& z5%h9vH2>u(W;IuL$iJWp?1g0J3IS7#QUGanSY`|>`9mE;aWDm$ok1Uuv*1plfH(sR zh!lvy&}E!K>#&lFjNeeoRr@i_#~lNF5sJ(LR`&xagclZuvm+$scf_!MS5N^%n-YkC zfB%vJkd&&N^P&n1kCG7hsJLh|F;Oh^9Xl%4gOH&Om{$a-tGf8zQqGQwl)Mlzx}J%0?#{UoLd6B)c zk{1(^7*zi#_HSw0U0LQay&vmd{SP6=hi>;dqRI1pd+`}xPejnuDE&I)K#W#vUw3B7 z_UbI&EdI;&<1+CVlkklxRM(UfaqJ6YHYe0PR@J)|7#ue!D;;LwcO+GwB_EuJ2WH$B z9n7PbKVmh6uX8rsVeoU+T9qG@=Ihl=?!~@ZuCe`TkIjjaQ`=lVO9<(%!kc3%gQr%t z)dsz}ye05p<@mLGFYDSn1XRY^+!&LsN;bY{<7;~Ua0qzRIP&scB}>9s(@_@xwL(ko z-q45hHkOTBBd>0sbbdef!QK)lbeXS=S{pynRq`S4Yy3LxtzoMbvR?%Z^D!F-vWvo; zAKbYr%%~5%T&dN)j~I3btD@Ppi~C$$Q|ml!P0M`n=Z?Sf%$qyU?u`mPvbv8^DxUFk z%DZ>)i%4(J8oTb~SxfyPtCiMW2bSEm+>vGb7xAe3;HBe-PVdg}tKYd(2d(2t_uKCX zP<_c+QhrBga>Q)4a@+B(n;mn|JxZ1{+@tzeyi9cSH?_{MitnolsmMM)`d8aK7e|_s z)lR{+$L_D!-TSktck-+z2?^J~QvE(e-&SkuYrW%}cQ}U`2n*lpb)2rwJN!14vAt6# zDrt+&KQiIfyO13T@%(3CJjyAyPuV~+wEO4v%NE*p26g9l=6OpD@_PUK^u{Iel*au{ z@;Iimb+So7PiK|u9aZb_!J@n+%owv9cE6+TDs<$%pOQvPuscIqqCHf5AD>V<6>s}1 z%^s66j9|x8e#+W&P90Ke(_IKXns-)xDlf+6W5J8MnviPN-hYrM`BtT+GVvPJ0inco zbSImL^?QoAo(lg%&fGnkrW#69TNcv%w6=QFa_o8>JN+_CP|kAg2DopkDd(`W9sO7! zUa*B}E^0Nfken@gecSmDiuufFBa0lGsunXHsuT-z!YDcP#$28IoP}n0^z$Ntzx&y1 z+kSMg$T#FB1P9sv_me)%1*EL_qpV$UR-Nu$vLLL_n!3yg&n+YH%43eN(&+lblz(yC zReqG*j+)s`Pe>zqN!o|4tL|9fl|+fdR}ZesOA_81HgH<;SobYCikYh!*;aa!aV78a z&+^Q~g4Bqs4)N(*H|Sk1B8~(tsLA|(t2jC6KNevi3~w(lGy)=4dnD_W_MPE=jrl!65hh8)jSKNwZE& zM^IV&p?ddJbVH~@Fq!|g-*pRPi2)@*)kQbFim-I=Kk59UF%^p$&LPE|9h7#bFXj$UeW~Vj+^z##M_g5T`pIjRq?XIO{O|O#3c3kl1{{OKeHquC zHwODi+&EtVV??r@HhszyHuq!~t7n(*U-V-jZPT*;GKdA%HmRz#fP-P;gRX>2aK zT6lafP_Ouw?Ty)$OMAVGCKP%ij7Y=2O9H=sAN$EY^UT?l6!dEd`&Z1_SXB?*6zb0A zIS8DIJZmCx0Y?oQ20Ny`U^&v=yFqEiOq=re$2 zw=me~hEHdNr=h0Ebj>t+4*4>YBDG8~qRJi8mXi?k?Ix-S3Z7O6B=@5XuxWO8Qqum< zP6VCT2Znryl=@|AH#ixvd4#>XA*4wrE+MON_5%E!D{OfMR=cFhNFa|9X5GL7Mttd7 zTv^LwU<>M_C3_BOaSTO4-e`}p1aGAM2I-yrUY!x*!p>ZcFkyo(wwnfNla8xov)ZlC z5{IlH?s}Z9HCK1W69yFTV2u)*;+a4vMEh0|UN|R!Rsfp`r{t*F8PD6e4^Hj&E|Ct< z0@MB0k44Q(WdZL#T2$wRPG7Ne&{8TDj~>ld89a)#;i`1WNx<{I12jb?nKdl0nMCB1 z2ZcG~uv)0CLQOXW2oGJ@A|sQujmfVH2CTRm+Q$+Bh#3Qc)$W29&qaJLPPhoC2ellIa3F`!tZxXiBjd)ed^FC# z^kKFC3N2yS@|xtG1enr6HQa}hT6+MDOW_al&0*0y{I4NJfGb-0Ufz+&1{@Wy9@&HyxKDUNGS$$Ja4Xi+ZN_!eA>#8;~A|W#5cD0-mWK z0tNDq9xQ)tDGZH52pAg)He>FjG9kf3V40Z@rUslX{p91{bF79<=$hCtFXMlC+F+Ir zF>x(S_6=nmRY``sTIv&QXeq^ITTBk2xCS%3t1=uUq3RI$f)_c22%0XJ)X?L?^MLv=YQR&4WMAMD^yobSaZ1NL0@RD(8}jpyXJT z4<#IWhP&tMN5>!!3wSX|gM#4&n830;p0I+4crsNPEKC*P^68E#&?8zw+ zD?Nruse|DXGBLcVT9NcFW*+)8uWHL1d^n>>)U4;YwO|bvL{S_pU+o6MB&96!8$^r%eJ^FsLIRwvnyGOeSg(AsGUxMc56P_QLxD z;bP$t7Y+le)nPWW^RPe4{5@mlWF&A-`+p>zdpy&P`~TlNnQ7*<7=~dOsT`J^8^Xw8 z4wYN(64FTB4khWdIg`^!X-OmJQWT}`+)d1(!a_Q!gh)~;I@jlS_5J;MKOT3Hy=~X^ zx?Zp6E0zFwPXLOBfe8)AMDR@hvFAKzJ`_qM@15Xj=ESfOGC#-m6Du8ZnTNR=N(E#h zcjgiqqn&(^LpQ)6pnC&uJ{_Vd5}O7TOS^1@7ZC2^3%PXxr0$cUS?l;a^jf|czk*zszM`*8>ae$E~N^V~ZIJ*14o$)tg`h9etSknDxgH!6=( zhL@`fnmObLJZdtmIbwo(6&sDi$-=XLiqeyeLe=njKSlto58nkA-pTdb5i7pgR9X3w ziyXFdsa`8}_N!D?sox4?S-!|~c^y@`UMEC)$IG_Bg^ld%5Ea^pu&^icCYg_&6WD^T zxPIcf{IBOH)_=H_zVkn2T*-fd_(nSZu8v~s8O@D<+Xo#O-dechzcWuw-o|~rG}j*( zbpQGXU+=F6&u`iF;p@=C?spGRS1cSKV4?;W>;CccG%Di;SAF;XIudhs+Iv>rVPq;G zH1gjocK;rpHYhk!!&`Gx{pFcmlJ9*(dpB%r@zJ+18$kSCELGF2_Wk-tBHWa{uCvj9 z?#|_=QqvP12aIfx@?XjRtW|lJzNX$5t{gob74_NhfsAWcv%pYnp8oUuaQkEDLu(f- zl2&iJe(P_?6`xOxbya#PrU^bBIqn@&OkMN)O5KY$=6~IJIkmI2tEwTgFy!@r8XI1& zyE1od!aaLipX9tbGK1%T4=8*aHyY5}j6^t!zSs||zjj>yVYzdro< z-eu!4&qCWxmTrQ`@>BM`;W@@ZmqOi=20iX4ny|;>JfXB%Go`p^Gy~06d{Qbd=*Oqv=_6PD-E;s3*LY&XnaB2M z8IQ(#_JE&Fo-OCb>6pYvESeJk@6`b-^KbcJ=FPWCXf$*+YW&AT`+m{DL#L#PEJlfw zk@d<{;k2NBxZ?0JI7^m&(QDpOxuaw%&tt5@C+SUejQNMZ)tzl;G_wwmX`Bd-Oz|j` zNtmDY4>l^;rAR=uPgzTFHHuBo!$RZj%1aww$#h-w2*lF`LDXO-~YNrMA}eiAD~=5pFp=&xjHcC&KIGP6RoorcJT^l&oKE+WCp ztJZKM1yUZ=eEDGdCAsua!NvRe?R7COuUKxQnu8)6^_mT`FLRtXp3;1(N zUrxPhcCU*k3lUCw?$drp>$`-?j&%%tbE95IW!V#hsybyBYy0EmjaNNm0P7y?k&)t| zPZ>{5@s6C@rGCX^n~cv6#k+^?dBl>Hy$$}xBRl^62NS&h-^cedDIIjBjrVrWtJ{5z z>{BsTr4WhbEg||Fvt`l*g|9e?l(#0DYd+s=5t1WRt#dzH+m8fAU(wP|r@QMuK4}B3 z@y$mbJ-9j~Ko_wbzD`_es{Tu;6y(k$hXi24sm%s~bkeg07Oy8|i#3Lqyph)Q^??U2fAjTs z(Vm7biuB!cbE749G`>&}lkvr#Y8pE_)96rU!WSFS`2wYX+Yn{&$v@Ku2B#>u7B&iknCqIxcS##K1X)=G4T-SEi`}OIl6Q4|bYTRrCPtrpy zZ*;3!Q^d;+V^TJMTc-MyUoIbP8JW;l20DJ61mYhca;^Tt&Zd#PILaRsQG{0zT#Niiq5)0hMk4t>THEo_Os}i@Y&=?u1u& zzD|qJ&6y~yV2hQr`-UBaP=bT)7fHgE@J%YpwJQrzeQQo7JsSLLmd94*;{Xm*^;-@9&Nk5xo>lIN`+5My1hCS=tCYKadNQ^zvi4}29_)N zWsTYBo#CZzAjdX6&9Eo#Mc33L=4{SCRJlyqjyRfi`mEa_ZHVp6 zPV(+avb0!zb3UfoXR@X+-$zfM3i5Xk&j}AD9T;#$GSLYIGoWsjJGQ@GDf|3v2|6sH zjKkEW!7(3;6u~ui)jK%68f}H)Ibi@Qi^Nlh;q+_-EtF3IUY;~1CE|_BLF}7Fkn1$XEE+3!*-#*|do4a%23 zBoqLM8r%9waf7(<0N8zGDZ$7!+#`?ZW4vh0Ynqp)6X_yo3ywZaVkgs`Z=(4)_M?{o0m59;@#HG%?D=o8Bd^b< zB8y|JTS0I<-o-4(H?o)I8;cZ@)t$>G3T53r2^etA4}TvDT^#^^WJ_0`XQ(ZY48=Q& z3&pI`As;S71_k9&92t2t6e#h@3Z7vu>uHieqIV>T^vtS;upS?4usC zG7W+iJzDEb5Vwgc>|CG~nva87QrTQsh`4e{+7I-bZc0_r=7Hw&*mMsk7O8>mn~Zo0 znx^@>zSW$!l*ww;_QszLZkXCucsAFau|slW0c1g&8!Z*jz~dI@fv7ym;N%Sn^iri9 z)WG5TCgOrKG62S`R-Bvyw4V(f=$PQCTmnY~7a4?QAejTdEk^KKwkHQP$)P|JpA}Lb z4G*eU$!>kXO6#$%4+|@oN1#2K@>3@mi68%yXn?%047jo=WN@63X(EA}2c&12JPzy_ z$bo)4#4l8iwK`cQ)&3xe*d6}^YP@15fK=d*!xAFoa$U;T{R-p@&bG7CwHSZ=Jm>OF zvdI7hRe+*`SnG+Dv^}@Lf1+&1LH~&4A*91~DBs{1ECq}y;E{6=nc$)N8c@D)U=tR~ zAxMV^2k$Gg2nRwFD2n5)YPd!uOJ!r>_y&MQ*?vq@dwZSY7}QOGJ^wcu5K8hK9HRBf z9~Fp(1~AN!p!ArNM~?3#>rnIdffRoDc0^RXQYP4Bj@BKrAsqRm}- z2<1x^ea#JyIUeYrj=%mqm7Uh`Q)L3j6@s&I`lEFi`#|3QzM8I#qPQHE7!v0nEDO4M zm_CtA@gU{TpwG!N6yDa`<-9Qc+81CJa2`Bo7o&|1vML~Ag{TZ`B}i^N#%5oKc$ zSj5O{+Q`TgY!AF%X-pyxM?ym5e8kwuW6DNko+}jP!r4j`Aq5<49SWM&c;vXRV0nV^ z9EmRHy3E;0F>O)dei;Um0Kv!4o8`Xa4F1`2^~1~b!oT14s#x2_(1B%5)3<1RO%u$ zhX9X&W${;d-ZHScV2X|$FBN>eHBXof+ILpD<|KwG+;@R@k33_fzlMD|vwNN5A-e~A zwbZ;nSe4)RRZ+lQaiuw|GoUdA$E@HU0*@CAnVnsEXpre z!;JgeLjG;Nk?E^?V%yGZ*N#Pc++~kN2o)(s=BCc|^fJV@c-EW$`i9TR1^t(K7aUh# zYdYzZlXRPTk$-%JQttOe5ozDP?3#s~uO~Mh`{DfRqU(dMh;eqp@YC9F@J?}kK}Ql? zkh_oDx}t8PHRFk;)=lI4WWm`>zC&p(n7XfLD!zI??Xac(M;7d9)x6wDb2sfsJR@nh zp(R$Gd2FDNepb0BWv_#a+gZ2#&vrFCm1E_uO3mL{S8gc@AKZbQGBiOYMs{1PJ21kp z&wk(B*>89>bttLnh5Bl&*Q*V?K^i$I<(IurH~eV0WyO~BY5DBV%X_|UdEVUE+%Eg< zOfou9`@wWyxzKp*sj)$G>ihM7S-6p^W!=ZpGUgQm?9D z-NW5CPd`Wxxaa{unvxgzgrdm7%vCw*JYpS1UCYFTmTG6m9tzjAaxun+j&G(8RP9rZ z_f2Cw+M2f1AMsb>(5^J)Z>1)_NIX}Q8O8`Fc5-{{!zxn3FLZ5<6Iw+&SR@owdsN@8 zkkRnkNj)2lk5$3Pic`zM<;~oZx4$BM*ddP=9{z;T_dNk918mI!>$s;Q9KEs&%7^d7 z%FaGd=_6m@QFFfwK*@in*Y}zr?jS$G8eA?Ni=dK3ALW(81U7$n6|vs)1L+yq^*ioN zMHCMPdub@~VmlOkScA+*IWx4}(6h-ZT4|@${|mcAcx!!rdCmae4b|azhM_`B43lUB za8^U8X8c!GFZ~>2K*nx3ta$^Q>I`0Tn~!^A7?l)uM&Uj`LH zOG{gk`hh6=*Ur$T!L3W4tO*aT)R?~qx(b{&l#%_C)(6vMfH&vP4AC(0h+dwXSzMGH zc}BA97}e@s^`pXr;nf@axRtln?Dosp=u>7l$7>h{>2Kb2JN;dpWc?|RWyS#lo_OzM zwReZ!wbIFTjGkH7yG>JVnr2-}PstYzGaDzy0fx}+s%D_~*Pi8JrljefXYakut2jjg z#=17^wjMvdQsHV|-`x)m4V1Ur{;p;XVy;Fl-#+c?S46}Wy_S^Imm8qwQ zwTXfI$hd4`TFQ^O!3l4VP0Ptw(4G1=HdTgyMasP@VQFPpqxp1O!j~QKYGn)0YYdob z#m1UyWwAcV!(o;erDH^!+qn@1p00YXNkcS5OqC-<`c&1&#a|%r@Wp7EoQiXO>g>PH z<*$5y9p-;QV{VhLlQo9SEhEglBDS67hL<4;{J{IfV*w}Me*STewS|frh%VBV&wq7O zbkB#~heYI1JSZC1pKFKp#Oma)s03Q8{lkq>l1^Mne;fU+k-p8vwsS(SSFL~jd|axO z`zinSjj&uz`u)aij}V>qL5GIOJ2_UOe;7`CNXvBZex|G`>Br^U*neuhwxS&GpH$zb zA<(%T_0svLc$_5mUv_*+GwspZUN<~uU3CKRYV@noQmz3qJA zowY>59YOh&aHuP!@n8ay?Qf*aRv2)13KYnny5c=1;BO97-)dw3Exz*=p6?Zr)!_`kKx4Tm4KednGWbD;VXV`0KJ7 zu$@NW{j3%ItkY1O(c&tCK?6~F4-f@RAO4mn!Z`@OTkub&>ywep_i(QrV5q3s*vG>} zs%RKbY_mA8Jqf(D{w$Hpf&csbhYBc|e~y~qLycYltpe580mtvvQ1?pu zBjAIg2cJ|p_+l?dQ_|nFmI>f<%V`?on;Z;?VI&cb8qc8nAGMXoKo2QpJmI|)n{*gX z&wIftlOv}BkVy79CTa49lm>wDJ}t;a!W~P>KA$R-5hp+pw)-?AZXTLd>Qq!5Q-n0m zk(L~-hmhfew5m3Am0PWSa$1?}uSqq3XhW8@1)-Apr(69nR|W%KACpg_iWrOH8SpF#;{}$kxgR zu~zcu>M+(~?<~9Gy68_?5_nWjNr;Jx`)1iLnZaBPhAj3;7=~}fgvEjHfq{bgvmILL z$A?0-7qbD1iR}OYhsfnhceGmqepy+ckI&A`;LbSsV< z$il#%89M$zPK-AavMZ7UfUY%b@eE2PlWc$> z2mM2>iES_s%F|`ng`4=!G ziz2V>-=(^@i%|(LS}k}VtgHGIwOhKumm@=)icE1=nU^4c+f1TU(i|sJT(uI)xmuZZ zOYrLXC-sWL2{U6-7a+z^L_`Spt_{Jk2qRLCC}*>Z(v1keSZ7jcmG0Q&8kQY3M-H9z zMT7;D!por)KJSgOg)of@_6JfppPVvih70$2@D3?enrQZ+{%?za>?(}`X z11&PjkMk6d>{VU`p!<-xK~FD)lY?TPSnk3aqXuR{c*HtEg5U)#nKu^jGUhNfFZ44JC>CH@{piI6_~_0Y9s_g$!3a>f1J-@F(kmChbrc7-9g`3 zHvZ3;E}QJ{(sqU$hGAo<9K@+%dD>#VhFY~1;@HCTgYsDI<2)x8{tuv@5BwBQB<|NA zMAhme*8%#{F`XeRW9LuV3E%Iw=!zhP5TG?0RkKl(;OPF&p+k{Xn}aLTH7i6Bp78!8 zLDp4sA_tfR*&wnZZ@(C~%BsPfH3To)m-ohn4k zC9+;X4|=4l5bVOWrAp~N3eo6^9~@OV8MB#oCVKZ9FwW!USh|>Dh?b5?4IQBVccZx6 z@(HhPU{N-h>lM{kql>Id_i!%9p~E2TqWG42@PT~Zx<)ol%N9U3PWryEsqRLMYvb25 zL%?6I$J^VJEWvK_o>~cwpZ&v z$LohR8@)JUtKie}zHTso4dGn*^yh{Bvad=nt4^g2&INwfu)CCfLoJ1Q3l*hNo4L=o z<&9dU)yLF#470U+79HGHSfi~aBdtj{bywwH?jz+Lwm!iMSf-z1GkEmII+OFMmVfU! zxI8419^R5ZuH$uo_xivLW9_}{z?QTW(JCLON?#{Ssr{~nwUXy6KS(a6FGV#LbxUiO z^5m|RP}J8ARqLJTuI+5!CjP#h)o|LKJOvCE722OI=^CO0Re}zl6Uy~ggW-~ zg(n)OQAM;D1~;Dy9u*}N?lRWro(OcOi|>)fKDx(wn(n3^X|KAsYR@sprO10p6qEl- z9{WTFWT%JEY&nzR95G;#JUSR~HvFpeU7G6s?7JKCC+jZ;XTA2CW6o7=W@kTbiy(dq z`E2DTxoXCa`7~%h)MWKn&P(F-$_r+eVz;k_$W|8dpzUjJ3g4&nN zyVM^XHQhdJZs?DZ{LZZBw#Y6gr6xO{Qd3xiJ@;>+IhxE>*kP48)KEvTh!Uk{wf0fzIg!+42P~UMr zKzZF0C6>|$d^=OGdj4@z>AM-nn{rjzk-Nu4w-fFrV)uT5=x9vEN^v^Azi)DR<@)RD zUo1ik4-BrU%)01z;_vIoj6-yhMNHigrffXJTep{OKM#@!gCh_;>xe7yuv7(zad2r(+af{=HPnH zrfP(-pnj1d7R7`BNYuq+1^_LgKUAEY6&-+b_D{m|l%RIj`$bU%4=fkz9o<|FA{=SM zlnGF7Qs7&SxPR=tnNKV9o9 zMO3xg2HI&T0F%4KRAz`O4l^u?oM1IF2F);#W0=azgrQ~wIdX+MgEBm-0;PuMY_n9w z83Nf04+d?i?m-SZyd9#K$oWDpBT0m+qwfT&T35P0Rl`M5n~QSy0tVxENWtct!`KH# z|1R;mJhTgMK8K6N2r1x4<;&A%@)??Bg{|J4bjKDX^-^#lHF?+-vOHmhnNO;YYqc{d zDiS6NFw7}b+rZ=K6!)Frzj(q$%7hddJ5G)Q46&@ACfQAy7a3Z&d2J+Dw49gVZU<8@ z6~yxI^WOt~mitvmF5@XM>SRec_^n@|DM>Kz z1gkMm8&(bTjxSYWuKkb(H7=jKOkQNV3O`!s;tP`Umr1@qQ>M-Lq*ZW-*OW<QUfqoAoB-*?$@;tC+B5ZkHx>DvYfyj)SVodKh9m23%p4gC!lEQSbvuiYa6z@);{t+Xmh*kx{bX` z4y!=8=$ri?)p5;(B?Xlzd_cbQ9H=p1KvbU{%3h%wTdwfo>h;O_e>OU552qzA+!?lb z_ig(oqh-I0uNuaG?0BVlZ0E+mbQ5#OKgco-M1rxo|7@j8Iw{H9QuK$+FKqEte=mzL zp7&rr&;p`)f_Ug=!M!-|%igzAv{!r>O#K<|cy3~Y+KueS zpKV#J4uU@YcVLxa=-1KTJzKwKHoVcG>pk!OJ@0zCNsRC;-`WayAHQl_aO{@cKlYf4 zC}G$4wEfM`di7&f_6%)aS5Pfma(!mQ(F5V}1}i?MqG1{9(xcXD#S9V+aa(Z855 znkG|IT^IfR=fZ}g`{IroTyPA&@+xOlLP4#Kh+wbt^64#=U41oC)AX?Fa<|tFcE6&m zFgN{bJYJq9Ytq~DUy4j#_IRZZed!J_=QvPc$NO9n3V46}2?6!@fgg(lJV8Zgk zkF`(})&4G_HN572>(1lGW9RVv{F1T>CBd_({RI0kU%^iOiYbNPt#SQY=8=6KuR2vU zabBUTZI&*)4e@rc@OpY-ho2lz7DJtA7Fv0&3U;zR9-~WfOdD}CsM$GpjCRf9oN`>D z`_br8Y`c%e8`gR1(958!W;Z_x=d$}91`6D6>}$(kOS-e!u2~=);I>(|Tq||mIdecJ z(x)@UZN-^$yH31Z!T8~OiXM^ADZ|w@U5t7ha+!_4vk;#7#`k~7)?!!vjdWsQ=AH7g zr3+6?i)TJHp&s*7qD_NM&%Z5U`Nxwyr~#Vv*1QU${h(Qq5Bs%o5LdA3T$HE%!5~s? zyP=(evRg4Mj#}wM8cDuP#ulka?-0|;p=r%JR+mY+mX5i+FDUZVOC+Iq> zQ{1tiHu0ia{Vly&uab*L)4D9)*)$y)xT!5y?sVR(sI2$c>U*cRUDqPiNWxs@b*C-_ zy=zr7D5MyiIMjZJcvP0!B#DZn9c0qdL#t-$`|4vVndu|xazmu4SRB14EKb&6{alzG zFL~tZ#*7WSXRKa#Y{b`?MemVc_L-{n(#g7^jlSaX`OrejOl_RInNWM>am9P*@>7S3 z3oj56Y^c)DI#d4qgGZL3+7EQ^+1;)%x*zD)?Y_^MWX5`pGd$Lo<@Ww8omBcRI%b1G5vLA&U@+NASx@thR+oHd*|5uw zaJkH>59^eKlxz`;#G3pBhuy7u$M2el?Cp^3B1du*)7sX`ZHc2y6&bhq*{!F052!^s zEO<^ehZ3lj8@wRt!~-2tUbyb z1yh^S1Nj|&5TCxmohi0C9Qn;4Z%DZdb*3wH;zota2`|Zzp7NccCb1D+SkIMxkz%gf zPK;52=V-^~FR%{pW0vx$RD>G+@=1L)rS;4QT}zjVrE@i~n7h=a(;;U+Z5!^v13< zq$(?3cA_}jX&h0x>jbg3}f&WOU^_5 zdoLjmT2rvr)T3aN%uVWMXsRrLVIYj34^1{Gr=Nh-Aj{_&Ik@{QDkC%1*nA_Nxd&;Y z$oHk!D#p@)0}ex0gkD3hSo&EnDU%jTcms~lxn3A~WkH;LH2`i<%A5r0qCf%=#Q3BM zelt+mWn;w{G6qu?#tX|`nrEehEEOxlf%_dQU%-H@Y$C`(lDZ+D>NE+c52+^+T3O0l z&{PF$ktX1vMP3`{SbCf!2}cZsDHRx-;xh`$Q?*U;=??!UeD5653@J#~oX2G9sr+=vtr~3zDRxsy}$_Kat zG`YeD{AwFfOsoVAe6?g@B1K7PipqC250Z5-alXx$ps6Tehz+xh*X3Ej$1V~z5WQZa z4Pa`!;U>b^eJ~d=`j{x%EUXwR5dYJi8wT^NrO-v?KN#{Cm$R(HuZye1iHD8l<$Ra3 zBwEd^LPcYm%&ZFvQlsg6z@v`i@H5=ML58lb9u*~0{0;@{$s3WIlS08GXK$t|X0e8d zV`qY3oC+XG%=h8-*)9w`Q2g3D2BOSVORd&qs?Rxv#TUoSH-v# zbn|6xH7x~3iQ4^w2vvdCDwY6Rob%5g&2eaTr zA;YEPgZHBjqFlSvXbQ<;8gAYg=Si|G1NppEkND+OrtmcT{*d$%mPFfM2p|d>WhSSH zpL7+wKyUz$`4*s}xbVk@%x9U2SjpoYO#B}^(a7t=<43FTi6WUV5=0$(GI44e#P8B>>_ViV5LKR<`V5>`5}@A8!Ps2%ewdtb zn~wmpg$rqNoCw8dB4=J}bzU0fwVh+ik|0}BZWsQXALKO3Yg!@`V}G4q#tral?gEk3%W35GsDr1YH za4rgRs$7&Sj?~kN7;xnK*@d7SQ(pFpwm*VU?QA|5`P0szFnUHDyb3W!-cIdoMXY!v z^Th^4f3b>(BjT_C15Ha<6cuui-^bC*Gw^7BGlGG-F0z@Nv-9c@?L}2PG9ev}8omhb zlxZkA1Cw6nC2Nrrgh?Te+K-q>?f8?8XvKX{F!X@|#xi!=xRmpfMbb(Dgo=Ya8YoBJ z$csY(NIlBk69M=4tPm@KLq3XxK25nf(?~$qb$_ny;_b6SqA?DN`c2Vbt-G}vK0xgjlQ zrQ`IJyWG2PV?|@X90NRG#{H%&>^c8(i(PZ&R);fPlTi^Im()3rilEjH0k>_}9d}>S3oCc+{~Tp0(}uhK7~n{& zNAZ4fnZn4Xg-CD8W~)hi>STSRUuw3G;fd$3f+Bba&RazH{8jblV-Y*HjiMz9x8339 z9`$mztLQ?J&yYEVb``O{c%ZvyeZ=nR4Uq;;VLq|m2_701*DkLa;dKwK52r1D^XQpd z?{{d_VE^?Ex>Nz7jA{lkhC<6z|FR9Q@7o;G^W}Krn)?`nT1)oN*Y}i~H@WcGQvpR} z@6#@cJFaeXcouFQFRT7#O{&}dozSr~289bejKR^gg*guH{68md@4cQ`Cl0iqbZjL? zWt_2)yb6BWX**9nMRMKXI`%r;;A(|+%%>MQeU-z^o0n&=B~nP4^>xkM4M*1~o!B@< zO?|Q4Rq;gPY5A0MwbY>8AbJr^@dkRDB$S`x2RgW~g zmv(i-{_n%r^@%r27?^O%?^Xkeyg2+W+$X%vxJ6Eak7sM!<%`yoG+BuGvrmrUGSB~P z6GQGbJ&mJ)udQaPl3gDzj~I)>@u+e0esMX?yxJ9Kk3zXy0Wk)#?wb>A66hb|HN^E& zW}jrF+`egkbto`4-qJrq`r(cRYAUftUg^%=rk|w_1<7?;wdR}T{w-Bb5P0*cr#(x= z9q$fmwDj%p&K20l_HHPCa2@lc*tvO43qw74qan+@ZSUaMz|{4ZxOvtGDC4BG4_xfA zLTBEgHjIv^OIT?!U0EjDHO$bvivL`|jdR}o#{qQ8%{KJDp`9X|Ku7Tojw}y#`t`0P zDm@dONl)cJB5G(Z&-$E6pZVvI#^&XGwOA_Rz-=R$OloH7UsZ@k@;&_YP48iLR-?iy z%H|C`OnZvtt-2M}gDlcfN!apMjLWFmIa4Rc_BU@g=$~*6q{a7qBnyozvC}SXDm_k4 zRz}&^QS6R4#z8XAT9T}%_V%53i>X&L)p{0eIgGEi(i{G^s`RmVM(Cj&Snd{;G5oP^ zW;xd_VqX8|e~}M1zVdKz|N0<*n)>l+F?}en;z&sO&p+)#f}W%kZ?M^AEB1@KcU=_P zR1M%cZI*YN)rx1O4};BM=2A3`GiiEbgKj=;te@bKq4=ug28pGmP`%wUaBKVRC+KZ* zUAf^hCCs%I_d=erhfB8`2OkaPm`^-t*E!u7GOx}ja=YCQPFQ^?YmFFaL{7l1z-g&A=g5J&) z=JMKp_6K?hvbq#a9-oRHwM&S8PZzOmSJ@6>HgszAKQBJIy#L>iY09=K4zm^obwAZ7 zD6P-*R+NZ$Uyq4PUGH@6kl6~srmUuM_sLDVo!0t|9xfi%VEx1t=L60BJ0ui~3w&V+ zwakUgWS{mT@*!!m4w~=E8Cv3f5>%|nNo-WkP$B-1>i!u>@cBs)bUHM_LmtoQ1fzJ4 zi^$7a2!Z$sB&fK@4#1RVqvpO#J92Dexy~#QXzn=w7^3`^h0s>A01y$iLwuCI6p@v8 z((gH9$&x03a;5YL3^Z%A_0+i|L-oejDJ?oAIK$Ww%gHz7w*;qcLI5%3= zV%HA-+^A-hy+4W!Oq0o+%JoqC?!h|;Um|Ks%10`1llOrU8Olx_z@_jlfTe3)19%+Z zfRk6x`6D(nP*}AKN}*_Tftbuj98yoWEZFXioTCRI*1$l|=_r#cY!WRD2Fo?woaQx^ z_H)DsM|f!(iONV)rC9tsu!~X82qs_x5e4!o(2&>X$cieWc|NW5oSRb4JBA7+IxWos zQlUJk!PNBto_H=8jKYym&;<%*M^WY#?uLcttl2=~)}I_%WWbwk?hd{5R3R!WiCJ2B zyrUU>;AX!dHtXUns!&u@qppV;ztf>N-u98`CrkwsJL9mKqdA zzsaP|8zjau+0GmptCXO!p-}5`AOW6R|9}_;y9a8(7-=D7d5D}z*I!4OY2{~*mOi=; zqU|gzH3|$^wo>yd0R2~{xRN0OLENmk_??r1EU*+15KlD@a~a$@e>B{2KKJ|S<(JTy zPD5b}r|1{QzO4yJFNbYz*2c=gaRvOX!^mzk}&7j*RL6dnfn{VmAL zCqk4D4xBQ-(y=@VdzrWa1qDRU^I;kfaaf4+@25Jo^Wq4$$+R~tOIiBjRLi3_| z0TQ+hqz!v)m`ICM)-CyH9uXRy9yOql{~?A|`0&&YC{DWX(-}5{AqSl>FR(8YveE`~bw0%J2*wmxs5d$pm^F&JeAQP#Yiu~i=p))2$5=3I8y-4(F=b{cy^OSfZEEv_H zK2>`J0sWbaQW&bkTm|aChuj1&p1VCR*`ES#x2A@b7!J{Aq%b7|O$|Fnf;Mth#dC{Q zR@4dpGI(v{ieY7oiE^3-z64bx##qLPhUu#Ic5_sO?LBRCwl>F@`FSqyefblmx4O zvM5YvfG;cK%Oo2Qn0Tl=xs1fI$hE(&{x@sPLL42b}5aN$vL~PUNDku`c3|@c(On*`{}E^gg&F8 zG&>#rq_guMzvds_5STHINnYE%hn&*+^hw?MiZoBthZw0Cf<){naSk&z+ul5@iT zf5>Fl?=?iz#IqE8&6l@iUk9)L>~{V0yw4%c(#{NyEcM6H^5fEr2kv#yP44%0WVrcd zt@Eu`z3%ouq|@8Q?Zf|&eA9jM@d_5V8BqJkA9^a$(=|2U4@8t0tWK_pwqIkhDyfPK-<1RZ!qOgtY}F=>5R6SyH}^%ojLy~VsjaM2~#KY2Ou6P^Aim^Xg>X;__=|jq&LtSe1{U{WOf^?o@8^|3-2f zN_bv>{?wZAh7X@>^ytmvH?arSG`97R1fb%Ze1la29dtVB4E4-2t zG=s#;duGSP9bJ>xrDihouC!N79wLRKf9YQnuFuz}=5AmgRN1nAz-#dSMUQ_YOu|E6 zeW9u>p64Fl`^2?tQ=aKH{~aMI6+RxHFBs;j*d1Oof64SgP;Y~~U#C*YN9Ia>$>;QI zZZUPe>htVn3q3b^Tc-Wm3Ov2@ET)AYJp1*GO_Phua{5ljk9_fWVaCnVtp~=F4+e0D z=y&y74utpU&FcwW4?k;&Yg zs%%|BnN{M#3o?@{pqX&?+Cz1^aOC3XtC`K8)Hf#cpTp$paXagdS?_F5aK!RaW}w{p zmV?9SWuW*)iU+Nidnn(>#@uKB=K5(;>$^P~!d5+9PUBgE5A;6$e)jRYcjkg_6DK{t zEv8_h~_(z2-zyXZD6A>ewo zjkbSjQn-fB$c$56gUpmA-;XPJ;>lC+K^7~gV;W6;3`~PQn8_r4AJ#DTyztJ2%6E#A z^<06ILrDz#=sC`B4yfa=B`Zn`tnIF0%EBENhh=gUZ6fJEAKOP3?^s(=b>f|hX%%&^ zK3Pz5X9!BA=-s}19&k77U;jkv{eb58X?X|hUKX@ui*szW{CwO9gTXQER>}#+nH|R! zd-U^Dj>(=+OVPXix43M^hTN5)@%()Jmt(|Dmp5p}U5{l$mD)y&Vz;fA(;GjJ6_{8g zq$CSp*W@P`xyxU?<8|4juRS^3UT!`&Ccdv!_5LX%YbxepEBCQ+$g|;dpY#;|#l#`| zCYnz(*{_)g51e_bh&@KbzuQGn%_(1X{At^@0N%MzjrHrh{cW;pt~tkgMvRw5wlN=ic;YvJr{p-ew`o(9#E7WWBhBi-OdL7StjpXTgY++w^zIZk+!)fXK`W7!sVU6x% zEg)gY$MA=RtI*2s)n;T3WF3^w;BNtrU(iPd|fU^ViqKI;R2L2fe zz$zdSYIq!o5f|ZWJrNvEA!LcH-1B`WAI69L<3Zq!wv*S_e_j=)0+hctFpP^Qcx|Ey zUeon;o|U|7U?T?W<~J#VUpK(75Dz5hURb0)m>SyM z8`V~l@VNn$lqx(%!jXkaRf0-=y#^J`BkQ~Z!ccSN#t0e&_DLY5q`giCt3S!x5dF#7 zfIlVeAix6g42P5P&@Q3p7>kH;L#6WX{n7c)`fktlo8Oy9k{XHvFPL4#F0k_7wlhL5l`|ptT zn4M+gv`n&5;E?zc2vefVEe%wj15E6_GC&+RAHf0QmUO#_yG#~*B2^u7sFky9%DW|2 zI-Ntr2N$}uNjT=U`HL8h1dkMSym5AgSpti0ETWwGQ_nQD;6cVT62TafCVn968}7tn zsK8l4+NBjm!+aaY>i%dUTay-%D#-BZ>ccWQl;C8_SvS~7M+ayyv-^OOJ;wrn4KCD( z3RuwZ@XkjYH~@t5&y;B%DGtI%PJe9O-=VbTpnpVHII4`3(X-m;c$zVO4a?BjOaW?E z1CK7%n+F}1UA3mI-{PX#HEYo-5YfeZMS=sOia*V;?lDp}WN>A8;P;c^$}pgh1Zo1> zGKKrWOdhg{9LEj=$ca4r0>V+%dOB1W3chhX{z;X<*OOaOlg2(Lq>zkqq0z_jIFbku zBbq*wyz21x;ZPk<7K6H1f@a|`8tw_KKQjHeLZcPu6*bx4@U}*b%o-Y!94f{9I5_Mo z8~1gXuCSa&MF|m>3e-=t8$?D3lm= z&pEjqFGG?poLhw^-Rni*?Yyey9_ z%|uCv*m>}PzGr(SDva{865y>XV14#t4X1_7sJA5U2aKyHvd8X=NDw#Al4|3FW5U23 zK41$1x`Iv~V(7y~{c(uEAIswzSFWe#pXw)a6{=}rRH+&{Tnm^j-QE~4uY*!63A8Yi zkvEm=dy)%PuAx&NX_rs%Oy@?SkB%E zWpGcFh-z7G?m{OWHBoXVar!dOvvAwQm2^bkt*k+abyX>*V@Y=d$<6gteRSYo#g1YV1nY#Y6QD5NG5lVao8Kl zYunkRjx{Vu5pVxoj|{>}JN%{o52wDANyr2)jjr8yss6eyjmDZ|RfF|gd+W*nkE1gW zhjRbl_%oYXjD5;rFqjxiWf>Z4GlU__*y70P*vgP($&!{cV=F_Nv2>WEp&^t?aiTb9 zl(oWykmLxFq?I~3)%W-5cU@iePZ#6y%slVU{l4$l?HRJL{#oMh!b@Uj!YJ8#rn9>a4L}p+yN4ETaxm&2&7CBwyRF2?RNi^(! zWNnzwh5&ijAhs=$Sd=@jAyo#u+5O(pBl$0_ej^-z*=u9y0AVu0I%TdHsUsK%2=X z%7uQGp&C%wevX=rq}mz;72O?!O1O8{@FMF)*1n47{y;@IR&!qg0Ske z?jp>6)I)sAGW!87;o7yz1LiY+Z`}=Z*ga<+QLk_7i*#akA;ueu2Me~`=Ju%s33z`T z|L9{9@_5ez^}r`wvjf*Yz}Ze0ju9DFs2{Y2vXYa+h;^CeyV5>9o3r%svAu3lRd&kk zSg(3K9-_qG6t?kXpv6k_9N%Cf|HuXHbQ{a; zY9nh2O|N{_y4_+xzdn`38^Wx<3!NNzdqkA_U68TMv*=e#LXrEw0A2GqQ`_lG!`{XV zw_*8oBO>mEsc3)Q;i(9jTzs=F9vwHtdTbTo*{e(M zswNtixU}7Fu=}-Q2kK7*R5D<@;$mWU7uh&)Mp~w^)OK~s#_O^}{^#2wS4(zq7f_Ht-RkM%0Z1K=|A*>!_z7# z>RuODFJzZVhf|75ui*`H1B>^@_GYFwwv}J1errEsc>nkf*mMZ#LzSz2?x}qEnGVIB zc7H`kC<%9eL|p7G>#Ba#4yp_WZp9lM1s?wV;Meay7sWzjbE#zi4q#!9;w~-4u zyNHg|6)%z^RbUA-dZZXm7l04xvu-QY{z3V&yhph8965{r-pSwH>qvD?LP*6I z`0kj0I$4D)Bg*im?3ormr77b;@w0d>ME&by7d;>AYy3ixsvgD0TI8`a1{H8G8h%y5 znKOPlt(77>AX267?ANr&)lT$QVLTNQUK_>kKQsSv$m;vM%$CzJMso!hZ+8f;lonPk z5jQ>cCVI`brU%_s-kT7P9_s$+o!V5Cw)c$FV7Or_q7pVeX6|+&3z?@8gqdNiNH>+9 zDX|~4VQpOlnz=m&?U3E$d}g4;;damMlCTxC5zAF%S)aznM7%+C%0R`3KR-ey?kS#A zSy9%XG5VhMN1GlodviuC=7JS!#P?|VkTg%4MJ3- z_BoyfbD&G?yad+&N(2Q}fP7Ya$8uI1CO|K$7J>E;x@-UtW`hmlazIaH831MtXOmRt zYhNoY>HZpMZuwGI0KBabjTm&nu2DOVu(7vRf?^dMNE%U(lS6fQ6?K6qzdpY1bYV% z$5g8IV3=_2*(@~>e@7AP;Jhxec$0qHtZk$GnS@S&hCFEt(s*PXhgk9LRV3knKvoCZ z3QczP5HK)6I%Mjt{|JOmeFS}2UpPd?N*OC1oI(g!X-NDCF&cn4qR-Z{<&p*sVP0r_ z6rfxqrm`4IfShqL*M_FIGDr>wR;Z+zdN1dlCW0tnW!4%OSX|Zy{-+(4v!GmRxRWjG z{86Tl6D#&j@x)852<1=ytQIg1<$(1E5Rcyhy8#WFxje%QGmm5P(Asf%_@gA5AsWb= z%1eBZ_yxXs2}^-(Veyr%#{jzX3S+Vq0|+~^96YFz2cCo*G)P4Rroat0s{+7FN@Oy7 zP4o!w6ey?}aA2GAf8QAgzgK7ChQ8*?hMYP9{V@Q1o})oq5FoBV^MEW9v9jz8du0qM zn{Zu3UP3!f4jLiYY2tT9iMjJsze<0q@lDor%D4cY#89l`6FzteF+)G4 z*+CZiI2&=+6CEx#1GV*fk`&Mny9$V&G;<~^-mia-hZ%dr&ektb)sP_W0$YD9__adE zo`8Ywgl{bi1L|j_1|WBGgoY1b>VrZr^Z^l+@Yh&Q&NmJb@H!QKHZREFswu!21@)j% zNFJ!F(x!`ronUm-p5WsUs|@)1Aha!I5Yku_Y2i0UmGgM!ufW}=nRGD|ycUK$_|Wh< zDn^2T!e&zn!5(2o983WIkhYGPCIlm?a6@KDTLjGuVQh=OqEg(f-T$C7G<6W|e4~!G z)=LtD(l9DGm+?wQBxoE`I={^5ZiE?|E2s330Y?%VlPOk1_g6+rAfNBcV%@&~L7{nY zo%U+(siIhH{&#RYcZi^LPY!tIQe2i9@~i%wZD=pxeoaA33|<8cXQVI?u6d}WA=?w1#<7v6~+`kO^kwMu)+iNf_MIG z#ZHcv%Ep@5#g`;A#nEkhsq*r}G&~hXWW#k|0xZis4WTCBAW5GBEiP}O6d`B?;G#%d=6IeYOuRGE2gAu zEH=bDonn6Y{a)tbymxC8kKdi!=zXgyJ%tagp_ud+OxoZD8SN`3=&NA=r#C?vk?H$|aJX-9(ov5Kc9th*6L$O7RntS`dRh1bW zD9fv`YBN@e8aws`tNA#zoZoWyJv|%^jaghUI~njxBawkhB02_FwdfZPgxlZu$?1pL zCcxn3f)zda-jUh1{q{*xv~CmYsq@P%lSU#}TYCm6>Kg}f^WSuMf#DwsPR9|I{7=pC zYwu5`6MUMok}n4~nqJqV<~xyfxHq9)$GCgu-{BJr#q*(PuX( zD!m!>riA^G_Qoe4IxQxnuVu2I^c>VK%5V6i`}~d_T9RR-m0vtj4cb~^1r@V*^7e02 zLs<}?n!aW7pW%f zes4f=zg7Qw??|nB68}>V`RLYDB1K3c%PsQ>P5=99zcRHw49>vW?)2pK6sc_r>9*MK zald3TbELU(e;sQPHWuE{Z_r%d9Os(Gf4li8Q6t##F3#4ovp@boM2a4i6BZs--5`wB z+7lcxQ3&Q95sh_YBs#pvG1g)-wu`|qn5k{97MJNBNtqsL>$|Z{yhaGywM(F+8yXSe zT$#Es+IE#D-H|Yj9{b=`-G~kfcduU#3MWJ-0V6WrTj8h%ld?2AB_jFhd|&O{9dpA- zKdRPHE(O4eb|zm zDI6Dsm9|tJz|q&|>K;Y+`WJlpHDh6YaPy`-remGbpn=CEie4w6Ioz48EYr4~%fl*w z0+v0L^>qoU#<+NeBI8=)e`9ku`4a}Uwxb5fQ1jlrOMU6kl7*lhac zq>v)|km9s*=GaYl&ll>4kwqp)b0Z}$_?x>Bt=_#t*KGPuDntrWD1AG-Wgs}BmrmFH zt%+0Eo!`--(qJ_GkrUM%yGKn(s%q1y0icF zYz(>zpv?a;$Q^&XNU1^LeT_(qcV-I>hcdUM-_`9-`E)zn^inl{yIt#(sT^C^ohF|* z#(fia_=%=Cp{cI7iAp8em8tb{^Zsgq6VsFrecM(JEI^6q&R7i2pT4``@zJzFGAw}W zp1J&I-d4e2hMu$D&K-w6{mu-um!%{=HS7K(;qqSxcdI^SH^&!0rM)2|K1lrZ@nby8 z?b^ngAs04F(hP%U**OnFA7j)M1~mHS_ey)+qFpU_e?f2Z%E}PIIIjmPJZ3)=$TltN zvQg);y=>%68GJJ4FXIr*af9l?>#rkwO;5jwti7ctrLO`X!84h4!9Q{tMSG1ke)0RD z7tl9ea)$4-^!ViF@$e@t{oC{sUvQ0pgs!6IHW|*^B)*FLc;c0EyHO|HS#1!30LinF z$Y_3Y3aEixLeBur>7Q!xwrwel9-S8G(oeR^=v0;~C^Z0BH!B8?ju_z*qVe;52pCh+ z6F`v>2^2F?0qYnC6zUffV6_brU`3KtF$#^KFRd_eSX-c(iGikuEtvSmf!!|=j&OA( zI#iezpu_wu6Q`~MA^ZYx$HF5Qe=?SJln8L`E@B<;jKc^Fe3!6wF**?v2g5UZP~0zK zECFm8PFVDyu%OZX)Hukh1)eEb^#=5}JlKptz7p6~L26EuWPa>}vzB&A;BJE2sI>uz zn~7k|zEB3@VlBW;7qYvd5!gMh_B#eTfMF5G!}wN%z96wwEIr;p?;zNY$~P0Tr^P?935p-x{PTR{2u^R4P>!IC_FY%;-lxizAPSLBCJp0uFLk zbaxP8m1U-{f4Lmjg2lc@UD8h~ywJ{m#m0=u(}01P7rN&!kO82cIAjdgK6BxWfHglcNk|4CtByE;P+F%D$Qc0__9e+2zy-k4IXN!T69Du+BkBMzzQ@ zz*|B>p>S5?T*WM|8UbR%f3$=sw*iokG&$41O>ow=>oja#VsW1UwS6<;g2f{1Ko(#* zfwZcBID)|S8v}|y1J)ZmjdWTI6QCz9jsQm}y-^M<_pX85vA?<+3CzFlo&s>~m4j62 zGB`f4bX$g4Ic*RTd4gWouPSs2sRSN02R6-s1aSJJwa`uiR0>vCq(u=iRYD_Gtsw}C zC_KacHjS)&_9a*viok9V`C0r^^KM%r$jUqGUBle^by_SG2FVN$f&!0*Ehs5e{Hq0& zOvw-|pbdOk*1vho-NEsso7)tI+-mGiM00|9AZeM5UP zfM?XSpiA3|&jNcs8!oOU2aw&ZS&I8wpdY}rr3uBp;;3odt(0M~G<<|(A5w;B5UY*n z8Im{rl}U=N3~=s7h4@{(SE9}RFp{GuQ3J-hT2lnvgT5>>L&n(FNV_SIBgn6hO8iM6 zC?Jh7lCh<+Lp#eQh+ocG$0YD2#hHp!#LJzhKU@8KZM$-Y)LZkHWmU6`Zg9h8Ug7UST#|jWO__hLyLWuHN}k?fT}S5pl02%cb@``MO1GC&^FiS5T8_q*ylfA+N6LAz6Bm(T23v@Ss>celx3tV3z(-Maek%KMGs z7e5*#Tk~qZjNg9Ml`i;&(dUquS#+}1qAcgA^wZXBmqcoRhLBh}sYp`x23zXjay9NG zWkT{K)%M5ZbZXF1i!oS_xpm8K`BcBHGoJGTIS=b{&53ka^yWX$Rk4F!lrNMNwYn1G zrxL^ZdnRqn)tita{iQeE8Z19y<;OTi*4_rgHep4wL|J=7$giHRMm|d?4~@-c9*}Ia zSr)mX2FOPcwNBYZOR4Xr9)^_K?l+%;P@{nG@Qm{nT@k!^<0`2i2zrVqFsZ?Xp8!*aLo|h)CFh9J zwMItRW1WLBUmuvGa}nZ(dgUFFV-zb>iqs9$PbygrX^F2Gjr~})U$y+wSq(F~Q(38y zGXX#LEb@O4ht);S%ILpZmDjNOs)+UM#E4kow6;Th9|sa(OQ{DR6^0kB)( z&Urso=nsi`)HA+=O!dp&BaHpy(7Qv?S*&xuX4Ebt1Cft`SCL<0yh?atw@R_E-wLZ` z;E?z?vj@Y{*?Hkb&wK+{{e?Zt%8wZEOfLOurFRJ>5446Z;n7Ub9vffMUN+>Ru_Vgh zrMAV~Si{jI-u{d$QkcbiG=9@v?M zgkJYL3+G+7o8HC$I_H*t+!&cd?;qsk$5&jPJ>45P@Cht(n-xk5LS*MkRkJIzhm4D# zn)&yNw@SQTeGggRWWYM^|EBU%v)ME^b0mr)@KREF>o?HAOx`5uvwY(f{qY1!UHhS` ziHGhGY-gDZrNQL>QXeTCt97Hgkn+hO*&L&DstF4{5nf8;XX~m=7Gv zOtp?xeOi)|vZ$&*b+q@O8^t*?MUCdZwTd}NG170DkeBb1ck3Rgyd56f;% zju}|56Iu%WioKdM1b@98+QF$@+HQ%zN-OKrg zGx1LypQPz0HU37eZM%~d%`;=HRbBRL|Go$6Z7>o;O< zWDpUfwCQG+WqjU_DcoWS-1uczUw{v#EbJUb6y6mqa@keiZf%ydtN)TgQR@y`vz=j5 zpQlT+W&JA?_lSi<+Q!|!QCcBol1jtrc;ax=kzI?&N`rhOf|68`;jk%&18y7Y;i~1^ zLGrP3ugKKrI+?;1FYNXB?Q7S`)9BpAvzZY$lB)iCLf&WRbU8NaaMSartk1>DUO7t! zj^C+>zyFPzd$wEq@SDef6pe%_Urko&M7Mglw@>X}a-$${N6~feO&minA6Gbw@IDs2 z^>jc-iBX{pe9dyo(7^OVb__XDRNKt5bwVd@S1 ze?QaDQPAN8m3X%ZBq6|N8_*mxt6H!HeWXteMRY5qTZ?FGr)F=uDQuhA+QhT%)eMqH5=>U)QEW2EYom_qq$i;=WV4SotO3y8$6f$dH!-2LpFO z69QKeIska|-~lHDQFK_KHy0p1!Yy~+L<^+IR0A?h0xz7`(NaCZDRwmFwpv!}18yduw!Ky65qaGCOggcrrl}O)#KmTN) z0x(oiOhMJ={OwRV!{0SILRT;f@1trGvXbp&HhK;~yl2}ukV+UoscbP#ko<6~jVaD< zQ4pel0;oGxpjXpVz!c?^G(nq0e_fNnBeUFVIJ1Kyk~ord$r_ngUm4h)$?r`SF#@PhCUdo%za8 zHTNeS@S_+V4SToBzy`w4F8R~+C^9k;EJRcSZS;B!DP#$I4#h4XG1kM`&9|B>mXWs| z6+^JX^+s)J;n-<#hPlK8^dKCe5||oVRH+~p37~*fs-OREd|IO>;tMBI`N)a~K~5kT zWt9JZ(K8b%PzHHrf)C5H z?d2ei{xWgfmS`eCBSi2n;9zH4FeYD&@br{g;Xh%RjsPC$EQ%-QmF1A-3JCP@Q5aQ? z^jE1M%w?)P%>EeLoK}u8=IZ*mBAYFKdb$9(T>-WZe0nmx3nNF{j?KPU3vG|X(x_A= z{c;G@*C+ycJfRd41CSU?{E2}wgnU~u)r!<;E_#`Tv_((Vqw!UF#Z=7eBrl{kQ1OKm zwQTh9z+#6WXdDS9>kNSZ?6uYBP5M>JHmhr&h&7K?s>LYlcCyR}sBDM#aXH&8O&Ecz zK2kc)46bZ3p2N<|gV46Le037QcLP5)x>-zw1?nk<0wO7($b%3FA)syYK*8yNjS-k6 zvK|83BH*C7G;oLKXb?`IzOxLnZsdXtD>`jma!+cE0*4w^Jz%#(1~eO-t=+7tcG-nR z1jV*lPNm!fEE@Cy%(8H|`h4(-^h|w@;yrUB^|cTpy&t&UTMz zAsF1kFP9^3^g6z}AvY4qCDxefJ8dSAqnKE;5SGGVi|6Y!C(J2jq@Su#VsFbi3WP-VB*$k)=0!>-K z31q^AY0wZ5Ab~~#2z^Zs<;Tto$Wx)9NXh^}(xLa6Cuv;zP~6XkBKz>MVm+}~C$C<) z1)=s202G0Zz&}C);9On4>?zQ6e9a9gTGtDIP2F_A7U2xQvuo12ZraA$7YQOH<}dJZ zr*w~3jadR)lQA};(-rt_vs|S{z_GOv;G#UD2^-!=m81U`5RDzgKq9-_h?PQbY&Y#(p}`>ch?S?gI`4240L8Q|FP&waia_{_LbECQV94ptHbEXLMo#ou4u2%HdljBYpKkvp5n z=EqMo{C*(A-tUeoQsCT$eVdr^ol_(}o^<)O;e@|R+~2WxMrM+%2PMge)WY8@H7USG zRz!+d=9)DB>${_rH|it1+E*O)i`=_EG~&}&CcYUPdUSif_eQE2X!o2<3??mBI8V;J z4m}okNHQJfewe27>!jDJ36r?9LLz;8Qs#segAGya; zc;2N)7dETAv(&dD2Q_Ca;H2%2DU&0Dit8^Hn#Yd&Mjf8>PFR#zwK@9HB1xBY0^R8) zIHT?E_kQVA_y?zpQ6>jfAGmgw^@l0s9z9$?yzC9@;q>olNW;lldgB$_4+qBfVuBx- zF}Hmy`LPM5w!Es{Gw)$4czp_4b(sL$=aD@B=+LEl2q-W&_YqFpxvR03U}q^ffvG#W zJ8RdB?{f+$YsRRjygeS}@EHn%d3qeb@)agHR5+_9`){nXplGS#xWgVD;-Ayv2SdYc z>HY`%dmMdZa4q)sM?FrslKVius7)Cl~qdNe``&)g|%v$Z^!85VyC>;0!vP6?!ce+pP??xS`@qORydHqJC zYYmm|a;c)|=4Ym1Va_&Z+uX@ubXci!cXs!PI`Xkgzb9dIfQ(`nLZ+JsRqeEh_&-fI zjU5YAo*X7`oG>-kw2AY%d+3tZ4tNG}`JG=x*#6V3S_>Dg%?4Yh7u0@i^2Xl$_UD(a zFtf)k;sr%9yWG&Q?tx5yIDrz2%Tf-HnOF`=bS=Pl#fL7K`j%i5?0l7l|3j}z6Vr23u;q)PRsL_u=eAoteEw-2u}N`@p)c?& zpl>uZ2kWRf{9QgN&SGuuvf#tes6{HiMJ35TWoNc|BtA;3 z!^DRt0n|92Z>vhanR`H|@<~XZgMR)WiC=f8tOgcNt{m?lZsS%+`=t`k$Vd3_uUniI zVSxXzgO3@vxo`5eMBCT!R=Diz7QXe@)BbLXzAmhDIU%LHF6;3$1}XXNzs_46KD3bC zPoP=SWdg$~1my0>sIC_Hj9T98HGdAH>0vy;QMBDbeZ#zF$L+LkEq6 zK5YsfTe7WoTNo&INbJ2&F(&~`(|I0lSHcbYe#m&GtA`}M&?|k_-OG0yEjrp@vQXso z+woD>;H~X`mDdoYh1sIECKXgb%%4H!PBPnPMRn&l_3gdt@g*OYKVVeitar0%%>HH2 z8HBOX*6E-c70ukUCR@;zkPoZo-u@lsUFl}q$&r0u!q?HGGfh~6VETJ2y&lvcDs)`^vjOEyD$13L4`oP0wc z?h@}^C{tsA^r=5(IkOsCzNe#kw|v2b zO?~yQs9b5I+7_8;nl)&4S3{1yHXtXdzvy|~emvlp_njTDnL>iG#!@ZC=1BO5P%^~P z<9D)v#r}bhEs2eRy<_xcmjH!LEqjH*)$w)Egs@A%g+YVFz|Shf$IS4GhQYIv5cAXc z{~7pp95;>uNq7lBlHplNU+&0g)Zr$0RGtOM-GQkhU5r8|E08x~hU@}h-@hAIPqI_S zz8j-*(SVb4L)Frry_p2sPEdW z*qE%|0grf+5NK|Gm0-Ey0Bqy40JDNns{~eBZGZ$4BdkF;>>x|;xdniE{tvQ~%XQ=s zbvRpiy}%7(T;saZLyqc;|HP2Z1B1%=3R533OaqAoj&jqwSWd_rgy>29c*F_|HT;t4 zlIQCQ`J^!Qs!|w=^Za;d1R{O-fBy!=miqOD?&7UCx;RG{je((`6~zPB&>Nwi9fm2vmm;US0>Inhb&eWWORnl4?FT){~#8 zHCLd&JLq{3_ylEi8hgEQ!p@rW3C2R(}ty zpN%eRwRq%)2!@VB-oM^zsOJhi=%CGOiGX+MYNUh#XHb-WF%@Nw7$#uzr-A#K$%k=) z{oYxnibJd^liH_v1;dv8O^Zluf3<7Jg0QDg*vrTcMIe*O&daft)^+922yzj89C&Fv zHIY38L5?H64z375O6<#^+Z8e{)-%#+QNRu&VB=gwC7Xi&87DZg0iv_3Oy_m6pi4WG z?NRNmiNXWuA;1`w!J~YAN-=&+W??cF5(`=L*8pS5$l5LP^Ps7wLXFhE)f@r1{$3{u zS7B2H5Nx=~GT#1Asyu9&>5?(rX$YKG;02g40sz_@Yyx1wXcWiBp$X=yJiR1_g&S-+ zkW2x9%bmDjXt=)SC7_k&M}nVN$D0Q85)5G)s6J~@XEWfXSB_AbBO*PZMMrJsRV#rx zbh{setLhEGiy?!*Ly2;>a{?4wHtG-hg{#(`l|l0nsc^&<0*n{~K2ABck&@12$nqo+ zeJ>ao9}b0KJI5t)0CU~pC;bH^Z^530kL;NR=BiE3H#%Q?M)}e(Od!((WgJrS<3sy^ z#|$7H1()hL#5SC~51N_v zvH^6-EG;ui1jB%-AH0kH&V{x>+iwHvB?)YNauQmwT)@TwHZHLo=$5+bfak-dCV9qm zuxSA>7zngOm@g#$ZU^ezxNhJuOvwEIU@p8ck~bZe4xl%dyO8{Ch+D1?l;Xm{;$R+d zW9E4b=(8A|x&h!bt#Ieh>of#x1;llL-Y|&5{BDOOtbv0<*)AShH`EJ4RLXMtbYk%g zKw0&rm17H!R6}Q6cq>{G;ZuqDAIWt8ko;gMg+J{V9lpQEQoM0@X444bbEhd3v>z; zn8DM<$elx6tqmC~lg*a!p@W)Ol(_oqG6UlwmIK_K@P#$-qC1zHLpb1*^OVw(cect+ z`w>melt2V`m4Qg|0KeRvZhc<<|De}ml%FsVY#Aa}3KNaPkopDOnQvc~y-;9d7tjND zVa;2cX}tWqrKsVvF4CQogWa~DgcyJpE7=B1e-mE4(-B5pb$g|=p5-3b(aul|+c>i9 z(dp***m|e3mYz8F&dZmbwF`MWZ(&(y3epT@kHZf%a&&ZVy|=kJRn%zq&E>L}-`41e zd^a~pr{m&B1+trO-f@=5H>ZPHGZ21T^&kxXi1mFOwzOV%Z}DVp#OJ*%__-)b_#aaY z@IWu#G{kd=npcSF@_iwH>|kumGfv>6$9tg{gd&gCkpg_*`ya(qPtJUQFi6_-+5Btq zW`{MpZnZ?Z$Wm1%gr|}N5HY*?7@3YHvmagS0v~!=>_1}4k}99~foRh4k>_SpwzXU< zk9!N1Iwp*?)+HKW!{FC!q!`+zQunQ#Vj^|(8#5io_jHDu<^q!2i>xEy;S6rG|Pi{Q0 z=t=5dVaZxdFSgt!*1BK+wY@1avO6oPcX8@fveI?yG`(BDMhBsf zS5IhAGUw{1vdv<5;BK3id|X)5MmHH(_gwgXwroqIdZM2X(-D+q&+PqP5n*|5>w}t9%APd&67Q>Df4h5bW${f!k^7r&4>D zZO5RvXnxzkZx7uB20KWwv9Za!!bktj1|qN6_IfM?QFEovjXW6T2xau8F>9NVJhm+A zlV^B%dc%$L`o(GN^O2P11;r;GxP^Ru>w(|4-iF<;Vtl^BIydkH){jnd+JR7&HWX8!K-6*Wkp`Ah|fBFT$1gX3LlYjhjH_s`Uk|h8k>X59wJDG&k%=Q%Xk8 z+qld)O1v-rfjky?b5v(jM@La|#vseaQ<;Fu^O*fFNX^iC-gP+XpJ#lD%YH)E4);Le zd4+QW1EjT$pc<_$;R%NpZvB&$ov!T)<=t!i@Rjo{CrTlE(4!;dS(>q}Ng~>39Y4~2 zv+uATob_e1L)8-nV*lQW-FttxC^BGXIW|lVT3#8tg%Yw%+)r8D!)A(b(OuMo#bX%>m}2)}9JZIG zFWPmJRdYM`T#)p6mQNOymjkCOA`#i1bLt#FhVp~| z0{^6w#&1|v3_U;$8>kf)A3T!WpL1Pf&~kU;-tO@$#wXKr4gONfgdYFhJo@Ii`=+bK z3Aa%AA|*QcKs`F++E$Z)_Vx;?qEXnb%Gr%Tp57R(y%qabGI}}y!-@>ZRVYjlW45+5 zd7iNR)kn)?A2s>t-e2lcukV{yq7FQp`VG$x!#K}$tSa|;sl^6~%j8LL;KuR z3i*1mVO7uTK_c(#9T_~e@8Jk9ENEShH=O}!9_s{1jUm9x{B`V-fHeh-T+?=`fHyh+ z7e|$FB92ec$&(cCT1W!UBM=2po}Z|N$Yf0@u^$+`>B~$5-n>R#FBjxol`UoqM~L%P z(`@z>@BDrl~QH}9^$&fn= zOd4L1+=y|W(!NsYa%IvwAnio~Tp{p80c$$$XdT!0ULGPBKuM_kDn(c*5lDE!@7Sg& zTF@!oaX~j4l)cA+NClf!O4$Ar+Vb}Z7ypR?UlXU3=)k+JNY(B^JB^`wegq=aYT+b1 zFhEg6kY8cS*C)6+9amO2d2|=|Tf;eSU}5?TCfVGC8vtAoKaO03^{B(1H~*~WaX#@1 zB7$#1n5nsc(Ffs=WT^1I-5{4r921s21178~DM>z|q za&p|ZG|9aeMQeJzAAwS%X0F9fhMleS>Lx3V9gY#xC@YM++ za#d~B04^RttjS{hhrZ$t^Guh$ zBD_?GO2b!vUlHRMl#5L#>AmGQsj9RHAqr0dG|T+-<-E^MI@TiGe|be1N6JvKKUa zu?g^vWYF)SVweYT8-?pRO>g*X5|r+7!xQ6j$bjY=0EoyCuzmHg%f(e=a5X`!p8RlJ zxY6I>wt$Jn22F-=-6fXLR@=B*&+SBPq2CDCIb9s@Cj-CnpSSuE36~nKZPjZGaf{+W z1s6a?!reWQ#tl)Ciy~#bKSW<;V4PYR#vqf!G1)~$B7i#|4EAzdaLOToksb6Zc_O>f zA|yQ-lsdJ5U%fp-`8)LnR|LYqE5pl7G6q=l-cY+7!NEn2rvOg2ZXl~+>#iFLg7}{p zZ>;agHY-EaNElyPRtHk53>f;87zO5du_hE&vi0rO}NJ9+RmUhY(ze5y-}Vg=|#}1RrL%20gRD}bB^R! zpBf7+HneBckSF!)qk!iQe5NWjq0IN);1+W$++p!VuFTKIqG=X#DzLCfb;jz<`q5p}2anbyChCSr_!=X@V?$fkve+a3w0~JYkq> zdLhI7)d)o>goaQC-VUQ}n2eg)Eo4n_sEcs~sBXZ-$FW#0WB4D0a;v4kr_#QxiUyl< z$R!8mY2}VZCi6EQFa3jSJ%8HzXvK?JURwC) zon$d&QsmTLAK5&Vq1B`Qmv(mG?YwE9JFQptvN|yoWz5=2U~l+?+nJ%mb^X0I;Wg0; zUGwVzblb!c=ED-)52twW8b~g5sYaj1oLHW%S5EV*`%NnVP1^YHiDGZ|_xfKNq;h&( z(%O21yyDSwpC3PdoIj;yz*UT`CamrY6h@zh2s%o(1aqtFsY-@!A(Q!X?%H<#@H1ss zZ&L=z{b;&Vi(>Cu5~_9U?eHm9pQi?Udi^jAS#ob&`bpm$O^S|c`v18<@gMADkFo() z>Q{9vm{L^wa1YguIjfwRTCe>uf&>-P1yMyD#v}QI9!=LNsDfP{Qis_m$TOCO@8>C` z&l(N!15L3?*vcUc158;FpMN2SfUok}MNm><8d zhK?DA=T)x6e~{GHMmATa<0$IQBb?y6y=kYA=NzIxtoKCFMO_#2&V9kg5)OX4`M$>& z-o9V0)+%Oq^3WBS_cxva=~GqNg@R^TPs6UQL{I!kuk(9F>{@N4YyR8rlkw~y>q8h) z&L-n?dq=A8jOOGm7c=^}goWtQ=<~8LcY{qqC~hyx#nsT}pi4?(b6faTMb>P#$F9F3 zll1ss-t2DAKdbj2%=3Qy$PK;0p8G>43H_Af%)pj|5w{E~N*f*&?N%A2-0QySc~g(8-4QJudz=&k ztkZG&Zc|E7NwK#*wz;^!KWf*n-S4~C(BlnyVVPL@8$zkSxkQK2XV|2_*X$Q(-X??c z{wrMu4Go<1&B?Bl`IioFhu-}t+Y(k`zUAc&B}QDaRwin${VZk&qKiDsui3nyhffkP zC3OM57xt4NBC2+UCt4N=g@^ z+SbG^J;xTatb>0YzIey3DwZxxo<{75bazlzoOyEI#kHW+-A(Dth)$dSG{tzY1`jj3K5a2Ux~IrUbSh5Nud zU-l*;twYdJLHY99wl0gskF~kmL*7>XoefCHB zTf7v`r1$viFM9ov7PG@QtKOnAt?~3T%j3)|d;4m4za;%Zgh?%!PV+ppq3#6aExeTk)06`d-4G0}om4 zgpB(5mI8J+mZ&kf`@lIv<19H7E#i8iu-I;-4Xa-Wj3_l;-*@ZA2=EC0tGX!m;*Ut| z!iMO1Wetk{JiDlGT%bzv@9@?)Ab4#ilW)cCOh78i450dRV9fsES_mp($OE&GHV~Errnt^(JRpx^z@R$L zg_3P)IKW+>;!U!pMY8~%V^B2)&H5(%Rf<*oErDvRxbhDH<2S*FY^C!A1uojwNM{VI zq%nMrV_fvxzC51A{cBWt#dmK()QwhIY{5rDATJE-8|P{R%~v<`yr%X)G;(A%D=J@m z5P1p$Clv6Ay-g!*WnU$o3@n!_1+awo$@8QD2L1aK5tDg9Fs0@YQ%6No4LT77Qn4MN zqJt;B8my3Q53LP*BB@|jY=kj;ShBZcsO-PNAVh!GwII`T_k=*i@*G#Ys#HPV8=+mb zmL&ze8*iw~#}&%a{&(*GPY$G|CLoVONj;GLqzry`LNlhXiT6Eh*3Qd^a=Q- zmYQfmJx-;0dSWyi{(%o5foyoRCXVD@i_HJ07D5PlOg*MEh$9yPOLATkV>0`r*roAQ z#0jcAj=Cv_tl|$&L*4`;hzIk3vVFD#PS3GVd`PLzgh2=|`FVxJ!h2bHt$t)W5KqlPv#D`&d|BgDtyu^K(tYADontks@KOoOvYSOEA zrJ09gKi9EN5dpLbIH-(hn)2%n6wm5rbHJgLJb-6ZL#LYXkc{j9Gw>Y1G&n_)vB5}M zDiGkJ2*=nE2bNPf#=UgC7TU_jQDH1P0n63tU}Kc@CE>q&iZwYDB~Kjq8|c>fCBO&| z*YQR~s#JnDC=|ems}V>iI4U*1)-F-Lz*FHghTk_Pja`}&ls8QAU`QaW5Bs!q=b}f- za%i(_^qTu^Z$`DWW=d2Q*SfeAP|vD~Q@;Ty@FzI1f0~eaKPio3u_Kkj952x%#5k~d z{A4-1fS=)5N>Pgf`eOr?ZT|$)X(=y11s1890NM0n6cA<54L?iJ*1*y{2!mZ^pj$C0 zkTXXAoP33sueSmc3{4^bnFxtI2^>*$34&`>$%dHAGxg%7pSTw(07FhT02AN1NEK(s z79TrO)17B4fpaaEy%nGpuSiV+Y?z>G46@dx*rI_!gtMkxw}zMra&-hqtPHLi0N}R( zla68wH2+lw^O@B?qYeN(BZBggKNTnOJ2uVuCn`2tP3hhxH(Sf+MjE z6g+~_4c<|iI6@HaUI~vcihev zKf2W|^M32~d_5nJ`+dyqMz`Z)t zYq(6N7AEU)mIA{5Wm)WO7swds-mLk^tlRpIBs^eT@hX6j7c|WC!0{Y-h5xIFnB-9i z$wSfDIhhF7@NRtw-AsfRcY&4&&^SB279fgkiL%E=O}OW0t4T1ByOC$Y;wX|FcUTZs zj5QL30Bv>!^=$AyjnyE@WfGPQ*q$mgKq695N!8Cla8gEDSr=4bwyHpw2md?d>t`NH zt&zky0x!3Nvz=!ZBuB3GH8=HZX8c`3x)*6|2;rOl4t0*yI^uy}B6`YbZthf#oXlBGIDpbt zS^%`ZX;Cs?0BZC)2=E2lkWgd^RJJ#zqej@7^;HmLx=4}P;z1&*65<6#y5LP|O9F|o zinE|}Lz5X)i@2H9tm&BI9UQ_U#8<-Q6w=*-RINebsK;Eh1~Z6a8#@IcHGmCxUdTLx zmw*)x?hZhir}#o!?oqX91J349=p_$*+!p;`)G?*6Gn}d;7*o}(pJc5D=eC|ZI}%7U z)^=BxrWDtXEPjaoGJdhfS*r+T;l_%Uow2Bm;_)l))kg+AuejE*v`3|BtZ1udpvB>F zoc#UYdi(6`8omwAK9$WGj)-MWZ7Fumcgr20dyiBKz8@-kd~`T{w0QSp6^U^! zf$P|x)Se-XWhDqvp`V||$7^@K59JMj)8i;RSd30Rmhzhv#5?*j&{d^}`@qy0;n<(o z5tZXVUE62Tom5$K<+`^{IR1Dy_GMGU%y}WtUmD)Zd|5+jc zQ3(w9+{(RRI9>k9^FXBIvBjJD{>ZvKXA7|`Cy$cAJ=%{RDhT%$dLzV~Y~#i*d~?a} zO#aHQEE<1|X}CNN5@#XGv-OFI*&oz5WHXkJ4qYKC0ZKS`al7MHiRsU2yJcOtc4Llh zj@?uu9!MNEE48o&?q9=)Pvx`mE*SCjKjaL*(aWt$pL!&q{`AkF4PJD;=77=Ogz`A{ ziXXe|)O{{!Ac6->>*{mf7FAaD3YW^Ze=Aa5REYFjmVQx^Ob8cjwMs zzpowE($i8}B9`1tFRqvjZgzW2>uqIqyWA|7$rx)4bC+#C*ALfyoi0j#E`P$(>!ucoisz`k{>lQD4vH8&67DR z&FzNp*7k)e3;UC1*BewM_mBL#o`}93DKDw~`O&NWtLg`hT48%Cf6$+{+MNA0JmEl$ z%*>ym$V!;nQX-WrOXsdf?Q~4~a3(UV@bXjH*iZYv>sN*NqEDOas_CP0dW$!Gu;M#f zAZ}FmdmAE3eIcm=naBXtlRKMUBX_w)78SQ2bHGk^SO&hie{wrW?Oohh2z*!A2^^6u$DU9)cveFjz=H9@YaaVn0=58qiAPtNll zc! zGe^|B;zMcMW=oBRE47o*qUREJYNb0P)DIUrR4^mx(97NBFWpL zZ}rx}&%kk~Oj%WI?)^KZ{&RT_^!oIQregSUqV}^Q9g+WB#eCM|xmX>aK8>~m?37`L zK+dW$-dW>7=mH`3bW>OC{oDV8TAAR@prXr%b<2b|Hz{l-O;V7&Ub4TTU+GZpUT5V3 zdCwX_n!k9%(aC;sgmD#T-t)q< zPrb#2b!4({wViHjNgr9Cm#)&Fd?sYs4(WH|{Hk@^Kk=e7$$PLDpX@aH?(L|!DR^!b z!A;%je@iJGeF%HQapI+UkZfQwT@+}S@O}j;Kq3fV2dmukNKLXa$u7nmBbbaVk@KGm zuaBQleY|O40;P(MQ69v;505qZ7AB9!|7w}ZmvHM^LkapMb6z}aBe2ts&@Ovhw9So+ zYuWbBzC}E02DJ8PYDo?g+#%M`$Ih5X0cxPSK8z_@n$mB_%zxm{(yod7#pMqBbNj@^II{Z!UWsMf| zHOLi*PN0Z1H1P>suZ2{As{tQS4p49*qYcZlp;wi_)Hx}!gn;m7S z&WTTAW!Jm>akZ_iz=~*46%bntdC*KfYF>ePt9t)75%skv*)_6dB6q$}`iFDGAr*Tqz6k&5E1#@&)1;GEr{Ge+*iCHJB z$S_RX0W$P`N^rU{xPROS{t_)L92?C<^@Oo?Y>eEu%1qNB&U`-Rkgi$;Yi$r*&b7^j z0QoPtqdai2_NM)Svyf~aLPl&R%Xh7`2@Zic!!&S;_6ZDi+~IgM7Hh2zj!Bo==os-u zO50kOmj;6_TLoE%ex_o)&bXk|-l<~MjVa(_F;~JSq9mIGcsPrII|SrR?hxb@5CWj1 zLc3dw6pfB5s0#@Yh2S)xVMBsBKx#lAwZ2SAw+?0t(7JpkZbn8=%9KiY0Mh(mjyQfd zGFL9XRxuMFFSub|&GJZ=87=7HfHe!aZo(~mr?&;TA?^U!zxc{{4J>(-ts6CB7ZPh~ zha|L3Gf?I--vn|OnYg;dcF;Lh2N%$!zXj!0lG;1Td}oZE9Sr?|0Ir|=!R<4oS2-DQ zC}y_{Pe$z))%G*!U+OJ(!IdkX1OM1)&dJD=DAE$?hDMB?3Zfm$&QFV|^e2V1Fyz!r zushA`6gwWquo)WvfY(vV#ej^T=K}nbGFkL8q07Wy0)+%X6wVd0NOYBK6dYETxx$BR zF}u!c+5W3FRukj|;$+$B@5KIsP;_W-Kn~sd3wDT-NbXZDcE*zWP3(%tilGm-3R2#< zvFTA(xrnYJfPJk2j7cmw_llpHiy33HvGS%@BPFo0`V=pZHZ2tcn#fYbqJwl1$8-W* zyGN^!N_l}KM#c}>fxkEQS)JCRc4-@M!Y`~yD~3TmE{7$kE7Y>`SuEBH+^=6%B;df+ ze;%?E&T`EC`8)wdUig(~fWgMmg2D4_YtfwyDm6cwFkVwdDp(jlL>`dnXVRRcK&^s1 z;+)IDRg<;h!6C!!d{D~&KtcVZ51qsbDh2Z_*?MHA4jBRbb2PQZ9O_G8e&hVELF(8f z`xF3(r@|n-SQU%^{Ko-fD;M{HhDLM)94<>?Vux*zligGnFu8J}p5gNp*=Q!DtCQxS zNYI=1l`hZ`QjC&5xU<4_xL}b6Mn+W%hSpDm{i;z=;4^7nKfGb5%jvYBgoQC-rSk$f zt{b}rgG+7Lcb_68-~|C19D?VNl_8Y!>WBZ$Oo@p}j-}aYvSfap5Fjoc0H6pJ39Ja* zgUhQusDX~nvyEE-z7h%+qGd{CW)#3!0mOKVpq&g_1)!STc}xth0D^6hbsn;9Ll7M6 z4(PpN$^sDHHjnY4g%y(=mub&z|M`7Fw2Jr_m1XSc^Z*k@VTQ^q(<)_MDvc9sadZgN zWd)5J=vXyt0Fn_Zy&rDZqsdo=JQAzHkU+zDc%o{cV79R|95$E?iP!3}m&e!|;tN#> zMW@?L$h;2f0bk-Y$SKiAzA{N*(Ub=$1$8hP66|u3Vvo0E?tgi_d z1J1odh)@TkfIp|g3j}2ne+Bm5J(=r2VX8Qm&EY}a0>ynKA;bDRv?e`l0YYF05WW+x%FSs7%>ri zV3jd>5C|2ifsI*@UtAUIV&!A)(^=q)KK@80kbVUw< zZ+L6_|6j8HN0ye>)vAc37A{kI5I%rhyzI!Kx7-)Hr$Z}WxBnO`EZO@ptQPUDt08`(q|~)6z%)LgtJIp~|6^JTw%5e%1GeKz zPs6~UEj#5GX^KioSZ@F82ieW$51_H(`%bkHyRgsiiz%M1**UB%ycZ;yslV&su}k%& zdS{CZlJ#*ND!DBqhO6X>?2OJ&j?rDJ_>^$?1qZd09sax2UcWr>Z~p3P{YIF<+OyRJ zb<4FEd$Q~VfvtYppC6=|ixkyhbJ!M9Uy>h+n=`Q`MNgu(WPBs?|x=;YlApfz1U#ob?$)_>Y(dJ%Hx~0D zZ%XP3c-uv^o87Qbi!A}K%8a|;%#}a;F29dfEeBe~6*O zuy+OtNj-~k7I#$~3+N@MF4!SKK7i>{GcVY!@5zZ=JHz9qdH>A0(Zc07cj z7sAf-!{)#6#?cB#T{ViJbL`PJFIH)g33h`_CTt2M$oJs9+drKHKdr@O<}+fR4EGoqLwg-2n%3)riB0>`)Riy$rha2w zP1ASH)h>xUKet(2)!tm$!lEaD85P?m^4!*G_e?&z?bEKbd@ilXupLhmgb)%?!X|MO z5M&!*ZF<4cyK%ToC(FMxXM&gIgcDM+CkZ`7uU;w|{pgLeVoYe$UU;@f-&{BjRdZfZ zr()i!#8b}?67QW0AHIO6j~K}BE;;x$`^M4{v;HXO(4l>_qkWSd#D!vagu|#&s92O0 zoHpR0e?4r-WxCAP>Cdf{4K(`$?W9g|XykQVkt0a>9ExT0^^Sef`iRyVnaa>9SU!7a zuh8v&mffg2dP|jWPE_cwq$CwTuSiGJNfkfb*HV(3t3v1|js?=|$<~6K_sY+Gc0@&^ zV|RDoVm?=zJufAzMGCf%NF<7Q+s+_2S(hN?SE@N5YyHqC4DFEV^Hv)4M&iCM>iDY`4s&A7+jca0 z4eG@H(YSYnse&%GxO%v4YxmZ=O-98Q&Z||K@HA?Vvh~;()7EpuXZ!Qwlg2q5Zq}rzL7vP*f;zOFR!c>>ucG^~lWJzWPqT&xb>Fvmg=be^9|M zhuTxrH5=~jVJ$Z6)6tbT2t#N5pOVtHXAkyJN6AMIsO{e0RN7T_>R1f#jutU_qf%Uc znI9P7cuV{8q;}^~xgtGm8b*h!RrT?Bj)H3;vdBz?^1;KLOV0#;yxqd@)R+#HV1=WL zZG#){hnZ`5dbBP@iu_~UwSv^0XUQ0@6279Ojl1bmBrO4NoZfGAqZNdD<+emdL3jl| z#atbwXI$B~a9b}k^FYdTiH0d=XSS z5j|j0kPW9TQiIpObfH4BLH|!Sm`TQN>i#P+LjXIc?wY_|MlCy1?9gvZx(4oxKt!?l zvH?h%SZ3$rvf1aj%f=ThFo!b*^|h+d&;^{B6lOW4%lHc?()8)KuBqr?tWXCS&XjIh|u z9&0)nM#xYMKQx=Hl=+&WV;=sZ9!g8gTmZiS%`n*MD6wxW-~<%Q^}lE5CXsR5978VS zCmqg-q1t6adUZq(5T78-iMHlBkwt-e7+_Qcp04BRDWFxuX;}mkibLee16V_90 zHEb7r8f!%5=phgQ22YZE1I}Xfq&lK$F?&jghTqr90zNXeOew^_$p(-t*0V_`! zbdgZtLos;z)|_OKlGJIklrd)%wBENuSAWgtLke9cS!agRoYc!|NvN2L?iyaQ1Y`^n ze28&Y2+JG<$Lb;cY#wC$kBYdWF_p=%THy20Z+vu+;gy0Q7=Q-Djgka%!@$>u{pj5D7iJ)|wu?8yVDM+717ya1`G%6wEcZtdC2s?<~tG!L7*Fp0~lzL z2MHw!HZO?p3{|;kru^nbN|ylf5SX=gdr@9Cy&@f17aBtX(CiYyi()=dAaG_!$AHY> z4hjk6XafF{)xh`FGEZW2GYvKes0c=JRIPh-x{T-lpabCJEP;mFH&CE=JkD1@36)g2 zOi9SXybft8#AVe47tFBa= zQh`p66~V4@N{nE`T=c=UI+*c*p0Pi)Q7M+8#iw*?Rak)j)s{kpUE`v=lq@I}0OKHN z6+!qI1{9a>&Kk+1=m4Ks6+{A)S0UM02Gr$Mhto2VA{`_hV-(X{-L30F(Wc8N_cYVQ zyPys}Oq>q^D+?U}BEZt>F9KpL3yP3E*sIcWt#@FG7f#Wa0EyVMV3x%*i z7-<2|l|S$57*7BiJsKQik7?sa1Edyde0(+SDv)N>kn9);$}%vtcChon=8EnG|DH=Jn=jybw`W=CgC3VJwlj}MC|#Y|KgFBAB-?fTaC}y4>)pFi zNk#hWgE21*Z(VEd^0 zKD2epNTwAsqAaT5@l=1brU|;Z0zMZL;4`edU;Bgl;G1fuREjgG1f|FsA5c7=^L6o* zE;IjDRGE~TNh+*A&NS3*lb_Ft1%&Q!6*gDNEH@{Ja)=u&KdLT{5YVTCy*WNi-LIp9O!DXME!>SWh)$@uL$5O@X zT8c~!X9|iW-n8{@U{_uBTer!UIH{SApO?lZXWnQJwhYH9UOq$&dP01vtVv?c&MzGS zq6U*@jHH#}f3JD%^>4s-MPg~vu}!nca!bg52`8&uNBh*yS;+Tt0J+KC>HXqc%i2Rj zXUxgM24b>f&K?FZR5Wb5{fVxQX|Uw&%(vR79U|fIkeo&giW$ZGDVe!la=zbOiikYt z@M_f-~>K~PBn)H{`dTwmgwY(2F@@;ftKRL_(P@@(;Epfi?F;jH=Y>CTP z3C#%|==Fr!5ev;Ln&0m3^0vAAy#Ry5vl%l{=M4(Jf7Wty<~SXQP%6uccty{oV>;$e zuGii$a}^u@&1Vd8y&5kaOcrL$d9d1B*(T(40Mg==bj4hEXujf+e@;uA+6PvoH&5{F z>?NLc#37a$bGsOArMq|Sh@L3hK!7Gy=5^EeZw=@87BVqUig`ZSv8or|l@3+ldzYen zQAQCjH{s10p`26Bgn^N9?&Ni6n>oLCr-#224wtNx{r4D9jpVNL>N2zl>W|Onwsf_m z1^?OGq488ID6CA!{#IaWOJA!)%>mflJl8nHsL#}G_*OXU3XiYMys_=*o$t?1wK^fR z%6&@DlcPJYJ=|*))3>#+PG0pkHjWf{8$IiXU;=8Mc z_USb|f}$z-J^3b~X5;W`1lg>s^>9hfWw%>f$~mLkq+b5KkQjW^?A4^@ikfqmc$&$t z7utU2ZN3a~EiN;PnPwq%OlwDaH=<} zS69&w)z|d)PN|(aLun8Jy{=R;Y*@_4&uzm+SUlA%U)dRuvZbAgEJ~(y24)F zbXZRO&-%=t2Vt)+JAC6pCZ_a=VEff3GlreZ@%S@1L=n@if#K&vPnfw#Xt@n=bPK-D& z#LFKe{5c_3s3vp7!rI|zT>X<3^!d9dEx;g|pbTgohhCquTYK>AwA3)tk8X=L*ksH8 zdgh_K6`NOmFmejLR@TbaP{}%PEVfTdILlkLsLXr&pL*g*=ax-7jwCg2P5f%R?@1nV zfot(~k+Kqp+Pd%F`Ta3k*1AVfeR?bJNyM854KwVpQcbN`+e?A!k(4`cF3J7(?%ct5 z!^a9f`jm(B-Br|^-)vXj7b#{hG)T{4MCh1aO=lcz)|a7Lhc`1_&4xPE+UAl)Ce(tB zN_q3JG8w!=-bqNeA=xWh;p8k0jasD0{)IffS^f)h9|@MrbHG>v(oV(s`5Ls$>81uN z3EXVeW)Q+EG8YoiXTbmXyVgOWb_!5izY65m+BUulqUesPiy9I(i>%i6Map{{nUqgV zNm=}7V8_b-gbn1uuz5MHi*|fuC#$V&(nn^+*un=&UfM2<>Bb~xs13G7LP>v=M8RmjYl7iZ=cXF^r z%IfYaShSknO~gCB5|XejdIhY7n(cFvM+*Ui#!N%EnXcgz*RNy6QPUIak*Ro1lDqhk zq_WxCS4uWOTnZS@(0Ryg{13Wui;X@707Ov{0@!dqYsrv|K>i#dc$LqmiI#XEa09>C z*=0j&(U3Oj29~cFm$vQ62JpNf^oY42LFQFIEn5muEwLM4{`i2VtC5`4CkF_4Y}#bu zWfIAAv0y9pnnXn3apB^n#W0>b>~rFrbHy-0mfjH1Q9(fNg+B?{t<){QlOY#Bn5Wh_ z7kx~h<(Ujce_5u8=w=82@(h%4L$>#jyJC`Mli_awbEXi%N8&8{1Zb%ub70#7eef6x z0Nre3tqUUZP_kGAwt^{lzP*bk29f8s{52jVdqav^Elr|8Pm#AA!0PB3shb1W!o@n4 zqaXn>0tR0L(&D-RS6GlD!UQcZQ!!YfG(OwBFXGl5m(p{c7?d!+2K&A3tZXv+KoGdbywW%Rue(MFEROK*R0{=OlOg#kPLGWoyk<>}5k1LQku(6O_ zqCoJ0s^w|3x3mn4OPo_Tb^l`Q^#vI_& zBuqfxAu4<9jD2F^GX%WaE;7r(WpqMj0 z6UmkH2B4;tp`f59f4iJ7m%E^atJprEfI!8pFyQj0U0xK+WI(lzc9-H}^JKmYkhnS| zirolc$8NSNau```A2xnnQ0YK4(^&stCl{)2H4JRp3ZT?dPewSu*OTU8F{b_SmTLA( zN|J!)5AA34rXt;IE8mrpticmn;ZVS@eA0LD&wO=u8+i&r(Xu zK$nj+YF4Cp1;G~cD9XwJqhteCVG@5iOk^|&MFj)Dd8LFUhY@=g)uIxT!w3;hAQyJnrUfY6 zd_tzc8;;B&!BW7o1EeRv2w5TVl_mOfe2Ud=%jeL=HAWlV9OMkEpzg2TOnEgBOU+{j z%apK;r_$^rCFJN(a_|MkPIGM9OoAX-M7zQ+ridOqY!Y?a=*g4U1!BK|EFNrT9n6fS z2`X_F;P0Haq{F_^F}A5o)ZCGJ2-pb8*Fvpvrwp zbOG%uw*Y*Xle!=+z{N7&To1A4f&29|+24(BvshpX_ML&lLF5e~LY04+nh1I}Uu$sL z^+2v1VO(haRS4Y&Bn;l5mk+JGn@PgX2)R0GSqdv`3g(Jt4Ogo|-vvtS0qIX5$^)!E z^JFj$F0&`soY`+KHEsKKawmURy51(?3v*({Th`zRzlof9r{L7~ZRZMhT(ojE**_l9 zu2$`R5iFj6#4$Rfm|I>wBz!wPPGuE(^z}B&H5{0C(#4}e@#l+?a*-In`Wkm6RSk`dP zmTl!1t7y25nY5f{)!s3&0+yryXEcfyaF6r$G&=Jl zo()IFY$4u#y8X49+5FA=j~BeYojEaNd*91!2pr%onwDm0U%33v&jal*5C>l?qyyw2jj#*}~Ql5O-6ZwfmC~W&u zhs^o6p8rN_ZB3I)*_a1+@$u**+0w@9haib2JBNtQs*z`b892fZpBtvfkDh&M84`o* z!{-V6!opu2&eNWnIuxALE$t<(czoN=D~j(;KjcM}4CVh5tesnVHnu)}k^kIOr{LZ- zU;B16z!wkE`mS7hcoUs4472_@w#F;D9Qv94L5+g=asm-rs7WAu8Q(>{Usz5ul z2esSljtMU+%=n6wv2s=g^0;h)0DtbSGK&Zh&-qsKG3Bh~d9lR|F-69*k!pa|cgEGgqeR3_BUfvN!J86oQqW#CXXQXice%J?)CXS4{ke^J^VO( zAHNE8ylk9J7w@~)C>31a|Dbkfk%p-=J3S4(ez`5Dp)z;%%I%#}1?frSNeJvV=ayyd z+qb1c%5FC9wu&pZv(-FOv?sMes)bO*#1g0|G@sZW6)B9mb2LUZ z^Ngx3=tWfB^qW6cO}w2`bt|?XmpwnHW$*0`&G-+ zm2r{cq(MZnhtpg%|E&D+<2{Rv zW^@TB(I?BR^q}C?qL6S@>S4am3T=Q~Yv2+XNcaioa^IuHZ67>s+o~4>n zUaGeUGc00WC|A>`WyA%0@b}|^TY7B-i#hV83mzP6VZ)SLH6BjOhI?A4rq;1Jy1U1O zOc)?NUHk{6zGYe#^N@x>hT!#r3|-L$x5w6Wg!sBSS)R0HArSWo3TCO5a}uu}nv4LK z911^%Nxq8|Gyv3;&5<$D*3Ti~X9f%$WUc`YK3*EW`4N!mxtAdR#j>ISD-=fAeU=Ub zxF|rz98Bgl?x}~{^-w9W-GAyJO48LJ?1?Xz+fdw>S3uo3W`Yk{iJ(XpY^E6YbT|u9 z!hnb;fM1|j5M(K`gFD;kvn4F^+(JsZFtF%K7Lm7m`w+lYyC&NR4OUqz42|+)&M24@ z!JV*$4LIweUFZ5^(hY^6`3r>MnknGcDP1br40V778B;Bz8w^4iS`1?;JV54wgkW4T0P&^|SkmEA2ACj@AC3?G8cq-D!i{|(AfFg74=q_uG!r58Kr8~~aE zM8yMr7Jw+TCu4e)7gs2OB)Jg=eRA%(IA?$vOw+zgx@Xk z)9V8E%UO}nOTi8bV%J3y>^VU~pM?u!;r;`vba$va3o;%*Z^s4?itK5UeW7`8WeExF zzk=q|GRb9SV~aF9Y7h3M&$< zqQMEFj!tBr%xgU(nRMbGK!_r<^aOIncCe=_w5Wi~{+BXoU0M$TdFvw71y)NYiPhab z61EB!fKnl%55xgx^mMXF%6N&SErE7{vB6-2V{uAYF?e4@2ou@0=$x+bZ`2P_M%E3X z|K&8?w0XZ6!I}@t0u`tlSW3DNZOj}Pt_i%bZbvwXpkS%^j;T!)-u-fj2uDg%j|=#776U$;TCzUNMzdz7NG1M?0q0V(j|92m}Yt zQuF{*iU#I-oB-7fkyW5XKrV>PRk-w6h$sN-D)TNe82G^;T=PLhQb1{}qj&|RQ^96e zR)?MAxk!=z0M^)lkqu*Pqm?d%oJhxv%|Wr?iR%K)Z?NoLXa)`!k@PXk6GC|CA2Ku@ z(MYgf|3C`{z%e+-3G6e$T5VCF;!cnP@y04Ijq*{}NI73Zwg)ScungvDo&aL;w>}sb zSQZFQfiN2@0{_!18bbdMYRG3@sRZR2ju`w#_M=aANTW4|lo%Yl@JP`?N(Zcb2VEds z!HGIj#3Dsp^m$kaZTybpmYwe-!{yc}#uv^Nl>20|o~ry0k{dje=--7sG3Tcc&nKMD9OV4i8L_%jpx+SNuYrV8 zKSdg%_GEw9@PxiqOwi3Dx7Tx9vSQjMuS#z$ko{#Hnm_7Xn)QT7ZrK!n5WlaX)%v*g zST^(J9)fP*+;j+Mww{bGvP=C(n@_xBu!!qqdf09(F4|7Y%ytAclug0UwcR%Bi>v>} zSyD_n55YBBPka6N6K`@9OID^UuY2wF1ViXfR})q7!l#?zQ;8%Impt zJEdF#8X6(j4<7weT%!Ao%j2SwedU>{72OspUYff?C!e5TyVAimN8dkDt538jog3Y| zC7|$%f34Hg4oY|c`D9*7hGlLu0~u*VTg-zvCwX%D@f{YQUZ|Ipsj91RNIUK&Vv}yY z*DHv&JkfBK%PgTYbyoR+;)EQa8}K%EvArZHvn~=rUvypr`xckm2TeWEO}VcLfV? z+-<-i1|w!l+Huf)P1w=*hwhwsQZ5_AZ@Ibm zVjRra`!$5Y{uz_A5L~-B!@{m z{OS$o>+v$P-uty`{lku zxg6Fxzkq8h~}@?t+huOf#+RTC&h-eh* zTNMooU*49h_73wliKT7Sp7*lXc~#kJOcT$ewmiK@Nb#8z-8*hm>Rx1;<=ab`Qxxj> z?`wGlrJ2g>wd0nl_B#_kxspxZrs?$|0p90^d|w=vMfU2mKp#T{A>0YM#9_>~=T({I zcsQ(Gk$E(&L#YSXKD)LNZ^?Md(<(NkJ^z+J^YtzhmoLh!xX*eP*`{ zGt2LuzdF-d%R<}dgtd2+?f#CikF?5j3A>^_bqX;~Hp#@4_NXGqCw*rrCVSMD)C#@H zQM;e-xKJAAD>hkxxU_6*Z{{ig>!z~zrb<}ifFmg?X6sas9%Ma52 zDBew}y;1$-#bworJ#r7+goL`m*3>^tIq)^t-t;&7T;KFIA(zeEH#RYZ||w(jgV0;rsg)akg~%`wzdo%_hax zU-yiv_vseg>&PC(&l(=_SZ<3?vHZ~4lv zT)ZBmWih$8b%D2c@|uES@6a7R;(FWVx5WK7o3~>44s&026dxv=%_x;J-apcbX{%-{ z-@5kXSxxk{iU*c{jS6Ag-VxP0EM|8Mx#QzGW-Fg#43pY5?|CisR{rv@3wHRKViDTJ ze*@{siJhsAfHhuEJodrm<8#g(tLmqZk<6<+KvNyab1s_L)USWNoZCRzot-Rhb!+C5 znA69ig$~|3(}ug>x&~m3ld>0VvS7G6)!g#bIhThw z&Hj6Eaj25}4+@;lr6PK#k}8YrCDp&7cn;UXnBCJaEqZObpagZLwf%F3H(W{LBI9EY zw4tQ~Dvx-V<tn5H*wmpkKZO#2~!yY7f0J?r3nD7_xiFDU0cY=YMM$k0Ye zI;D*Dc~GY&h}QFf23fNy@-nhOJFHNI_N<4DelG!j&92MrN}zn$;(|WZ2DWHDoJkRJ zy9w?9&BUF39PKqoKEY!kT!1Mg;AD3y8nPpd}&E7Po z*#ZSKxKYJU%ao7U=T@wnWa878X=oWw7gWy)fo(yIyL6r`*~soirO*{t;B7~(AhiOe z*JkZJaHv7lz-Fud9%9TvtZn_gE$|#D^kAhq0Wb+bamALgo(G29x&Qwc|0gaa)%`Akoa&=#Dc!eGuxc4;L ze$dTGixe=JpjcRWV+P`;bDe{va}kymvFHO6rO>4SIra_M$+h7}Sm25930WmN-v zUV|?up;wp>>gShg!Qu$~?i+wV)t$!?kZCwyiCdUeXy}I)&hWuf${FvIFN@7vx4y;J|!m=#tO-qXG=%L@u+sj zyn@pwAVIQ(n-~_{<_oy<>_(56MG99o0DVYYV7QaT#D#+`kOdMHZhn)H=5ahqrwzaY z1V{kgAJ|WTPuP5x{PO+IhkAq?EwfkzV)*|MSU|vn&`isgfE)*t#iEsGiY3|j^=iV8 z;UM7E)GK5SL>No*gER;d5Cq(Lf6MyHzrgat21Gfj6=wl<3TYnyrB(&e1bEa&AcT~b z=2!t92hN={!OBw zvcmMbOxT`eEb@m0AT~4P(x)!KlC%I@3R4ZN7&!D6ZI*(Bf1E|_ zj&m>MOy}7G`2`qp*%e}9Qd;W(acfh90*hI!cuvYZz}LQ|p%q5MYE%@~1@bbRK6yPI)OxOR; zN|AQhpLh{Gya2==-B}s)JYXzE=6TvM!7S2+u~osnNAN2lEo**}Lr=1VlzJKqvX}*m z?9C69a2Y{s!}&5D*)9f3a^(!UP2YgA{kcs0V5FN}@&=g&l-j_{2TcQmM;;SeU&zC4 zdKdxagB2nk{3ESZkZmW{1$)$dHiNRg5}zb4+$zq8KNb=CdYZ-1r@(fLiTtexhxLJ{ zbG9IUo?QT*9pf&m5^zI+`~Vh72)u+q<(0Kckv)RLB*m74_-q|9qLySOq5)n9hXm~g z7It`zpdHMCf3Wi4JruP9s+|htSp{Ba76Q;jI;>~w5pvUXot<0<1Rm`IWQ64OOOX&r zdg{))L*QQH=-(A@XSUSZfS!~KI*9OzBq>hG_`zqQcoWS82t2BbfPDzky$pH==P@7V zZX`DY$lPj7ZH#QxXNHvbMs-_6B{Zcc|F^ejOcC!+6jaI>4<=tRFUIOnIu+NU~tR!1f;E4C zocDegxS@6L<@@_8RUvA0^3NaMn{@8{bK)UMrNh8A;q$g9-HzS_4(1oBQG0Qv`MA=n zBY(EvXMWuqWy))7f3s&|IKL$J7&n!Bv(%d~NePDSYWd(Rl0EqR)aH-#yII^s{)E5M zkF`vHE%%nEhVK<8{v=Cqs?=?3Lb8;l>hagI_BiT4Nqr!Fpg^X$-BRuAnNx?=c_(MY zGx{aTvHN?6;T<@yitLK!3tuVE)(kJER3@fhRjc2^>t6x!6B5!ZUot3a?M?mZS4xLXii1D5X zt_0^nZWkl;cGyHf(`L_TtkG$Vb-|D4dSa^)6B_)s@l1M%h24M3i&QI_Ga-!ztwczC zNl(Y>yk+67y#oXFt)W&q>*mXD%#0ZaX#0SpqaLA=7av)ed`B$dS+;8SSgmrOT%<-$ zQTP^P3v*B(q4iZDOC&Q55dVhsfCFO_iU#L6U^kUpH{o_8`~Y4KiV4^lSXl~ zMqa*Sz57Vwt(^*+z3(J#Cdk+vN$h>>WmI+0(EG+p%qU0txKdnGB$MBsw=>h}!w9!C zRE1${W7_fcIMHlA;%t7yJ~UG0Eq_P;PVzSI_jlf(Jnk5TRp9qu@vR+-@~PM>X&km( zk-mHQMp#bjjRV-8NHgz}R}^pD-A=`*2k4_*Jy> zvfHMxCD*W&6#vjqr>2FFC3`eA#aENREnvsJsasvUtpDY9%R(Wwm2kvACsbw>-EJDb z8~oZjNAK5U?tAU#aIcS$`^vZ|QT_Rau(7R6QNpfGr;JjczVob#P_pM;Ib!{3g7m;% z9)9{=w}V@Su-at3i<~BMCdRVQY7JjpSI^j^bkF*{+WAwBpVQk8Ek*8A2>paRKzKhF zbeLj}q-UI`&ip@)&OMyz{{Q2joeVh}=GZXIAsI`KHH4AFjF40^hmquv5_dJ{v$i>e zq^UU;Q52OThoP_#9V8)=C`AVyzQ1?B>$?BAuWns+&u8;~yfq+qM~PuDI-!tj!^OySozyr;PZqZ<)UIQt&u!7pk>S_+3Z+brX-( zvi&{c;T~(x92I%Y#<9Ielts#%5CeUdiTik{p6uCu+Zay|NNj<}YwoV(xjvSRwW2mj zYu0{nkT_FIcvA6^w>3=q5}%d2wq9Arv)?h_z|g5MMWs9A21csz{Vc1Af>(}_|AXRl zOS-zxZPe%X$6yq#%H@yEU8ZH*$5-mq6s ztEf%EJMtS%pBU-1wLAZ8dbx**Nn=R9aA4xWd)lm9(o^&XPa8qs>4xobvIfycThtFZ z2yY$t&KxM5SCDM%zvX=8MG22?HhU>aQQ^kzRbM&_8;F!~$1ecpgtUnM@77(di1^y!wl?kH`o=JZdqVCRCiZr)^Skq{9y_tn3I(NTHd`{_5lb7?&NJ`R zbEcGPXo9r%^N;(}O{cB(4(MvEi?D=@^!C?hoqhS{NA{Nl?`;?H2lwoQ&MAZ!58Ct0 zko1DdiOO4h4kqs;7#o3W_VmZiCzXwyB7!7hX)m1QtD~Cr<|T+8G1o(1n>2mtderD< zv+N_IcsXYG$!p31>uAwgY>}e>LB?l}wyGG6luPTX z>SbwV&jw{x?icpybEMORa?A2wzpJXsd-Czy?ZtV!SJn)~?H@S}@6W2A-y`^~#cOdD zQHv<)D*6l|Hq5z-IdhU*!vD&Zy;OB06s=x3apb^BBS$niiTF=X{8g{6oI!nlJ(04- zt+tsTV+5`%qiM-})uX3seP2Be3p*7ZsdMmVU%t;-N4u3FAA;|*$=?ds-3@F~6gVbUw}GOeZJGtmC2PLTz5JtuDdVO9Bb%XvU1haDHPISn z_zODcoq4bk>m}$~FJvZ7mY|&zMRu2OQjI(T2?T{G6IGJ{KTu^1XN@g3Jp*(iTMgKc zf0og0-i#(?i!1{}oPX33XIG18cOd{7xASiU)AKzQQ6KmooP^|}{h$KAERdcAoliho z0TvcacwmH1-g3U*lZP!Y)?j&7)m9U zf(G3M+b?eRC{bX%4y?Ae5Ohf*6KGl)HyTJJ^)4Q4vrH&M3|upVgw^2&)RxVCGFaXq zz+AD=id+|uPOel{S9JU8hq|>Sln4=$9 zkO@M-F31yb9c0v6?QF^c$cZQd0$smaFlH+GdN#~uFff1+SS3*zgm0p0Fo6J(;Q}P% z1W3C~R+dDpv>6hvv=;-pHtIm2G(}2mHo0U*$ofMTCP9G6x2K?0Yhf_3YLeVF{?zu4 zvkP0Kp9`Is1xP6bWL~GFa9b}Oq4>QH@8M;+WjYCMy<`L@f3k(PULrPkH^AW_mIv4h zrqoM(jE4QE6&J=o{|B@VB9FP7XE6|!8n96(1M?D=h$R!z9Z-+;z3*IG(1oI0Epy=x znZg936tpKaERKR%{l8B;)(K$ilmcy&_#`op5fTuoh~w33R5M8YBPOpJK)5d4h3sHP z%81(PK3r>Pwg_&+H_sL#l>UuJWTLyfACj~_o1D%B4$ z1e)dMBOtZe2D&gaRO(ekD^PI)PF2zhS+KA~&KwSRNZajWR-HMRoQUrL#%d~zBBeo;m&f0kv`KjJKm**sCN1Y=L| z0;R+ufPe$PZ5_OfRI1npc#nd=j0EG~jl_1a)f~%4_LT|Y%!e&NT9gV~DuYl?8gnXC zDlETMew_98u;1Mx=B!NJ+vr$HE`N)E%U?hm{=Ei}ADe=Cj5R+=UJwYVE$lZ@&n;2T=0<8nTVuv_n z7-e1w$IP{wYLi0CY};g_%h1u5;1g%D10i;~0Yc8*Awi`hk-#ei+K7~TS!J?1AQl3v zkOSb|VF3tSJM79H&1`JRn0@-cl3R6>Z3Q&!0N)N`l!rp+Ckmjjn-1UCc~qq<4pOnBJf!Mr@Pg0&>z5gAR13R@!}4^{zxAA? z%0w}2=NWtaMK?)5L)5AJSzfnS9c`BFJ7*r?f0NzC!bbhC@a~BBcr*jO)K*gb)jq#Z znN`KE-XAmPV;&KPF@SJr{`6a@L8WQ&2X~ynDa5Kf%(&0UbVka8igvx>#9cn5D)8+7 z_CF}Nee9UXc+lBf&bDh6e}^OkG;>D>Juh9h~Q+`8?-{w zb6+iO-?6(Te6nEZlmSmMlzp>j?){rt65=%fz3zB4>vOS}eb-xXv(d4_2@3U64(7wdgW{@PYD$3<{=6~Zb% zf7o*l$)a-P|)fC63uqX-(TP~v#6xwz}dNo0?GvdfKr;ib9ktR3ybdnM3*PfaYbcW#I8 zHO^IgkP2dfsZX=w9=!NHE{0X>Zir|#W~^Gtor@UMDkk6DZs{~v6-?7``LNBZ`ofA{ zF2q8<**@k^0!7igl+wl~UVd)Gt0PzL#<>_b$FK{TZFjA!DV> zMXTuM#w)qa(^vWTBzU>`F#ZOwC-cz$W0_u=gS?e(UAmuuoN65T)aF-z1(iZ;UqlKN zblt66jO{Vmv$SZXZ<~o@O4`Pq)E-4gkP))i7d8;TZ^RB&8f@E5#LreWvqw(FX_llC z>aS|pjbF9{e#H9jIMV0G^Xby_?O?jCtUmlzCrZ5f{cz0NVJA5))Ns{tj3u7NS%rx6 zN<2#`H=X}Mj$&0$@^Vv{)_;~-6i7i*eyp+nPC{2#Kd(i}BLe_3^@% zP|hBScgaSBm8we`_(9pNt%n|~;9vD~(X4!;*MPxDtTj&>=R1vy`l7~77_|-B$q+AS ze?y2ds*j3Z`Tf3G1Tk%8n&gM}XVp8Jsa5C5yB@W^FYlln;G`l01b3ZJ!WyQ-eDiw5 zC}+@Bq^!1e&gfo>)|Miucmyse>>J@2qx-3;EEOCIJt?~d^Mj}&Mi z)9{tJQK{}5nHT;AoBO0o<-htxGdUU6A?2TecT)OqGgk}VX#wiWSdRL=lChF)=nKk` zUdlplCpcMxt$++0QiaK_3#*2dIO&DauJYtZ2X55_1*r%33$% zy?I>w6tNF=468Wks9FC(#z{S-v^28||E;m4r_ZIQ%=M?@Tx%Fz!(ff<3w15o^8?8u zJWJWW8qMrdLDLlq6xoWrH{U{ZI%x%`_V4D-T!MZ#3%1i z)%3^?@@c)7^PT-h)TpB=MqtS>(lK9E_X6W2HXQYs*N_1vR! zCv!>Z_&fX8#EUN-t#`p6G?JFBHCIGz!fXjowpkVzUND#`U)N4|g4x}8TG-?zzNh)f@yN+gZ2E}3yi_ZNQYShTLLAn4Z#UYE(_30DW@ z{_mZ}H4kFFO3HTZYa0o#l=wv6(ghG}W}yWDlVEq=J%M|q;u#K{@4MQ&czqc+TuxRZ zFdKb(CFx}#t7btZnMsBV5wPG+oR6cEm{fBt_oM<>vlZTyGR?%R{Ka6*w)Q1EZr9Xi zstKd388C?i&|HBh2q1HFuD9C5L%JG`XhfA!8+TqnjIlPaW=7$}*#G7iP>8lVfq_C> zAwvpKcL#ww2!QrRmkDK=ExRHl{cI(szB+feU9BRb52Yuk4Iy*LqPkNN9`-$k=Pc;9 zDP>5$VWJn4`<3q}s#+!j198FmWw)8mMU1~xXc_QHt_f=P#~ou z=&I~2S2BcEtotK%Ds&}gbH9TWm_JZUV^bzu5w?qHAh-5PnNHd=)&UWKHrwWWxU_); zSU)jO@F*Wc{|7y@AzQ?fR|$wUt|0+TFa?0?HM0+r9fC-Iy&!Hb6_IYF=g>O@7t0pv zde9>5cM1lff!;3zlRV={5}j4?JaUBC7Y1CQWmov35HR%E>Ke(m8e^}L;A(o#Z5{1k zvNh>71@09x0c5T&gKEQxI;bAnJ(xs9`>`t%LoUin(XFWI8BBDCF*B|X1|*L%ItdVF zv5brHD#X0dSg*t=R_kY;-GIZ$uwDpJHwV&_i}~e$Nu_ofOOyy;kZ7Xr_Pqjquzs8sw8!zp0D4T%Y{hr>9e#SRGj zTi2I+r4v22QB8q8ry`hq4BIxORKtteAqfnMU+Q5Ee9$mMSAhffiAouCjdM`8`9g{f z=)i~tCfnnICB0lg(k4j7fVpnj37Y;hWbByagh79;*48#(NCpzs7IpL4q`XhrBBV|X zW}6Xg#BWa~nOk{(734HyCvs$T+=!G)2NW`^bBTty(15Tz@1~b(l&b=+@!c1_#5}$O z!{{AEHY%W(lByCk766KIyr5`+p$1vIB<={9wIqsgJ>iwY#=Dh7;n4$tgO>Ugbk|~S zKq%2}v=)uXhD>@PowFT)o7WG>78K~rDgiPBh%~cdJ!h4Uuq*bv)`^vtzXZvhr?>tI z$NGjJIlGUX3Z;xB_+aNYK|l@dXQ0k#f>ny-^|_h~M=YMlSzu;hl2Q5P#f<$oQ2~^D6&0GN1@w^A)zSW*NHejuGIlyx#bKbU zbzIblA{RCHo&l5O{xe6i$^H-)q;1E30-6T+)+Pi29}yV>6Iv9Q7corRf4@ehZbRl* z_oVXYC=q7E47`6dSs?vG0Gvs&HX4hs*0@|S{(*2FAi~XMpTzq=4S<11k&6PNl`uJt zz!Nn`&~w=aRJu+T0Bi!y6IwOgS&RyysIcW_8Z0TLVpj{q4F%KL?@cOPwvRYO6;4QT zVx~q@Ac^N(ik}dPs-I*Q+az@g4C1;|LTW9(Y?MZZv@0|=iRls#hp{+*cCT{J+mVHpQ|={O zjLUf6>&VB+#qiDWw01}7xf@xV@=2lEefuNPaHGzq-Oh&S?D#u#h7I-peP!FO?T3W5 z9S35UDU!Pn#PhqfDQw*+P5VB6G}{s%4dveiF3rp2iq@JZ?ZmTG4`e<;=@7h=km1q63%E#x%p zwZ1i=^6i$DJ}D@7X2oh#nvd}nA95J_&!##r5P9;M&fNnCj#8-dQ3?h7A0$YYE7|x97+C*}Sc9fB%&lORu`+~UJ3 zN3FgmVfW2vT`jxV%NHzydn~p+g_}QzH^!X)qdTSe#B|2SgJ~(yu+NBMRfyJFZCD9} zc;17D-r3HlN(6JfDrYnA3(q>7FZ_0iRg zeH#IY&5`5h9@|5IL^F*ImlzXV_Dh%F{;G~@GmoG>ZV%Z`)Ffo6xAAMMvm*BSaPVmowj447`>mRK zPv+p06y(->qXqaICym!mUn?5k63f!f;TFj64@pu!J3O*l^m;J{;4 zKe^WDJMtp*aH*S}^hB~DDI?Q>E#CiH(%&P{*%dP#TWW+UPqwJg{6=^PzyYbIN zE)t#OD-AA`5U)3_K)G_eS|x0CZgS$csqYQ>`pj*V&rz@r^K~k4CKnY44q+PDDgCnr z+vFowlsq;0yS#U0#yDYlet}Ds$7{Ye;^OCXi(Ebnj~u3xUuiu|?Y)-sX@@tI1eXOt zp)ekT9$(-Q0?X;=6^}g5r3zLLCx6o}3Y2-f)~WhIiJ-l=B=Yw!(}P2KZ}T096P&g( zd@%#$owR~Aqo9r1>zw-vwlu?i)3TS^BB5O^kLJ_=uDp9?HSf$9X`x#IJ+OYR{g+1r ziDnh{<^#KpctaYLJEpO>t{Yj!n9nD%&b)6U7BlyoGts_317q3iJVC}G%J(C|H!l?; zlE4;?l*!1}X%E=-%rw-6rI6SC``pMl-Tw8iBeC#Xb!lJX>A7QeZMR4!ntR^bpsz_3 z*|pvFY|k|~W&2j}ncR;aO{?wOdpa&U>e!8|LJo?9jY7I4%VI9kVfMvbC_CLo=N)32 zqs6*Ys$Gq6%$z%Xp{Wuu9M)Nfucdh&yCpf6vi!+4d8<{}4qoP3iZWy@MBJZObcn#a zm-e>Za9f|)(SEBFn`03&xXJ0+y-sQvxJzEGW$rWktRk_z*qGvI!$(viZcay4_qj{@ zQsl0Qrt6GjKH9brvWziwv+;%n*?lPIBuskWY4-$PR{QzH(Aop;xV|6AAk8nrI-A~^ zJ{q?xrcG(tvoWU3MLj*mQ`=fD*owFu`EL|moRHrt=3>|=YA;&~i`n&G+%ThwV{*Lu zye1?y^~ZHz(mj>wI)mGF_(1C6CsVP*=&Iw$!12s&ds=V$ zHZ9lrz-mQ`s=ju3)+7A>!DLFGzGa?dwka+$5K{dmTKrhiqAs<*agjb*BS+yhyqD^^ z=oU19mScFEMA8pLYxck5AF8Bcy(Y`$81tU+X-54*iFxpCI5z?5w!<-^r6T zC-yZ|zv2k<)w;7IL=`qWu21*{MIHD_dv)M+?AA}F3BN|kAyZBZ0W+}tMzwXy4Xsg|aGhak^BK^!wN@ zmVHBapqAN)=fp*C!^Nif#KXCX_aS#xEr0tF~8n zo(6$C0Gl&JmJ9TmfD>^|5)II0d`WPoo0(ygB~&fI1@b?5R3eqqA&#o-PN_)eNIhu# zUB_g8`$U#d0Y{*yGkG{Q^EoaC23+xE;Ddou%R|?>2zDnIy20L(J%q;;+>RXA#%s%>`WrO-B%s0G-AtV*_`M2X8b8UUgo zuAK@`8MfBTRuiYNK=$iVnN)jaGCc{a*@}~W)e5#z;~(Ln4xo-x7)ZqYRV`xke9wI=o11}8}J*M8^9r#Eh2rF7Lt;%mK_90 zXD|t*G&nE6k;6EXW%N3hk) zBJr`+g9=u^MgdX)lzF&pun>zlG%gIPJ+gojZcB8Y;lp+PZGSyONPQtFfrVvKwq$|} ziiA_J3Q0%!#=5Z4;Jc%eC@|IC6bK)8Mk+1>ZbawTjXJFK5LI0DgA;=N$%YYmh9T7g zE(lgAm5wg?fV{p8mJOX;B)ZH+1j4RYLZi?EOEBgoMinARr8I_<6J}0TGd;)3uqb)J zUyz4Ym)bT!mL16F4#4G<|A<~COg1ucL0Vn*V>d@xeB)AtfI2q6qZZZxnrZ0pD{1@& zO39Q!JqnQ1a;cQ|f4Bg#apomgltiZnQ`(Uv(>X>?DI;rwaSKfgXGU>ZyNjG`!3e{Y zi6#4=jprI7KxqgNq9<5jej<@JxEF;bNdjLkV?|B zD>G%Qv(%QCB`i@+FS_EsAcQbarGka8djp9gQJ4|1;)+Val>ww4BkVh9U|LYYKs7d6 z%kCyYd2E`#$fs=hBeev9dg2)d0SwgGdb}Nt3cN%_%1EnaF8a%r*?=?cJYph1=_`WQ z4!i?8mYU#XvlR-PJX=PPv}Oe8{5OhJ2OH%><6?Fb$@Vk?AzBlJY9mjBv9SRFQxFw} z0O0^{8q0=v-Umf{tAtZrdi@^Ij1}}~l!zAL^LtUmHZDak35AeK$!5XGl7Do$O6M$s z(#@A_Y|0=#G73`sl#Pl4HPJRvAUR1o#eXMjX1MxCjSRDkh`Zm1GYy9n30Jz z2<)V}$VH5xq!a_xEm48#=|AQAq{<<_-nZiC5azq*4x1$=nb`NA(-Gao9rG)`Ec z`d?;*u@EC2L^YE-|JHY}ru;1*YpOn(uVBDy?WIe1roHM%0{;89>WCRcL7z<>(jbW( z(7iBhV_m!F`E@xXKNpn~)sOlbUgu2_eOsE$4)kt=5SE>vKDqh^vui&TN8XvZW6~8Z z79wpdBU<-&Yxv1Fg_X#;iS@HMVurj15Qmayi-i30y_$FLi3c4k<4?#}wpE-d&|{n6W_sOH@0@S!_L zcDqPUu8C0I{&)0kq@?eN75&Zx71u3Dw%cW6rZKUP0f!5pRwFX`QEEj74E3C|OVUjGxEg^x zz|D%pAJ}h(XF1iI7=sQ-NELo9ndX@>(7*ewHTbuaVm$t-CdY^A0{>(Qr>$5)^O*-;{W$8ef zLk2008a!h3wcifN74AQhv~r-&(PU4;zK@&0d~#0_KNoF{u3~J+^ABGA5Fl&O%%PE? z3KZQ;K~XjCc2%5uUT$q#y70zz71!}R<;160NS)*QT=TYdxVht#%o(4 z+0Q?*^CfjuSh_LEL4Mf>4n4XW{UvMKI4ZtUBe#Eh`7kwU9uRq_<&(`|pa#~a}-1M0!q2e#jwa;x4K z=wPO2(pB%mZsg>|+<9S`iLG0sB znTK(VW(DOlc<(QYA;*nPEl;Mf+`^vwC@0coU&&?O4`9t8I_u~;CZj7sW&19v9uoe1 zQ)5wcv`n{{^X^#0O!=#U6Ahi{^pOTpTf4;y5mo!w_w;3db=3U)MSU0Z^Z<4I$Y?4( zv@lXRT>8(4QQ<7(qxxB@-!4{ed$~dDK$&M1H*CL?^}_U)LsZYYT&cIdB5GVl3m zTr{N%{9N`nzIc(bdYni6Njq^UqoUB5eSN2u-J+#M(*EX~cQsy$h*!&=)3GXWoAEA- z7u{<895$&MKBiuBN9F)O#*p*&D!a>f(%PO;oa}O}WpZ!L6TJRnKP5K~=T%iF6BOm& z`!1ris2pehVM}2BgnH@sJ3cYiZQj#I&KWblpIOT}hDeO_={>`7$8(EIRXtSgV} zr|rv+oFY=zMm#5fAGO51$U3LT^Kff!uW)}jBCPM`Y5GLf;iuNvOS5X7b0Rpa6fdss zt;^%@%FK!m(G6-o$s}C%n-*RuFuNi1=I&}zuyPi%X=UXgD{DkM)<;27UHM|w0WH@2 z0@LOP6~O|<>@4)_I>o>#d2>Ym#vNAGWyin|w8H%f0?h-D5?mK<)#WJTU+dEN0@yU~%0|_@Zw0lKZ#%!f zoKh#=di2ie+pa6=t%!ynduI-u&%9fGO{?#!#sEBn zTyq@mj%f^bPrdPV0!Jw%@|tP$HP=(KXDF`vuPIi`tSYZ^*!d%!m}2G&iytR_#x%z{ zR5~MPy>ssN8Aikwy4~2vhWjS9hy8U^JYzyp&CNC{zv3#5^q1G(KOHy|R%2pm7qiDr zV&5G9Cq_^@veH$VCwbZkqC%@@!pXFi^To+o$U&dSC%VE!oOiApdj=Dw_v zCvL8$v>hi@6RA%_WDXF!aIAztZs^S)bpAKL`Yu^{r$=wUl2z-6b1~`tnz+sEdj)}v zDS1TL;+JaVy{7nT%1o4rjjeIWwu=Mj)C4*fI6|1@E-uPSR8&@HSD^@6Cl@$xz<<1ABcOA^ zuY0y@sFiy}`1Q2dGS++uVi0ecnvNj1ylEr8%g zW?imANc}2*1_6&|H9&cfGBLp28X)-}Ex_zd7=Q>Scx6W6CBYQL1_86<3EaTYRtoEL zly!JI=xjh6T*`6m5K8@A5#ESz<%y5N04f>}UIue?4zL87P^!ud6&}YM5S0=-jp@pk z#C{?RYO>jRa<*+Bqs!RLWpHrr0h^_*36KrH1KLIb#rj$lI6pFAL>e?*(Mr|^!=fz*gw`Vj+|K zLSM4Yrl+zD(^krXfd%nN6hA>)vrY3iA;4&{EI=n5iXW*$kY5voa6qetPC)Xvd(eDq zs;J_#NxqVrRh0BVriv~X%(vB4I`|$^LljB!Oo;>Zu28;qG}Tdr#hLfpiroWUh&L13K!PJis?>=#vq@al zu;-{NosbwX*VZvR{=A1N@q{W+5RQvdjkdw<-r9g_e%(=@6$q>x2>aAt9#L}gGZ3Nn z5w@f=w&bJBgaCv@Bs&7d1KTk_2G=SZE3)}CfNU}I^av4*G<`-u1{}5I*4-vOorCI8 zb8D*#yN_6beUa*Met>s!duO z$l`2>k>0#gu*n6!^aMN&OIc4G```uVe9S|r&BmYxa8YEy4N_dpHx3( z#O*!f0nYKwEroUZhGXLi&muh@##YtjY^X|1c7L`0lo^LCp7X@NwTp`W-KTq~)Bf{Z z-{za{!wMfxdCRj768CR23@l(8IpY5KfbYk?qbWpkiA&X+! zKQ}NDPTq;{9*oHjedXOXKF*nSnDRZjz;-$C?LVY^q{XE8x!Ef(p&$+Z<{bUs?>BH_`!hw^tGgp3*2 zY2Lt(8(&G7WNMZ#MZX%7pDa36tAiBt$;+&$X;073h~qh1v3Rj}jwVjxc_*ss68a=x z_Y?DKc9qB#Y`cV%z5etX3ue#X>RhZPYy0YtUe9CEMmnB2qElwCuPq#ES@7N_!c2ru?us*4{P-tV@mSE{90qp!!;yQR6t7AVznyg=-# z;=svheB`g9^JHt?w5%82BF_%msV^^4yp1+26HDS0pAc(XSa72luet1}MB}plwaz`w zmv>mKEXHZ$&2SyJCAyOASR!3QJeQzv_pY3ozs?M{Q7NlbH1IxPL!jNf7Eq`7?~{wy zLo2hMnS&kpBo;8{;%z>3QgNnTG+PW8r|No4-Zl4(1D4;foUVxc-XN<%>1oS&hx?lS z(qJK)c>L^Nd2O>#%LjT(olt2XZ#NRAC{bgVgS zhqR+_H8tti!B5b#uIw12ot}MJkC0_OUs~~PVU%7CJEP=$Ju6ERnO|7$a4AoC$JZ@4 z&DFd`@NvVs1o6Rlm2t;vyO0B#4sZSgfn@)xp4-9g6{{j!U@8Gw3g)jrk>d>933qe5 zG3h4kWNQ=ZpuP36(4&gDJBlG)5|YkgWwI|n5D)A(kba<(3m17GUwt*!#6f)jC2u?I zmo?7M{-q@k!t*VhH+Bj|&09n=6%ie-OsBcqCVi_JLpo5(zpHfP^aFkdKC+e%OE|mU zdH%Knw<+(s<511&UMV_|nnRdK;qVnf%iEdPeZa2MBR%=Dv8VFZ>m1OTqDifoL_aKt zy;*ka!n>c2UiAA(og%Qz#A3gnUZM(S-GfB$73;S~r!Zsx2Tj!3MX)~^6s{bt{hq?S z+C1VMiOU>%chCQ{PIO7`jmN#BTK;vjmL_M!uiF=?nWvUUqJPfb#nE-c9cyHT>a4zt z?h1XB(xs^y9+KT|Ub?MfhQGzAWYuhD{d!Kj&?Wh;DMOz<_V{JzVv@z^7pHCCjb054uk%cM$`-Iub6QQY1-)jK{zKU@fFEiu1SgZP)-@Q| zvE6%obdgP&*HddOQ<9x*(JrSNXj;attJm2}NxT@XcF!UNJ7w(oQ@L7R5F_GKtkgdB z|856}j6_zK_v9VOYS{K)>A~*@AG2E|o=KAjrFw3?_J19)=ekW#YHX5sKdyK+IBy`} zxfPu$6ds{q)T$bA*%(WgadyL-cPTb_?TL9gQHN@{QP|A%nvWg5lPVV8KfmLgbQQl? zerGNh$awD_aao9Ie|&IcVR+bN;DcMN-$%Rgq?@i{F8fqO?JM7glUZ7ju3b5h7UhZW zGT7b`^rGIO(BrlPrhxh)OiBLp%F4fgQJBficb*%)6>(3Vz003oF+XbGE6+{Kg2Z{b zLEm{VoRplxalsNX&j)_j8~WMbbBcLqJ9k`VBF3RkVbDzG z8FrVuztjAKN%{oh;%iRboS4a^TI>7K=U+Z_P`r0=bp6ZklmI)T_kz|oTZ3bP(A?LB zB;)+4%i+k#_}%*-3bt$A8|w+&ugUn*Z3e(k&uHi?XGe;6!S6nclV6*v#d`_C3@&;t zn(tajA2c6P{16o%J8M||KS**TG{@~i=1Y0YC`bKIu306U`Rr}^>?3tUy2Y-0?v;Ou zt#Gx>(>(S&Cgbfsesb^_SlU!u=3UJ-i@5w4H+@a;yEliXDq%4(_6ggpH14R-l0|sRB>Y^60FH2y{<7pnY~Ep9+h^*{%S48=H!8=%4IYWS|$BZ2=H_m2*ktGzjFq97*CCf#MKT(ocwB_KnMa z4C-1i5~KtZVPEzGr+EA*tP?;FUnTH3I;YAp#b-pR5yNh#*W{PfrrpTK73}Hiu&#lQ>E^<#)x76VF8sfIk7%Ul09eK;OW=K?R(Kk>gEDoqtK4 zb`wkhxXTs|ur%9&Lo(02*UB3fCs9|QR|D2a2FU*H>0F*J8pOm9+Cb)E0CNIUN(RKT zLiJ@kAsjFyUrwNtC3k2j>>!)bG0=ni0svYAhi9Q8{t=5ajJE685z-(=Ovwc;fg%!> zs~J*Lny*|#Gzf<_r6(}~4$i7f1hwo`c(@+s)BZXIMDIG!o)8i49K}uvC>x+8 zX9G|yJ1YS*u9L)q{s&ok!g@k$Fc_nGPz{p?%U6{(GAPMS9Zo=!vb|v-4T#7%R8mdN zFkd30@RW=OF*KZDXE%W5FWX^L9wr3ZMo%*Xm5^u>PT9sTV+`C)aEn2Hv63vOff%g? zc}xa`U=d)k(*-a`jZ}D9u=w9Ne7*`@&enFTvk-Q+KpAXTQn$Anr>Gul9rs(I?sFv1ffM!6@t?`3^U^eI!cq=OM-N5(^n4u^jnhs~$IWgPkCQ@M(KoA^jgO;-mp|dS%QJecv zoihTX6|%@WFSS$9g;HlOu5lqYc}oRxwARIAg4sls2h?x6azzVE7`)ykq55G@XWX}%Bd}jB zzCva8q9RLViTNPVK@)ZwsDp`+AW+l;54UCcoMJtYYRRQqogr)iwlguw!vGxz`1Gg| zH$AeXivX|A4Xho4+vXPvo@eYTWEv4&MUqs*GF<|BJZ1-^>`&-B}hM}LEA}CTXmLH{#8u2G?JrBVCz0h{h z%EE)?ovqkneqkzeeVv5Rv<|Bj6>`K3swO*jP{eU(Nis^= zU_vYDq`~5cOexZoN^nyk>~1AMIQ_0CdoV3Fs+lwgT@EpG2M%ZU3CM_Z&m@dC+lQ^v zX$~{OR-AZD$@SBcy>GIJVWtHymL}N)CxtMG&hOmNA)ixscKXD;o}z?SI2x=@0!W%EY$cy*!G87O*s{YDfucl{4p1v=o#P>-J0(f1_@?>dPC&c z?CEz}H_^1%(OQWMds}{?zn!hCdpUg9pM%-&EVo}m((X+ao zGFAIB;=;80v$vn$6+PQXm2JY-| z)mx*5SA-YRYMs8@3g`B_gikg3f0pb}g_Y5q^9Ys}%t}`&D9_#8mzMP;Bz_DtfOmr_51 z%UP74j_?mc$0IjJRbo^IY4rYgL&f=kTs{O(fXd3lkR`q;x>>s|{j zhP#4~N*KTS^jdY_?PkO7qKHK_cSu{?efR1o)k9ZYHOws-1Ve=Z#kH6UuyWJeVVPwWf0Y zL%`QvF?85?Q69PDVp0w9s!rj_pW^r8A4?hQMi`%ny0^#0p)0Lxw({bhmp6-@w$bT? z{U#iA^wR$3TW&9p`X11-iKP6zsp}+8iG6(_^Pu~*nH9}8;_+?woi6tc=SD)bjp8j& zH?SHHH=R6afuEMUoutv!zeC2}ziGRD@*it`JG=&7XIM=``^+k&F!c0)*`+7n4sxW!{aNBeq_3O7DU&sGu~fS zJw>i8Z_CYBY-V1m_T!Y=E_&Q@ahh48z!B z4#`+$4mB1=4l{=&xt(HEa?GL9oDU(Vx{)+BLKH<&Dax_Ja!NWmOQIB=?&|xy`u*3V zN5Xt?y|4G{^?WjXuOzK6xki@JN$Ex}-R4sIi3_LC%CoKIbepF6Q)<;W5A$qspOf7R z^4h>ZtLMGg->aT9AskiF9JU%R(DOA&C>l;`8syr%ybZ-@3S~MT>YR!;VlU?v zr>EX-k@rr&nCe<;6dvI&Ypl7VQ8<74L=)QLCw4q@pnRbv{6HXcrRM<%~q1ph_aoPCVfe=6JbN?NO@m5aH-cFu>CG`>U-Dk*CWNv#hCjRR_ z`b0{%(p1yrt3-a{HV3JrDeBTKr?QN^ZPf&Rw?{5d?PR}lW}3OS@H=lc-}6^C7t`OdN%~;cS;M{?#I+6e@#>B!uQR8Q zUT@ZE1_|p<{aPx?HywE@O%bu{pYd%Lq4P(#&KcPkWOgDDyp^8|sd@?;zL0@2U~)I@ zwJ=0!WE5W^0743%95a`V@)H0aag%nQG)8FjI=8#aD9gVf z1@R)2Ah`VMkK&=_*vk052G!GSL0Y^cDI29qPw!)lkIb^qfa1#<};PF=XgJ2~~Y zKRBCPr$O!)$0@Eboy9k~f#Rc*uSo+C#e{)5) zp9M1DV^TkCB4BnX6UU+8zEV&| za23==EaS-tE2K0k%|=)O_lq@fN|pRJB>?jlaoT2T_R5<_53s!%7A6A1hqVE?Otb(B z2dp=I^h{D7G*|9lMsZ=mP$U`Lx|GDp8ngxbBM=0MNLRvjNN^`o7FuH83u+ zp8+FRo0Ysnf$@ZhEg`|AqRq*bUtj^l6)u6 zjKdk}7a&zZ11W(6k6i{^19K6lSiI?Bl9qvq;4t_)q?CVQYFHxv=Ew{|r7AUNLx3EB zkTZPc*MGZZ?Z`7ktON{(N2uiS0A-{X_b9|sOwZ9FtkziZ2gfD}}=p zCueYD0c>?zXr3ep3M02bRPbM*R88F>KG#>3$0ST~6}o%rs4h|v$a(@PcDcJmC)1PF zt3a0Ht2&BjCV(&=L8CgqTh#`mwhpO-Ckku`r^^BI^dqPiTId+6yeWkKCJnEEey7d= z1a@=K&zWSKlpi85BAX0PLP0x-A~pzX+IssZCp7^DGPq^{q|2XCj(m|09uGv!kja?1 zlpvruYP}W;vxY!Q5XSC?=rIC}1OO0kO~CA?M01*8)?q{b8==f)shDARRm9Eb)W6Y#wtzQm z0=f7q-q(@amS>F;Lz{^xW&%Mq1eUd1$IB=H4H+Xq-~Jl~=D;POZ~-L3TA}D-JoU30 zBuXM3p&YSMol3U8`PgujO~VOqceV1wA#NR@Kljv~6aL=lWGUgKHGGT(n&f z1PWtA|H%H)d9PUH94s`oRtrDqF=&lFW}f|Zbx*0%m9y0bc9iltkx`Rx)AZhoH)koC zgWd2oU4@&#C?P&5azogAueLX(oNy)RS_6(#tNqdjqY8|rq9`UJSxqByO z?B4#ZnWU!Vmrr#IuYL8eQPGd;^%}U(F{!$J`>yD4+1P=P_`Ywu<@x+iCo>Wb|Jycx zLhbwIt&h%2g_<4E*m`a2R|18CazHOHj}ni&T52RJ{9>$Oy7ycN`uX_tQ zV1FmHDeSkc7uR>t%&W0obdOcT^D4-EJ>lS2+|^lJu>PwC$%#H*s&Jm+qbQR0l2P71 zJp+&He3D#)@eU|r!P%9$1(Gz{bqP~qf(UuTtMXqNVUqVJyTSNsR9~UV_1p($;{Ia) zg91n@$yhzWN|M`pg&oxiCf8Tb& zF}J3{`Do+8JE_3Ks)0Wf30+4YulTSj{TFNHSTeVRjX_2_`jL6(ziuJ#+xqEFzD>e7 z@9=mwIohgT(1xs_rMPv6b=fnyPKgpKozsec* z)sNUz?36p`^dScSjJzsas_YwSOF6a-RC{{P&`|@=J_BLCt&1Z<@71eHn$6TICCgA+ zZCzCFkWV<%$J$C!CY;wb`Ml~gZ?eyj5YP_2kb0_P{&Md*zt*u!D%6#@gBDCovNelv zBZao*HZq1>V28?i**c22$G2rIIfRtnDNkA{vpz70-sv*ll5JeXSkAh10-ZZ{tI&ux zR27=@BI|_mXAOPnWEG0ST=p}in_6p<;30}O=hG_m0)xp$)3L2c8Ry&E>H2w2W+gVr^2=u2)M&wbcM zMQ1)XP)*kx=CEW=n-L#=6P+|xT#1zL9d9a@Dn31~+;wC3o;3XizF?|gnKKnKcx36{ zFHQNsC;lyr8q_6X2JM2c3NP|*-wMv}i8{B^YhTI?FA!3+tI)jU(Zhqe33 zl73B<>gQMdh@ySnp$DEmIe&c%>Yl^e*}3x1@mCcd{oXl$`9J-pOBXlJ7nct!Jg(fj zDP%t4{%(TA73j=A4enWO{vF=iZf=>oijO1smFMYtemLA6cgLqxMq|}Es=R2xF+KRr zd*_HlTVAoBH3#!JQH7z!%o|6obL-_CjWPd1GP|EJwu(k+{l@d8aArN|n8M2C`Z30UPg^5H8{ zb>}kcpUmGbQLu?>O&D=O_I-Ht>Xq>;W1FTq$k|8NOGp0kw5BcsNh~N2DtFmZ`fskD z>8pniw^^ol%q2};FCJ)WdJ=pR@!F1|a%XGkU2)mwoZBI^vw>%x=*nM{LdiJC@G_nr zxVDsUdyqc7xrFo9+x&LXTi-5%*sM#=8L#`U+aJeHmgxtX*t1k{PT|(xF6Bah=UV4b zk9{R#nO%V!+T$%Q#tViUr(|p?zJ571c5f2oJp_9S9=}g$=WfNDUqp0Cs@Okvc@K&$t{e=3t0Xg~#d2Y@_E~sD8 zFRP^7z$R2l=u#Pi1~{?ds+;?j$IsO-Ml70#>l$p@dYUE`=T;zSc57zXnwYnq-OWE{xs{M9sQC?#*^ppq#J#iw&LCg zvxe}7yAwUnpwh+PnTldz-nC~+cA+Wqdo+!5=QhF8Zu(@^Oc=PxU)SH~E_ z?B$++WUtAy(pCgxTjAZ}M+7<~sYlP-T_sijJ$?9Bz$e%JrXJ@Tx@E^mau3dx_TYBm z)_tb(9L*WCTjfITT+CUxS@GwE_>LW6Xiq-lXQa-XhX;QLPk*@c&qFh3RVgdX{!(|T z#-8bOzR@4)DpbpC<8oEyBBEj!0IQ;+Uj5h5-He*05Q zGGv9rEU3PEa^A<(&yv)f#D3)2+C$Nv{wKhB=0*+j>_6xD${E^9%Z@N3YPh8mxw0}V zr%*e$@ex5t+fj@OS>V&@jy9`r=COOXs5!-%;Ef7a6LHVeW_q!O{#<_2a<`b$xc&nw z1NoowCEH$uFXgUq?!+R9rR|O=58}6JiWJqrAq~|%XaUMpa>mKVKSZ8WabO=sV@l@p zs9~0KII2cAt$Y!WjbkvnQ8-m6o*V^<`z6}k`eALHj}12l(owPr(OqID<&DsQ+Ixjg z%idW`!l!`Lof0DNQj)jpw=|Td<;T;Z8!ix+5plx4(&ZS5 z&3H39bg2e~`64KgV$&>ldBJcU9ScCH{F?^`G_;BOINxgSZxRyDXD0mSsStNI!{I1| zzkD|*CGXd0vii&HN)RH&ZID0}4hCt~SS@OULr^(K3(*8-yC|k1G0G8+pUY;kY~ria zyOlO7nNCiLM8AUvv?@I2qv~rN=i5` z;XJ?_Y mfcoQy2>~S6D-KKCZf^z#7tq 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 @%!js`i-KJ^|>tvWIU^}HI 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%0A#} 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